/ Hex Artifact Content
Login

Artifact b67dd34bf1ae796851910a229bd94026b42d942f:


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 6e 63 6c  liteInt.h".#incl
01d0: 75 64 65 20 22 6f 73 2e 68 22 0a 23 69 66 20 4f  ude "os.h".#if O
01e0: 53 5f 57 49 4e 20 20 20 20 20 20 20 20 20 20 20  S_WIN           
01f0: 20 20 20 20 2f 2a 20 54 68 69 73 20 66 69 6c 65      /* This file
0200: 20 69 73 20 75 73 65 64 20 66 6f 72 20 77 69 6e   is used for win
0210: 64 6f 77 73 20 6f 6e 6c 79 20 2a 2f 0a 0a 23 69  dows only */..#i
0220: 6e 63 6c 75 64 65 20 3c 77 69 6e 62 61 73 65 2e  nclude <winbase.
0230: 68 3e 0a 0a 23 69 66 64 65 66 20 5f 5f 43 59 47  h>..#ifdef __CYG
0240: 57 49 4e 5f 5f 0a 23 20 69 6e 63 6c 75 64 65 20  WIN__.# include 
0250: 3c 73 79 73 2f 63 79 67 77 69 6e 2e 68 3e 0a 23  <sys/cygwin.h>.#
0260: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 63  endif../*.** Mac
0270: 72 6f 73 20 75 73 65 64 20 74 6f 20 64 65 74 65  ros used to dete
0280: 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72  rmine whether or
0290: 20 6e 6f 74 20 74 6f 20 75 73 65 20 74 68 72 65   not to use thre
02a0: 61 64 73 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69  ads..*/.#if defi
02b0: 6e 65 64 28 54 48 52 45 41 44 53 41 46 45 29 20  ned(THREADSAFE) 
02c0: 26 26 20 54 48 52 45 41 44 53 41 46 45 0a 23 20  && THREADSAFE.# 
02d0: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 33  define SQLITE_W3
02e0: 32 5f 54 48 52 45 41 44 53 20 31 0a 23 65 6e 64  2_THREADS 1.#end
02f0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 6c 75 64  if../*.** Includ
0300: 65 20 63 6f 64 65 20 74 68 61 74 20 69 73 20 63  e code that is c
0310: 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6f 73 5f  ommon to all os_
0320: 2a 2e 63 20 66 69 6c 65 73 0a 2a 2f 0a 23 69 6e  *.c files.*/.#in
0330: 63 6c 75 64 65 20 22 6f 73 5f 63 6f 6d 6d 6f 6e  clude "os_common
0340: 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72  .h"../*.** Deter
0350: 6d 69 6e 65 20 69 66 20 77 65 20 61 72 65 20 64  mine if we are d
0360: 65 61 6c 69 6e 67 20 77 69 74 68 20 57 69 6e 64  ealing with Wind
0370: 6f 77 73 43 45 20 2d 20 77 68 69 63 68 20 68 61  owsCE - which ha
0380: 73 20 61 20 6d 75 63 68 0a 2a 2a 20 72 65 64 75  s a much.** redu
0390: 63 65 64 20 41 50 49 2e 0a 2a 2f 0a 23 69 66 20  ced API..*/.#if 
03a0: 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 5f 57  defined(_WIN32_W
03b0: 43 45 29 0a 23 20 64 65 66 69 6e 65 20 4f 53 5f  CE).# define OS_
03c0: 57 49 4e 43 45 20 31 0a 23 65 6c 73 65 0a 23 20  WINCE 1.#else.# 
03d0: 64 65 66 69 6e 65 20 4f 53 5f 57 49 4e 43 45 20  define OS_WINCE 
03e0: 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  0.#endif../*.** 
03f0: 54 68 65 20 77 69 6e 46 69 6c 65 20 73 74 72 75  The winFile stru
0400: 63 74 75 72 65 20 69 73 20 61 20 73 75 62 63 6c  cture is a subcl
0410: 61 73 73 20 6f 66 20 4f 73 46 69 6c 65 20 73 70  ass of OsFile sp
0420: 65 63 69 66 69 63 20 74 6f 20 74 68 65 20 77 69  ecific to the wi
0430: 6e 33 32 0a 2a 2a 20 70 6f 72 74 61 62 69 6c 69  n32.** portabili
0440: 74 79 20 6c 61 79 65 72 2e 0a 2a 2f 0a 74 79 70  ty layer..*/.typ
0450: 65 64 65 66 20 73 74 72 75 63 74 20 77 69 6e 46  edef struct winF
0460: 69 6c 65 20 77 69 6e 46 69 6c 65 3b 0a 73 74 72  ile winFile;.str
0470: 75 63 74 20 77 69 6e 46 69 6c 65 20 7b 0a 20 20  uct winFile {.  
0480: 49 6f 4d 65 74 68 6f 64 20 63 6f 6e 73 74 20 2a  IoMethod const *
0490: 70 4d 65 74 68 6f 64 3b 2f 2a 20 4d 75 73 74 20  pMethod;/* Must 
04a0: 62 65 20 66 69 72 73 74 20 2a 2f 0a 20 20 48 41  be first */.  HA
04b0: 4e 44 4c 45 20 68 3b 20 20 20 20 20 20 20 20 20  NDLE h;         
04c0: 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20        /* Handle 
04d0: 66 6f 72 20 61 63 63 65 73 73 69 6e 67 20 74 68  for accessing th
04e0: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 73 69  e file */.  unsi
04f0: 67 6e 65 64 20 63 68 61 72 20 6c 6f 63 6b 74 79  gned char lockty
0500: 70 65 3b 20 2f 2a 20 54 79 70 65 20 6f 66 20 6c  pe; /* Type of l
0510: 6f 63 6b 20 63 75 72 72 65 6e 74 6c 79 20 68 65  ock currently he
0520: 6c 64 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 20  ld on this file 
0530: 2a 2f 0a 20 20 73 68 6f 72 74 20 73 68 61 72 65  */.  short share
0540: 64 4c 6f 63 6b 42 79 74 65 3b 20 20 20 2f 2a 20  dLockByte;   /* 
0550: 52 61 6e 64 6f 6d 6c 79 20 63 68 6f 73 65 6e 20  Randomly chosen 
0560: 62 79 74 65 20 75 73 65 64 20 61 73 20 61 20 73  byte used as a s
0570: 68 61 72 65 64 20 6c 6f 63 6b 20 2a 2f 0a 23 69  hared lock */.#i
0580: 66 20 4f 53 5f 57 49 4e 43 45 0a 20 20 57 43 48  f OS_WINCE.  WCH
0590: 41 52 20 2a 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f  AR *zDeleteOnClo
05a0: 73 65 3b 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  se;   /* Name of
05b0: 20 66 69 6c 65 20 74 6f 20 64 65 6c 65 74 65 20   file to delete 
05c0: 77 68 65 6e 20 63 6c 6f 73 69 6e 67 20 2a 2f 0a  when closing */.
05d0: 23 65 6e 64 69 66 0a 7d 3b 0a 0a 0a 2f 2a 0a 2a  #endif.};.../*.*
05e0: 2a 20 44 6f 20 6e 6f 74 20 69 6e 63 6c 75 64 65  * Do not include
05f0: 20 61 6e 79 20 6f 66 20 74 68 65 20 46 69 6c 65   any of the File
0600: 20 49 2f 4f 20 69 6e 74 65 72 66 61 63 65 20 70   I/O interface p
0610: 72 6f 63 65 64 75 72 65 73 20 69 66 20 74 68 65  rocedures if the
0620: 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  .** SQLITE_OMIT_
0630: 44 49 53 4b 49 4f 20 6d 61 63 72 6f 20 69 73 20  DISKIO macro is 
0640: 64 65 66 69 6e 65 64 20 28 69 6e 64 69 63 61 74  defined (indicat
0650: 69 6e 67 20 74 68 61 74 20 74 68 65 72 65 20 64  ing that there d
0660: 61 74 61 62 61 73 65 0a 2a 2a 20 77 69 6c 6c 20  atabase.** will 
0670: 62 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 6f 6e 6c  be in-memory onl
0680: 79 29 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  y).*/.#ifndef SQ
0690: 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f  LITE_OMIT_DISKIO
06a0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
06b0: 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65 20 69  owing variable i
06c0: 73 20 28 6e 6f 72 6d 61 6c 6c 79 29 20 73 65 74  s (normally) set
06d0: 20 6f 6e 63 65 20 61 6e 64 20 6e 65 76 65 72 20   once and never 
06e0: 63 68 61 6e 67 65 73 0a 2a 2a 20 74 68 65 72 65  changes.** there
06f0: 61 66 74 65 72 2e 20 20 49 74 20 72 65 63 6f 72  after.  It recor
0700: 64 73 20 77 68 65 74 68 65 72 20 74 68 65 20 6f  ds whether the o
0710: 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
0720: 69 73 20 57 69 6e 39 35 0a 2a 2a 20 6f 72 20 57  is Win95.** or W
0730: 69 6e 4e 54 2e 0a 2a 2a 0a 2a 2a 20 30 3a 20 20  inNT..**.** 0:  
0740: 20 4f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   Operating syste
0750: 6d 20 75 6e 6b 6e 6f 77 6e 2e 0a 2a 2a 20 31 3a  m unknown..** 1:
0760: 20 20 20 4f 70 65 72 61 74 69 6e 67 20 73 79 73     Operating sys
0770: 74 65 6d 20 69 73 20 57 69 6e 39 35 2e 0a 2a 2a  tem is Win95..**
0780: 20 32 3a 20 20 20 4f 70 65 72 61 74 69 6e 67 20   2:   Operating 
0790: 73 79 73 74 65 6d 20 69 73 20 57 69 6e 4e 54 2e  system is WinNT.
07a0: 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 72 64 65 72 20  .**.** In order 
07b0: 74 6f 20 66 61 63 69 6c 69 74 61 74 65 20 74 65  to facilitate te
07c0: 73 74 69 6e 67 20 6f 6e 20 61 20 57 69 6e 4e 54  sting on a WinNT
07d0: 20 73 79 73 74 65 6d 2c 20 74 68 65 20 74 65 73   system, the tes
07e0: 74 20 66 69 78 74 75 72 65 0a 2a 2a 20 63 61 6e  t fixture.** can
07f0: 20 6d 61 6e 75 61 6c 6c 79 20 73 65 74 20 74 68   manually set th
0800: 69 73 20 76 61 6c 75 65 20 74 6f 20 31 20 74 6f  is value to 1 to
0810: 20 65 6d 75 6c 61 74 65 20 57 69 6e 39 38 20 62   emulate Win98 b
0820: 65 68 61 76 69 6f 72 2e 0a 2a 2f 0a 69 6e 74 20  ehavior..*/.int 
0830: 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 20  sqlite3_os_type 
0840: 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  = 0;../*.** Retu
0850: 72 6e 20 74 72 75 65 20 28 6e 6f 6e 2d 7a 65 72  rn true (non-zer
0860: 6f 29 20 69 66 20 77 65 20 61 72 65 20 72 75 6e  o) if we are run
0870: 6e 69 6e 67 20 75 6e 64 65 72 20 57 69 6e 4e 54  ning under WinNT
0880: 2c 20 57 69 6e 32 4b 2c 20 57 69 6e 58 50 2c 0a  , Win2K, WinXP,.
0890: 2a 2a 20 6f 72 20 57 69 6e 43 45 2e 20 20 52 65  ** or WinCE.  Re
08a0: 74 75 72 6e 20 66 61 6c 73 65 20 28 7a 65 72 6f  turn false (zero
08b0: 29 20 66 6f 72 20 57 69 6e 39 35 2c 20 57 69 6e  ) for Win95, Win
08c0: 39 38 2c 20 6f 72 20 57 69 6e 4d 45 2e 0a 2a 2a  98, or WinME..**
08d0: 0a 2a 2a 20 48 65 72 65 20 69 73 20 61 6e 20 69  .** Here is an i
08e0: 6e 74 65 72 65 73 74 69 6e 67 20 6f 62 73 65 72  nteresting obser
08f0: 76 61 74 69 6f 6e 3a 20 20 57 69 6e 39 35 2c 20  vation:  Win95, 
0900: 57 69 6e 39 38 2c 20 61 6e 64 20 57 69 6e 4d 45  Win98, and WinME
0910: 20 6c 61 63 6b 0a 2a 2a 20 74 68 65 20 4c 6f 63   lack.** the Loc
0920: 6b 46 69 6c 65 45 78 28 29 20 41 50 49 2e 20 20  kFileEx() API.  
0930: 42 75 74 20 77 65 20 63 61 6e 20 73 74 69 6c 6c  But we can still
0940: 20 73 74 61 74 69 63 61 6c 6c 79 20 6c 69 6e 6b   statically link
0950: 20 61 67 61 69 6e 73 74 20 74 68 61 74 0a 2a 2a   against that.**
0960: 20 41 50 49 20 61 73 20 6c 6f 6e 67 20 61 73 20   API as long as 
0970: 77 65 20 64 6f 6e 27 74 20 63 61 6c 6c 20 69 74  we don't call it
0980: 20 77 69 6e 20 72 75 6e 6e 69 6e 67 20 57 69 6e   win running Win
0990: 39 35 2f 39 38 2f 4d 45 2e 20 20 41 20 63 61 6c  95/98/ME.  A cal
09a0: 6c 20 74 6f 0a 2a 2a 20 74 68 69 73 20 72 6f 75  l to.** this rou
09b0: 74 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20  tine is used to 
09c0: 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68 65  determine if the
09d0: 20 68 6f 73 74 20 69 73 20 57 69 6e 39 35 2f 39   host is Win95/9
09e0: 38 2f 4d 45 20 6f 72 0a 2a 2a 20 57 69 6e 4e 54  8/ME or.** WinNT
09f0: 2f 32 4b 2f 58 50 20 73 6f 20 74 68 61 74 20 77  /2K/XP so that w
0a00: 65 20 77 69 6c 6c 20 6b 6e 6f 77 20 77 68 65 74  e will know whet
0a10: 68 65 72 20 6f 72 20 6e 6f 74 20 77 65 20 63 61  her or not we ca
0a20: 6e 20 73 61 66 65 6c 79 20 63 61 6c 6c 0a 2a 2a  n safely call.**
0a30: 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 45 78 28   the LockFileEx(
0a40: 29 20 41 50 49 2e 0a 2a 2f 0a 23 69 66 20 4f 53  ) API..*/.#if OS
0a50: 5f 57 49 4e 43 45 0a 23 20 64 65 66 69 6e 65 20  _WINCE.# define 
0a60: 69 73 4e 54 28 29 20 20 28 31 29 0a 23 65 6c 73  isNT()  (1).#els
0a70: 65 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 69  e.  static int i
0a80: 73 4e 54 28 76 6f 69 64 29 7b 0a 20 20 20 20 69  sNT(void){.    i
0a90: 66 28 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79  f( sqlite3_os_ty
0aa0: 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 4f  pe==0 ){.      O
0ab0: 53 56 45 52 53 49 4f 4e 49 4e 46 4f 20 73 49 6e  SVERSIONINFO sIn
0ac0: 66 6f 3b 0a 20 20 20 20 20 20 73 49 6e 66 6f 2e  fo;.      sInfo.
0ad0: 64 77 4f 53 56 65 72 73 69 6f 6e 49 6e 66 6f 53  dwOSVersionInfoS
0ae0: 69 7a 65 20 3d 20 73 69 7a 65 6f 66 28 73 49 6e  ize = sizeof(sIn
0af0: 66 6f 29 3b 0a 20 20 20 20 20 20 47 65 74 56 65  fo);.      GetVe
0b00: 72 73 69 6f 6e 45 78 28 26 73 49 6e 66 6f 29 3b  rsionEx(&sInfo);
0b10: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6f  .      sqlite3_o
0b20: 73 5f 74 79 70 65 20 3d 20 73 49 6e 66 6f 2e 64  s_type = sInfo.d
0b30: 77 50 6c 61 74 66 6f 72 6d 49 64 3d 3d 56 45 52  wPlatformId==VER
0b40: 5f 50 4c 41 54 46 4f 52 4d 5f 57 49 4e 33 32 5f  _PLATFORM_WIN32_
0b50: 4e 54 20 3f 20 32 20 3a 20 31 3b 0a 20 20 20 20  NT ? 2 : 1;.    
0b60: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c  }.    return sql
0b70: 69 74 65 33 5f 6f 73 5f 74 79 70 65 3d 3d 32 3b  ite3_os_type==2;
0b80: 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4f  .  }.#endif /* O
0b90: 53 5f 57 49 4e 43 45 20 2a 2f 0a 0a 23 69 66 20  S_WINCE */..#if 
0ba0: 4f 53 5f 57 49 4e 43 45 0a 2f 2a 0a 2a 2a 20 57  OS_WINCE./*.** W
0bb0: 69 6e 64 6f 77 73 43 45 20 64 6f 65 73 20 6e 6f  indowsCE does no
0bc0: 74 20 68 61 76 65 20 61 20 6c 6f 63 61 6c 74 69  t have a localti
0bd0: 6d 65 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 20  me() function.  
0be0: 53 6f 20 63 72 65 61 74 65 20 61 0a 2a 2a 20 73  So create a.** s
0bf0: 75 62 73 74 69 74 75 74 65 2e 0a 2a 2f 0a 23 69  ubstitute..*/.#i
0c00: 6e 63 6c 75 64 65 20 3c 74 69 6d 65 2e 68 3e 0a  nclude <time.h>.
0c10: 73 74 72 75 63 74 20 74 6d 20 2a 5f 5f 63 64 65  struct tm *__cde
0c20: 63 6c 20 6c 6f 63 61 6c 74 69 6d 65 28 63 6f 6e  cl localtime(con
0c30: 73 74 20 74 69 6d 65 5f 74 20 2a 74 29 0a 7b 0a  st time_t *t).{.
0c40: 20 20 73 74 61 74 69 63 20 73 74 72 75 63 74 20    static struct 
0c50: 74 6d 20 79 3b 0a 20 20 46 49 4c 45 54 49 4d 45  tm y;.  FILETIME
0c60: 20 75 54 6d 2c 20 6c 54 6d 3b 0a 20 20 53 59 53   uTm, lTm;.  SYS
0c70: 54 45 4d 54 49 4d 45 20 70 54 6d 3b 0a 20 20 69  TEMTIME pTm;.  i
0c80: 36 34 20 74 36 34 3b 0a 20 20 74 36 34 20 3d 20  64 t64;.  t64 = 
0c90: 2a 74 3b 0a 20 20 74 36 34 20 3d 20 28 74 36 34  *t;.  t64 = (t64
0ca0: 20 2b 20 31 31 36 34 34 34 37 33 36 30 30 29 2a   + 11644473600)*
0cb0: 31 30 30 30 30 30 30 30 3b 0a 20 20 75 54 6d 2e  10000000;.  uTm.
0cc0: 64 77 4c 6f 77 44 61 74 65 54 69 6d 65 20 3d 20  dwLowDateTime = 
0cd0: 74 36 34 20 26 20 30 78 46 46 46 46 46 46 46 46  t64 & 0xFFFFFFFF
0ce0: 3b 0a 20 20 75 54 6d 2e 64 77 48 69 67 68 44 61  ;.  uTm.dwHighDa
0cf0: 74 65 54 69 6d 65 3d 20 74 36 34 20 3e 3e 20 33  teTime= t64 >> 3
0d00: 32 3b 0a 20 20 46 69 6c 65 54 69 6d 65 54 6f 4c  2;.  FileTimeToL
0d10: 6f 63 61 6c 46 69 6c 65 54 69 6d 65 28 26 75 54  ocalFileTime(&uT
0d20: 6d 2c 26 6c 54 6d 29 3b 0a 20 20 46 69 6c 65 54  m,&lTm);.  FileT
0d30: 69 6d 65 54 6f 53 79 73 74 65 6d 54 69 6d 65 28  imeToSystemTime(
0d40: 26 6c 54 6d 2c 26 70 54 6d 29 3b 0a 20 20 79 2e  &lTm,&pTm);.  y.
0d50: 74 6d 5f 79 65 61 72 20 3d 20 70 54 6d 2e 77 59  tm_year = pTm.wY
0d60: 65 61 72 20 2d 20 31 39 30 30 3b 0a 20 20 79 2e  ear - 1900;.  y.
0d70: 74 6d 5f 6d 6f 6e 20 3d 20 70 54 6d 2e 77 4d 6f  tm_mon = pTm.wMo
0d80: 6e 74 68 20 2d 20 31 3b 0a 20 20 79 2e 74 6d 5f  nth - 1;.  y.tm_
0d90: 77 64 61 79 20 3d 20 70 54 6d 2e 77 44 61 79 4f  wday = pTm.wDayO
0da0: 66 57 65 65 6b 3b 0a 20 20 79 2e 74 6d 5f 6d 64  fWeek;.  y.tm_md
0db0: 61 79 20 3d 20 70 54 6d 2e 77 44 61 79 3b 0a 20  ay = pTm.wDay;. 
0dc0: 20 79 2e 74 6d 5f 68 6f 75 72 20 3d 20 70 54 6d   y.tm_hour = pTm
0dd0: 2e 77 48 6f 75 72 3b 0a 20 20 79 2e 74 6d 5f 6d  .wHour;.  y.tm_m
0de0: 69 6e 20 3d 20 70 54 6d 2e 77 4d 69 6e 75 74 65  in = pTm.wMinute
0df0: 3b 0a 20 20 79 2e 74 6d 5f 73 65 63 20 3d 20 70  ;.  y.tm_sec = p
0e00: 54 6d 2e 77 53 65 63 6f 6e 64 3b 0a 20 20 72 65  Tm.wSecond;.  re
0e10: 74 75 72 6e 20 26 79 3b 0a 7d 0a 23 65 6e 64 69  turn &y;.}.#endi
0e20: 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 65  f../*.** Compile
0e30: 20 77 69 74 68 20 2d 44 53 51 4c 49 54 45 5f 4f   with -DSQLITE_O
0e40: 4d 49 54 5f 57 49 4e 5f 4c 4f 43 4b 53 20 74 6f  MIT_WIN_LOCKS to
0e50: 20 64 69 73 61 62 6c 65 20 66 69 6c 65 20 6c 6f   disable file lo
0e60: 63 6b 69 6e 67 20 6f 6e 0a 2a 2a 20 77 69 6e 64  cking on.** wind
0e70: 6f 77 73 2e 20 20 49 66 20 79 6f 75 20 64 6f 20  ows.  If you do 
0e80: 74 68 69 73 20 61 6e 64 20 74 77 6f 20 6f 72 20  this and two or 
0e90: 6d 6f 72 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  more connections
0ea0: 20 61 74 74 65 6d 70 74 20 74 6f 0a 2a 2a 20 77   attempt to.** w
0eb0: 72 69 74 65 20 74 68 65 20 64 61 74 61 62 61 73  rite the databas
0ec0: 65 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69  e at the same ti
0ed0: 6d 65 2c 20 74 68 65 20 64 61 74 61 62 61 73 65  me, the database
0ee0: 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 0a 2a 2a   file will be.**
0ef0: 20 63 6f 72 72 75 70 74 65 64 2e 20 20 42 75 74   corrupted.  But
0f00: 20 73 6f 6d 65 20 76 65 72 73 69 6f 6e 73 20 6f   some versions o
0f10: 66 20 57 69 6e 64 6f 77 73 43 45 20 64 6f 20 6e  f WindowsCE do n
0f20: 6f 74 20 73 75 70 70 6f 72 74 20 6c 6f 63 6b 69  ot support locki
0f30: 6e 67 2c 0a 2a 2a 20 69 6e 20 77 68 69 63 68 20  ng,.** in which 
0f40: 63 61 73 65 20 63 6f 6d 70 69 6c 69 6e 67 20 77  case compiling w
0f50: 69 74 68 20 74 68 69 73 20 6f 70 74 69 6f 6e 20  ith this option 
0f60: 69 73 20 72 65 71 75 69 72 65 64 20 6a 75 73 74  is required just
0f70: 20 74 6f 20 67 65 74 0a 2a 2a 20 69 74 20 74 6f   to get.** it to
0f80: 20 77 6f 72 6b 20 61 74 20 61 6c 6c 2e 0a 2a 2f   work at all..*/
0f90: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
0fa0: 4d 49 54 5f 57 49 4e 5f 4c 4f 43 4b 53 0a 23 20  MIT_WIN_LOCKS.# 
0fb0: 64 65 66 69 6e 65 20 4c 6f 63 6b 46 69 6c 65 28  define LockFile(
0fc0: 61 2c 62 2c 63 2c 64 2c 65 29 20 28 31 29 0a 23  a,b,c,d,e) (1).#
0fd0: 20 64 65 66 69 6e 65 20 4c 6f 63 6b 46 69 6c 65   define LockFile
0fe0: 45 78 28 61 2c 62 2c 63 2c 64 2c 65 2c 66 29 20  Ex(a,b,c,d,e,f) 
0ff0: 28 31 29 0a 23 20 64 65 66 69 6e 65 20 55 6e 6c  (1).# define Unl
1000: 6f 63 6b 46 69 6c 65 28 61 2c 62 2c 63 2c 64 2c  ockFile(a,b,c,d,
1010: 65 29 20 28 31 29 0a 23 20 64 65 66 69 6e 65 20  e) (1).# define 
1020: 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 28 61 2c 62  UnlockFileEx(a,b
1030: 2c 63 2c 64 2c 65 29 20 28 31 29 0a 23 65 6e 64  ,c,d,e) (1).#end
1040: 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  if../*.** Conver
1050: 74 20 61 20 55 54 46 2d 38 20 73 74 72 69 6e 67  t a UTF-8 string
1060: 20 74 6f 20 55 54 46 2d 33 32 2e 20 20 53 70 61   to UTF-32.  Spa
1070: 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72  ce to hold the r
1080: 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 0a 2a  eturned string.*
1090: 2a 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72  * is obtained fr
10a0: 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 2e  om sqliteMalloc.
10b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 57 43 48 41 52  .*/.static WCHAR
10c0: 20 2a 75 74 66 38 54 6f 55 6e 69 63 6f 64 65 28   *utf8ToUnicode(
10d0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
10e0: 65 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 6e 42  ename){.  int nB
10f0: 79 74 65 3b 0a 20 20 57 43 48 41 52 20 2a 7a 57  yte;.  WCHAR *zW
1100: 69 64 65 46 69 6c 65 6e 61 6d 65 3b 0a 0a 20 20  ideFilename;..  
1110: 69 66 28 20 21 69 73 4e 54 28 29 20 29 7b 0a 20  if( !isNT() ){. 
1120: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
1130: 0a 20 20 6e 42 79 74 65 20 3d 20 4d 75 6c 74 69  .  nByte = Multi
1140: 42 79 74 65 54 6f 57 69 64 65 43 68 61 72 28 43  ByteToWideChar(C
1150: 50 5f 55 54 46 38 2c 20 30 2c 20 7a 46 69 6c 65  P_UTF8, 0, zFile
1160: 6e 61 6d 65 2c 20 2d 31 2c 20 4e 55 4c 4c 2c 20  name, -1, NULL, 
1170: 30 29 2a 73 69 7a 65 6f 66 28 57 43 48 41 52 29  0)*sizeof(WCHAR)
1180: 3b 0a 20 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d  ;.  zWideFilenam
1190: 65 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  e = sqliteMalloc
11a0: 28 20 6e 42 79 74 65 2a 73 69 7a 65 6f 66 28 7a  ( nByte*sizeof(z
11b0: 57 69 64 65 46 69 6c 65 6e 61 6d 65 5b 30 5d 29  WideFilename[0])
11c0: 20 29 3b 0a 20 20 69 66 28 20 7a 57 69 64 65 46   );.  if( zWideF
11d0: 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  ilename==0 ){.  
11e0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
11f0: 20 20 6e 42 79 74 65 20 3d 20 4d 75 6c 74 69 42    nByte = MultiB
1200: 79 74 65 54 6f 57 69 64 65 43 68 61 72 28 43 50  yteToWideChar(CP
1210: 5f 55 54 46 38 2c 20 30 2c 20 7a 46 69 6c 65 6e  _UTF8, 0, zFilen
1220: 61 6d 65 2c 20 2d 31 2c 20 7a 57 69 64 65 46 69  ame, -1, zWideFi
1230: 6c 65 6e 61 6d 65 2c 20 6e 42 79 74 65 29 3b 0a  lename, nByte);.
1240: 20 20 69 66 28 20 6e 42 79 74 65 3d 3d 30 20 29    if( nByte==0 )
1250: 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  {.    sqliteFree
1260: 28 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65 29 3b  (zWideFilename);
1270: 0a 20 20 20 20 7a 57 69 64 65 46 69 6c 65 6e 61  .    zWideFilena
1280: 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  me = 0;.  }.  re
1290: 74 75 72 6e 20 7a 57 69 64 65 46 69 6c 65 6e 61  turn zWideFilena
12a0: 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  me;.}../*.** Con
12b0: 76 65 72 74 20 55 54 46 2d 33 32 20 74 6f 20 55  vert UTF-32 to U
12c0: 54 46 2d 38 2e 20 20 53 70 61 63 65 20 74 6f 20  TF-8.  Space to 
12d0: 68 6f 6c 64 20 74 68 65 20 72 65 74 75 72 6e 65  hold the returne
12e0: 64 20 73 74 72 69 6e 67 20 69 73 0a 2a 2a 20 6f  d string is.** o
12f0: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
1300: 69 74 65 4d 61 6c 6c 6f 63 28 29 2e 0a 2a 2f 0a  iteMalloc()..*/.
1310: 73 74 61 74 69 63 20 63 68 61 72 20 2a 75 6e 69  static char *uni
1320: 63 6f 64 65 54 6f 55 74 66 38 28 63 6f 6e 73 74  codeToUtf8(const
1330: 20 57 43 48 41 52 20 2a 7a 57 69 64 65 46 69 6c   WCHAR *zWideFil
1340: 65 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 6e 42  ename){.  int nB
1350: 79 74 65 3b 0a 20 20 63 68 61 72 20 2a 7a 46 69  yte;.  char *zFi
1360: 6c 65 6e 61 6d 65 3b 0a 0a 20 20 6e 42 79 74 65  lename;..  nByte
1370: 20 3d 20 57 69 64 65 43 68 61 72 54 6f 4d 75 6c   = WideCharToMul
1380: 74 69 42 79 74 65 28 43 50 5f 55 54 46 38 2c 20  tiByte(CP_UTF8, 
1390: 30 2c 20 7a 57 69 64 65 46 69 6c 65 6e 61 6d 65  0, zWideFilename
13a0: 2c 20 2d 31 2c 20 30 2c 20 30 2c 20 30 2c 20 30  , -1, 0, 0, 0, 0
13b0: 29 3b 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d  );.  zFilename =
13c0: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 6e   sqliteMalloc( n
13d0: 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20 7a 46  Byte );.  if( zF
13e0: 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  ilename==0 ){.  
13f0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
1400: 20 20 6e 42 79 74 65 20 3d 20 57 69 64 65 43 68    nByte = WideCh
1410: 61 72 54 6f 4d 75 6c 74 69 42 79 74 65 28 43 50  arToMultiByte(CP
1420: 5f 55 54 46 38 2c 20 30 2c 20 7a 57 69 64 65 46  _UTF8, 0, zWideF
1430: 69 6c 65 6e 61 6d 65 2c 20 2d 31 2c 20 7a 46 69  ilename, -1, zFi
1440: 6c 65 6e 61 6d 65 2c 20 6e 42 79 74 65 2c 0a 20  lename, nByte,. 
1450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1460: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20               0, 
1470: 30 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 20  0);.  if( nByte 
1480: 3d 3d 20 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  == 0 ){.    sqli
1490: 74 65 46 72 65 65 28 7a 46 69 6c 65 6e 61 6d 65  teFree(zFilename
14a0: 29 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65  );.    zFilename
14b0: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
14c0: 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a  rn zFilename;.}.
14d0: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74  ../*.** Delete t
14e0: 68 65 20 6e 61 6d 65 64 20 66 69 6c 65 0a 2a 2f  he named file.*/
14f0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 69 6e 44  .int sqlite3WinD
1500: 65 6c 65 74 65 28 63 6f 6e 73 74 20 63 68 61 72  elete(const char
1510: 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20   *zFilename){.  
1520: 57 43 48 41 52 20 2a 7a 57 69 64 65 20 3d 20 75  WCHAR *zWide = u
1530: 74 66 38 54 6f 55 6e 69 63 6f 64 65 28 7a 46 69  tf8ToUnicode(zFi
1540: 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a  lename);.  if( z
1550: 57 69 64 65 20 29 7b 0a 20 20 20 20 44 65 6c 65  Wide ){.    Dele
1560: 74 65 46 69 6c 65 57 28 7a 57 69 64 65 29 3b 0a  teFileW(zWide);.
1570: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
1580: 57 69 64 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Wide);.  }else{.
1590: 23 69 66 20 4f 53 5f 57 49 4e 43 45 0a 20 20 20  #if OS_WINCE.   
15a0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
15b0: 4f 4d 45 4d 3b 0a 23 65 6c 73 65 0a 20 20 20 20  OMEM;.#else.    
15c0: 44 65 6c 65 74 65 46 69 6c 65 41 28 7a 46 69 6c  DeleteFileA(zFil
15d0: 65 6e 61 6d 65 29 3b 0a 23 65 6e 64 69 66 0a 20  ename);.#endif. 
15e0: 20 7d 0a 20 20 54 52 41 43 45 32 28 22 44 45 4c   }.  TRACE2("DEL
15f0: 45 54 45 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 7a  ETE \"%s\"\n", z
1600: 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 72 65 74  Filename);.  ret
1610: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1620: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
1630: 52 55 45 20 69 66 20 74 68 65 20 6e 61 6d 65 64  RUE if the named
1640: 20 66 69 6c 65 20 65 78 69 73 74 73 2e 0a 2a 2f   file exists..*/
1650: 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 69 6e 46  .int sqlite3WinF
1660: 69 6c 65 45 78 69 73 74 73 28 63 6f 6e 73 74 20  ileExists(const 
1670: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29  char *zFilename)
1680: 7b 0a 20 20 69 6e 74 20 65 78 69 73 74 73 20 3d  {.  int exists =
1690: 20 30 3b 0a 20 20 57 43 48 41 52 20 2a 7a 57 69   0;.  WCHAR *zWi
16a0: 64 65 20 3d 20 75 74 66 38 54 6f 55 6e 69 63 6f  de = utf8ToUnico
16b0: 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  de(zFilename);. 
16c0: 20 69 66 28 20 7a 57 69 64 65 20 29 7b 0a 20 20   if( zWide ){.  
16d0: 20 20 65 78 69 73 74 73 20 3d 20 47 65 74 46 69    exists = GetFi
16e0: 6c 65 41 74 74 72 69 62 75 74 65 73 57 28 7a 57  leAttributesW(zW
16f0: 69 64 65 29 20 21 3d 20 30 78 66 66 66 66 66 66  ide) != 0xffffff
1700: 66 66 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  ff;.    sqliteFr
1710: 65 65 28 7a 57 69 64 65 29 3b 0a 20 20 7d 65 6c  ee(zWide);.  }el
1720: 73 65 7b 0a 23 69 66 20 4f 53 5f 57 49 4e 43 45  se{.#if OS_WINCE
1730: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1740: 54 45 5f 4e 4f 4d 45 4d 3b 0a 23 65 6c 73 65 0a  TE_NOMEM;.#else.
1750: 20 20 20 20 65 78 69 73 74 73 20 3d 20 47 65 74      exists = Get
1760: 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 41 28  FileAttributesA(
1770: 7a 46 69 6c 65 6e 61 6d 65 29 20 21 3d 20 30 78  zFilename) != 0x
1780: 66 66 66 66 66 66 66 66 3b 0a 23 65 6e 64 69 66  ffffffff;.#endif
1790: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 65 78  .  }.  return ex
17a0: 69 73 74 73 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77  ists;.}../* Forw
17b0: 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  ard declaration 
17c0: 2a 2f 0a 69 6e 74 20 61 6c 6c 6f 63 61 74 65 57  */.int allocateW
17d0: 69 6e 46 69 6c 65 28 77 69 6e 46 69 6c 65 20 2a  inFile(winFile *
17e0: 70 49 6e 69 74 2c 20 4f 73 46 69 6c 65 20 2a 2a  pInit, OsFile **
17f0: 70 49 64 29 3b 0a 0a 2f 2a 0a 2a 2a 20 41 74 74  pId);../*.** Att
1800: 65 6d 70 74 20 74 6f 20 6f 70 65 6e 20 61 20 66  empt to open a f
1810: 69 6c 65 20 66 6f 72 20 62 6f 74 68 20 72 65 61  ile for both rea
1820: 64 69 6e 67 20 61 6e 64 20 77 72 69 74 69 6e 67  ding and writing
1830: 2e 20 20 49 66 20 74 68 61 74 0a 2a 2a 20 66 61  .  If that.** fa
1840: 69 6c 73 2c 20 74 72 79 20 6f 70 65 6e 69 6e 67  ils, try opening
1850: 20 69 74 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 20   it read-only.  
1860: 49 66 20 74 68 65 20 66 69 6c 65 20 64 6f 65 73  If the file does
1870: 20 6e 6f 74 20 65 78 69 73 74 2c 0a 2a 2a 20 74   not exist,.** t
1880: 72 79 20 74 6f 20 63 72 65 61 74 65 20 69 74 2e  ry to create it.
1890: 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73  .**.** On succes
18a0: 73 2c 20 61 20 68 61 6e 64 6c 65 20 66 6f 72 20  s, a handle for 
18b0: 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20 69 73  the open file is
18c0: 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 69 64 0a   written to *id.
18d0: 2a 2a 20 61 6e 64 20 2a 70 52 65 61 64 6f 6e 6c  ** and *pReadonl
18e0: 79 20 69 73 20 73 65 74 20 74 6f 20 30 20 69 66  y is set to 0 if
18f0: 20 74 68 65 20 66 69 6c 65 20 77 61 73 20 6f 70   the file was op
1900: 65 6e 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67  ened for reading
1910: 20 61 6e 64 0a 2a 2a 20 77 72 69 74 69 6e 67 20   and.** writing 
1920: 6f 72 20 31 20 69 66 20 74 68 65 20 66 69 6c 65  or 1 if the file
1930: 20 77 61 73 20 6f 70 65 6e 65 64 20 72 65 61 64   was opened read
1940: 2d 6f 6e 6c 79 2e 20 20 54 68 65 20 66 75 6e 63  -only.  The func
1950: 74 69 6f 6e 20 72 65 74 75 72 6e 73 0a 2a 2a 20  tion returns.** 
1960: 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a  SQLITE_OK..**.**
1970: 20 4f 6e 20 66 61 69 6c 75 72 65 2c 20 74 68 65   On failure, the
1980: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
1990: 73 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  s SQLITE_CANTOPE
19a0: 4e 20 61 6e 64 20 6c 65 61 76 65 73 0a 2a 2a 20  N and leaves.** 
19b0: 2a 69 64 20 61 6e 64 20 2a 70 52 65 61 64 6f 6e  *id and *pReadon
19c0: 6c 79 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f  ly unchanged..*/
19d0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 69 6e 4f  .int sqlite3WinO
19e0: 70 65 6e 52 65 61 64 57 72 69 74 65 28 0a 20 20  penReadWrite(.  
19f0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
1a00: 65 6e 61 6d 65 2c 0a 20 20 4f 73 46 69 6c 65 20  ename,.  OsFile 
1a10: 2a 2a 70 49 64 2c 0a 20 20 69 6e 74 20 2a 70 52  **pId,.  int *pR
1a20: 65 61 64 6f 6e 6c 79 0a 29 7b 0a 20 20 77 69 6e  eadonly.){.  win
1a30: 46 69 6c 65 20 66 3b 0a 20 20 48 41 4e 44 4c 45  File f;.  HANDLE
1a40: 20 68 3b 0a 20 20 57 43 48 41 52 20 2a 7a 57 69   h;.  WCHAR *zWi
1a50: 64 65 20 3d 20 75 74 66 38 54 6f 55 6e 69 63 6f  de = utf8ToUnico
1a60: 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  de(zFilename);. 
1a70: 20 61 73 73 65 72 74 28 20 2a 70 49 64 3d 3d 30   assert( *pId==0
1a80: 20 29 3b 0a 20 20 69 66 28 20 7a 57 69 64 65 20   );.  if( zWide 
1a90: 29 7b 0a 20 20 20 20 68 20 3d 20 43 72 65 61 74  ){.    h = Creat
1aa0: 65 46 69 6c 65 57 28 7a 57 69 64 65 2c 0a 20 20  eFileW(zWide,.  
1ab0: 20 20 20 20 20 47 45 4e 45 52 49 43 5f 52 45 41       GENERIC_REA
1ac0: 44 20 7c 20 47 45 4e 45 52 49 43 5f 57 52 49 54  D | GENERIC_WRIT
1ad0: 45 2c 0a 20 20 20 20 20 20 20 46 49 4c 45 5f 53  E,.       FILE_S
1ae0: 48 41 52 45 5f 52 45 41 44 20 7c 20 46 49 4c 45  HARE_READ | FILE
1af0: 5f 53 48 41 52 45 5f 57 52 49 54 45 2c 0a 20 20  _SHARE_WRITE,.  
1b00: 20 20 20 20 20 4e 55 4c 4c 2c 0a 20 20 20 20 20       NULL,.     
1b10: 20 20 4f 50 45 4e 5f 41 4c 57 41 59 53 2c 0a 20    OPEN_ALWAYS,. 
1b20: 20 20 20 20 20 20 46 49 4c 45 5f 41 54 54 52 49        FILE_ATTRI
1b30: 42 55 54 45 5f 4e 4f 52 4d 41 4c 20 7c 20 46 49  BUTE_NORMAL | FI
1b40: 4c 45 5f 46 4c 41 47 5f 52 41 4e 44 4f 4d 5f 41  LE_FLAG_RANDOM_A
1b50: 43 43 45 53 53 2c 0a 20 20 20 20 20 20 20 4e 55  CCESS,.       NU
1b60: 4c 4c 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66  LL.    );.    if
1b70: 28 20 68 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e  ( h==INVALID_HAN
1b80: 44 4c 45 5f 56 41 4c 55 45 20 29 7b 0a 20 20 20  DLE_VALUE ){.   
1b90: 20 20 20 68 20 3d 20 43 72 65 61 74 65 46 69 6c     h = CreateFil
1ba0: 65 57 28 7a 57 69 64 65 2c 0a 20 20 20 20 20 20  eW(zWide,.      
1bb0: 20 20 20 47 45 4e 45 52 49 43 5f 52 45 41 44 2c     GENERIC_READ,
1bc0: 0a 20 20 20 20 20 20 20 20 20 46 49 4c 45 5f 53  .         FILE_S
1bd0: 48 41 52 45 5f 52 45 41 44 2c 0a 20 20 20 20 20  HARE_READ,.     
1be0: 20 20 20 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20      NULL,.      
1bf0: 20 20 20 4f 50 45 4e 5f 41 4c 57 41 59 53 2c 0a     OPEN_ALWAYS,.
1c00: 20 20 20 20 20 20 20 20 20 46 49 4c 45 5f 41 54           FILE_AT
1c10: 54 52 49 42 55 54 45 5f 4e 4f 52 4d 41 4c 20 7c  TRIBUTE_NORMAL |
1c20: 20 46 49 4c 45 5f 46 4c 41 47 5f 52 41 4e 44 4f   FILE_FLAG_RANDO
1c30: 4d 5f 41 43 43 45 53 53 2c 0a 20 20 20 20 20 20  M_ACCESS,.      
1c40: 20 20 20 4e 55 4c 4c 0a 20 20 20 20 20 20 29 3b     NULL.      );
1c50: 0a 20 20 20 20 20 20 69 66 28 20 68 3d 3d 49 4e  .      if( h==IN
1c60: 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c  VALID_HANDLE_VAL
1c70: 55 45 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  UE ){.        sq
1c80: 6c 69 74 65 46 72 65 65 28 7a 57 69 64 65 29 3b  liteFree(zWide);
1c90: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1ca0: 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b  SQLITE_CANTOPEN;
1cb0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a  .      }.      *
1cc0: 70 52 65 61 64 6f 6e 6c 79 20 3d 20 31 3b 0a 20  pReadonly = 1;. 
1cd0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1ce0: 2a 70 52 65 61 64 6f 6e 6c 79 20 3d 20 30 3b 0a  *pReadonly = 0;.
1cf0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
1d00: 46 72 65 65 28 7a 57 69 64 65 29 3b 0a 20 20 7d  Free(zWide);.  }
1d10: 65 6c 73 65 7b 0a 23 69 66 20 4f 53 5f 57 49 4e  else{.#if OS_WIN
1d20: 43 45 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  CE.    return SQ
1d30: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 23 65 6c 73  LITE_NOMEM;.#els
1d40: 65 0a 20 20 20 20 68 20 3d 20 43 72 65 61 74 65  e.    h = Create
1d50: 46 69 6c 65 41 28 7a 46 69 6c 65 6e 61 6d 65 2c  FileA(zFilename,
1d60: 0a 20 20 20 20 20 20 20 47 45 4e 45 52 49 43 5f  .       GENERIC_
1d70: 52 45 41 44 20 7c 20 47 45 4e 45 52 49 43 5f 57  READ | GENERIC_W
1d80: 52 49 54 45 2c 0a 20 20 20 20 20 20 20 46 49 4c  RITE,.       FIL
1d90: 45 5f 53 48 41 52 45 5f 52 45 41 44 20 7c 20 46  E_SHARE_READ | F
1da0: 49 4c 45 5f 53 48 41 52 45 5f 57 52 49 54 45 2c  ILE_SHARE_WRITE,
1db0: 0a 20 20 20 20 20 20 20 4e 55 4c 4c 2c 0a 20 20  .       NULL,.  
1dc0: 20 20 20 20 20 4f 50 45 4e 5f 41 4c 57 41 59 53       OPEN_ALWAYS
1dd0: 2c 0a 20 20 20 20 20 20 20 46 49 4c 45 5f 41 54  ,.       FILE_AT
1de0: 54 52 49 42 55 54 45 5f 4e 4f 52 4d 41 4c 20 7c  TRIBUTE_NORMAL |
1df0: 20 46 49 4c 45 5f 46 4c 41 47 5f 52 41 4e 44 4f   FILE_FLAG_RANDO
1e00: 4d 5f 41 43 43 45 53 53 2c 0a 20 20 20 20 20 20  M_ACCESS,.      
1e10: 20 4e 55 4c 4c 0a 20 20 20 20 29 3b 0a 20 20 20   NULL.    );.   
1e20: 20 69 66 28 20 68 3d 3d 49 4e 56 41 4c 49 44 5f   if( h==INVALID_
1e30: 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 7b 0a  HANDLE_VALUE ){.
1e40: 20 20 20 20 20 20 68 20 3d 20 43 72 65 61 74 65        h = Create
1e50: 46 69 6c 65 41 28 7a 46 69 6c 65 6e 61 6d 65 2c  FileA(zFilename,
1e60: 0a 20 20 20 20 20 20 20 20 20 47 45 4e 45 52 49  .         GENERI
1e70: 43 5f 52 45 41 44 2c 0a 20 20 20 20 20 20 20 20  C_READ,.        
1e80: 20 46 49 4c 45 5f 53 48 41 52 45 5f 52 45 41 44   FILE_SHARE_READ
1e90: 2c 0a 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 2c  ,.         NULL,
1ea0: 0a 20 20 20 20 20 20 20 20 20 4f 50 45 4e 5f 41  .         OPEN_A
1eb0: 4c 57 41 59 53 2c 0a 20 20 20 20 20 20 20 20 20  LWAYS,.         
1ec0: 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 4e  FILE_ATTRIBUTE_N
1ed0: 4f 52 4d 41 4c 20 7c 20 46 49 4c 45 5f 46 4c 41  ORMAL | FILE_FLA
1ee0: 47 5f 52 41 4e 44 4f 4d 5f 41 43 43 45 53 53 2c  G_RANDOM_ACCESS,
1ef0: 0a 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 0a 20  .         NULL. 
1f00: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69 66       );.      if
1f10: 28 20 68 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e  ( h==INVALID_HAN
1f20: 44 4c 45 5f 56 41 4c 55 45 20 29 7b 0a 20 20 20  DLE_VALUE ){.   
1f30: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1f40: 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 20  TE_CANTOPEN;.   
1f50: 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 52 65 61     }.      *pRea
1f60: 64 6f 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20 7d  donly = 1;.    }
1f70: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 52 65  else{.      *pRe
1f80: 61 64 6f 6e 6c 79 20 3d 20 30 3b 0a 20 20 20 20  adonly = 0;.    
1f90: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 57  }.#endif /* OS_W
1fa0: 49 4e 43 45 20 2a 2f 0a 20 20 7d 0a 20 20 66 2e  INCE */.  }.  f.
1fb0: 68 20 3d 20 68 3b 0a 20 20 66 2e 6c 6f 63 6b 74  h = h;.  f.lockt
1fc0: 79 70 65 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20  ype = NO_LOCK;. 
1fd0: 20 66 2e 73 68 61 72 65 64 4c 6f 63 6b 42 79 74   f.sharedLockByt
1fe0: 65 20 3d 20 30 3b 0a 23 69 66 20 4f 53 5f 57 49  e = 0;.#if OS_WI
1ff0: 4e 43 45 0a 20 20 66 2e 7a 44 65 6c 65 74 65 4f  NCE.  f.zDeleteO
2000: 6e 43 6c 6f 73 65 20 3d 20 30 3b 0a 23 65 6e 64  nClose = 0;.#end
2010: 69 66 0a 20 20 54 52 41 43 45 33 28 22 4f 50 45  if.  TRACE3("OPE
2020: 4e 20 52 2f 57 20 25 64 20 5c 22 25 73 5c 22 5c  N R/W %d \"%s\"\
2030: 6e 22 2c 20 68 2c 20 7a 46 69 6c 65 6e 61 6d 65  n", h, zFilename
2040: 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 6c 6c 6f  );.  return allo
2050: 63 61 74 65 57 69 6e 46 69 6c 65 28 26 66 2c 20  cateWinFile(&f, 
2060: 70 49 64 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  pId);.}.../*.** 
2070: 41 74 74 65 6d 70 74 20 74 6f 20 6f 70 65 6e 20  Attempt to open 
2080: 61 20 6e 65 77 20 66 69 6c 65 20 66 6f 72 20 65  a new file for e
2090: 78 63 6c 75 73 69 76 65 20 61 63 63 65 73 73 20  xclusive access 
20a0: 62 79 20 74 68 69 73 20 70 72 6f 63 65 73 73 2e  by this process.
20b0: 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20 77 69 6c  .** The file wil
20c0: 6c 20 62 65 20 6f 70 65 6e 65 64 20 66 6f 72 20  l be opened for 
20d0: 62 6f 74 68 20 72 65 61 64 69 6e 67 20 61 6e 64  both reading and
20e0: 20 77 72 69 74 69 6e 67 2e 20 20 54 6f 20 61 76   writing.  To av
20f0: 6f 69 64 0a 2a 2a 20 61 20 70 6f 74 65 6e 74 69  oid.** a potenti
2100: 61 6c 20 73 65 63 75 72 69 74 79 20 70 72 6f 62  al security prob
2110: 6c 65 6d 2c 20 77 65 20 64 6f 20 6e 6f 74 20 61  lem, we do not a
2120: 6c 6c 6f 77 20 74 68 65 20 66 69 6c 65 20 74 6f  llow the file to
2130: 20 68 61 76 65 0a 2a 2a 20 70 72 65 76 69 6f 75   have.** previou
2140: 73 6c 79 20 65 78 69 73 74 65 64 2e 20 20 4e 6f  sly existed.  No
2150: 72 20 64 6f 20 77 65 20 61 6c 6c 6f 77 20 74 68  r do we allow th
2160: 65 20 66 69 6c 65 20 74 6f 20 62 65 20 61 20 73  e file to be a s
2170: 79 6d 62 6f 6c 69 63 0a 2a 2a 20 6c 69 6e 6b 2e  ymbolic.** link.
2180: 0a 2a 2a 0a 2a 2a 20 49 66 20 64 65 6c 46 6c 61  .**.** If delFla
2190: 67 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  g is true, then 
21a0: 6d 61 6b 65 20 61 72 72 61 6e 67 65 6d 65 6e 74  make arrangement
21b0: 73 20 74 6f 20 61 75 74 6f 6d 61 74 69 63 61 6c  s to automatical
21c0: 6c 79 20 64 65 6c 65 74 65 0a 2a 2a 20 74 68 65  ly delete.** the
21d0: 20 66 69 6c 65 20 77 68 65 6e 20 69 74 20 69 73   file when it is
21e0: 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f   closed..**.** O
21f0: 6e 20 73 75 63 63 65 73 73 2c 20 77 72 69 74 65  n success, write
2200: 20 74 68 65 20 66 69 6c 65 20 68 61 6e 64 6c 65   the file handle
2210: 20 69 6e 74 6f 20 2a 69 64 20 61 6e 64 20 72 65   into *id and re
2220: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  turn SQLITE_OK..
2230: 2a 2a 0a 2a 2a 20 4f 6e 20 66 61 69 6c 75 72 65  **.** On failure
2240: 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
2250: 43 41 4e 54 4f 50 45 4e 2e 0a 2a 2f 0a 69 6e 74  CANTOPEN..*/.int
2260: 20 73 71 6c 69 74 65 33 57 69 6e 4f 70 65 6e 45   sqlite3WinOpenE
2270: 78 63 6c 75 73 69 76 65 28 63 6f 6e 73 74 20 63  xclusive(const c
2280: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
2290: 4f 73 46 69 6c 65 20 2a 2a 70 49 64 2c 20 69 6e  OsFile **pId, in
22a0: 74 20 64 65 6c 46 6c 61 67 29 7b 0a 20 20 77 69  t delFlag){.  wi
22b0: 6e 46 69 6c 65 20 66 3b 0a 20 20 48 41 4e 44 4c  nFile f;.  HANDL
22c0: 45 20 68 3b 0a 20 20 69 6e 74 20 66 69 6c 65 66  E h;.  int filef
22d0: 6c 61 67 73 3b 0a 20 20 57 43 48 41 52 20 2a 7a  lags;.  WCHAR *z
22e0: 57 69 64 65 20 3d 20 75 74 66 38 54 6f 55 6e 69  Wide = utf8ToUni
22f0: 63 6f 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  code(zFilename);
2300: 0a 20 20 61 73 73 65 72 74 28 20 2a 70 49 64 20  .  assert( *pId 
2310: 3d 3d 20 30 20 29 3b 0a 20 20 66 69 6c 65 66 6c  == 0 );.  filefl
2320: 61 67 73 20 3d 20 46 49 4c 45 5f 46 4c 41 47 5f  ags = FILE_FLAG_
2330: 52 41 4e 44 4f 4d 5f 41 43 43 45 53 53 3b 0a 23  RANDOM_ACCESS;.#
2340: 69 66 20 21 4f 53 5f 57 49 4e 43 45 0a 20 20 69  if !OS_WINCE.  i
2350: 66 28 20 64 65 6c 46 6c 61 67 20 29 7b 0a 20 20  f( delFlag ){.  
2360: 20 20 66 69 6c 65 66 6c 61 67 73 20 7c 3d 20 46    fileflags |= F
2370: 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 54 45  ILE_ATTRIBUTE_TE
2380: 4d 50 4f 52 41 52 59 20 7c 20 46 49 4c 45 5f 46  MPORARY | FILE_F
2390: 4c 41 47 5f 44 45 4c 45 54 45 5f 4f 4e 5f 43 4c  LAG_DELETE_ON_CL
23a0: 4f 53 45 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  OSE;.  }.#endif.
23b0: 20 20 69 66 28 20 7a 57 69 64 65 20 29 7b 0a 20    if( zWide ){. 
23c0: 20 20 20 68 20 3d 20 43 72 65 61 74 65 46 69 6c     h = CreateFil
23d0: 65 57 28 7a 57 69 64 65 2c 0a 20 20 20 20 20 20  eW(zWide,.      
23e0: 20 47 45 4e 45 52 49 43 5f 52 45 41 44 20 7c 20   GENERIC_READ | 
23f0: 47 45 4e 45 52 49 43 5f 57 52 49 54 45 2c 0a 20  GENERIC_WRITE,. 
2400: 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20 20 20        0,.       
2410: 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 43 52 45  NULL,.       CRE
2420: 41 54 45 5f 41 4c 57 41 59 53 2c 0a 20 20 20 20  ATE_ALWAYS,.    
2430: 20 20 20 66 69 6c 65 66 6c 61 67 73 2c 0a 20 20     fileflags,.  
2440: 20 20 20 20 20 4e 55 4c 4c 0a 20 20 20 20 29 3b       NULL.    );
2450: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
2460: 7a 57 69 64 65 29 3b 0a 20 20 7d 65 6c 73 65 7b  zWide);.  }else{
2470: 0a 23 69 66 20 4f 53 5f 57 49 4e 43 45 0a 20 20  .#if OS_WINCE.  
2480: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2490: 4e 4f 4d 45 4d 3b 0a 23 65 6c 73 65 0a 20 20 20  NOMEM;.#else.   
24a0: 20 68 20 3d 20 43 72 65 61 74 65 46 69 6c 65 41   h = CreateFileA
24b0: 28 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20  (zFilename,.    
24c0: 20 20 20 47 45 4e 45 52 49 43 5f 52 45 41 44 20     GENERIC_READ 
24d0: 7c 20 47 45 4e 45 52 49 43 5f 57 52 49 54 45 2c  | GENERIC_WRITE,
24e0: 0a 20 20 20 20 20 20 20 30 2c 0a 20 20 20 20 20  .       0,.     
24f0: 20 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 43    NULL,.       C
2500: 52 45 41 54 45 5f 41 4c 57 41 59 53 2c 0a 20 20  REATE_ALWAYS,.  
2510: 20 20 20 20 20 66 69 6c 65 66 6c 61 67 73 2c 0a       fileflags,.
2520: 20 20 20 20 20 20 20 4e 55 4c 4c 0a 20 20 20 20         NULL.    
2530: 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f  );.#endif /* OS_
2540: 57 49 4e 43 45 20 2a 2f 0a 20 20 7d 0a 20 20 69  WINCE */.  }.  i
2550: 66 28 20 68 3d 3d 49 4e 56 41 4c 49 44 5f 48 41  f( h==INVALID_HA
2560: 4e 44 4c 45 5f 56 41 4c 55 45 20 29 7b 0a 20 20  NDLE_VALUE ){.  
2570: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2580: 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 7d 0a 20 20  CANTOPEN;.  }.  
2590: 66 2e 68 20 3d 20 68 3b 0a 20 20 66 2e 6c 6f 63  f.h = h;.  f.loc
25a0: 6b 74 79 70 65 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b  ktype = NO_LOCK;
25b0: 0a 20 20 66 2e 73 68 61 72 65 64 4c 6f 63 6b 42  .  f.sharedLockB
25c0: 79 74 65 20 3d 20 30 3b 0a 23 69 66 20 4f 53 5f  yte = 0;.#if OS_
25d0: 57 49 4e 43 45 0a 20 20 66 2e 7a 44 65 6c 65 74  WINCE.  f.zDelet
25e0: 65 4f 6e 43 6c 6f 73 65 20 3d 20 64 65 6c 46 6c  eOnClose = delFl
25f0: 61 67 20 3f 20 75 74 66 38 54 6f 55 6e 69 63 6f  ag ? utf8ToUnico
2600: 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29 20 3a 20  de(zFilename) : 
2610: 30 3b 0a 23 65 6e 64 69 66 0a 20 20 54 52 41 43  0;.#endif.  TRAC
2620: 45 33 28 22 4f 50 45 4e 20 45 58 20 25 64 20 5c  E3("OPEN EX %d \
2630: 22 25 73 5c 22 5c 6e 22 2c 20 68 2c 20 7a 46 69  "%s\"\n", h, zFi
2640: 6c 65 6e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72  lename);.  retur
2650: 6e 20 61 6c 6c 6f 63 61 74 65 57 69 6e 46 69 6c  n allocateWinFil
2660: 65 28 26 66 2c 20 70 49 64 29 3b 0a 7d 0a 0a 2f  e(&f, pId);.}../
2670: 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20  *.** Attempt to 
2680: 6f 70 65 6e 20 61 20 6e 65 77 20 66 69 6c 65 20  open a new file 
2690: 66 6f 72 20 72 65 61 64 2d 6f 6e 6c 79 20 61 63  for read-only ac
26a0: 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73  cess..**.** On s
26b0: 75 63 63 65 73 73 2c 20 77 72 69 74 65 20 74 68  uccess, write th
26c0: 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 69 6e  e file handle in
26d0: 74 6f 20 2a 69 64 20 61 6e 64 20 72 65 74 75 72  to *id and retur
26e0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a  n SQLITE_OK..**.
26f0: 2a 2a 20 4f 6e 20 66 61 69 6c 75 72 65 2c 20 72  ** On failure, r
2700: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e  eturn SQLITE_CAN
2710: 54 4f 50 45 4e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  TOPEN..*/.int sq
2720: 6c 69 74 65 33 57 69 6e 4f 70 65 6e 52 65 61 64  lite3WinOpenRead
2730: 4f 6e 6c 79 28 63 6f 6e 73 74 20 63 68 61 72 20  Only(const char 
2740: 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 4f 73 46 69  *zFilename, OsFi
2750: 6c 65 20 2a 2a 70 49 64 29 7b 0a 20 20 77 69 6e  le **pId){.  win
2760: 46 69 6c 65 20 66 3b 0a 20 20 48 41 4e 44 4c 45  File f;.  HANDLE
2770: 20 68 3b 0a 20 20 57 43 48 41 52 20 2a 7a 57 69   h;.  WCHAR *zWi
2780: 64 65 20 3d 20 75 74 66 38 54 6f 55 6e 69 63 6f  de = utf8ToUnico
2790: 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  de(zFilename);. 
27a0: 20 61 73 73 65 72 74 28 20 2a 70 49 64 3d 3d 30   assert( *pId==0
27b0: 20 29 3b 0a 20 20 69 66 28 20 7a 57 69 64 65 20   );.  if( zWide 
27c0: 29 7b 0a 20 20 20 20 68 20 3d 20 43 72 65 61 74  ){.    h = Creat
27d0: 65 46 69 6c 65 57 28 7a 57 69 64 65 2c 0a 20 20  eFileW(zWide,.  
27e0: 20 20 20 20 20 47 45 4e 45 52 49 43 5f 52 45 41       GENERIC_REA
27f0: 44 2c 0a 20 20 20 20 20 20 20 30 2c 0a 20 20 20  D,.       0,.   
2800: 20 20 20 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20      NULL,.      
2810: 20 4f 50 45 4e 5f 45 58 49 53 54 49 4e 47 2c 0a   OPEN_EXISTING,.
2820: 20 20 20 20 20 20 20 46 49 4c 45 5f 41 54 54 52         FILE_ATTR
2830: 49 42 55 54 45 5f 4e 4f 52 4d 41 4c 20 7c 20 46  IBUTE_NORMAL | F
2840: 49 4c 45 5f 46 4c 41 47 5f 52 41 4e 44 4f 4d 5f  ILE_FLAG_RANDOM_
2850: 41 43 43 45 53 53 2c 0a 20 20 20 20 20 20 20 4e  ACCESS,.       N
2860: 55 4c 4c 0a 20 20 20 20 29 3b 0a 20 20 20 20 73  ULL.    );.    s
2870: 71 6c 69 74 65 46 72 65 65 28 7a 57 69 64 65 29  qliteFree(zWide)
2880: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 23 69 66 20 4f  ;.  }else{.#if O
2890: 53 5f 57 49 4e 43 45 0a 20 20 20 20 72 65 74 75  S_WINCE.    retu
28a0: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
28b0: 0a 23 65 6c 73 65 0a 20 20 20 20 68 20 3d 20 43  .#else.    h = C
28c0: 72 65 61 74 65 46 69 6c 65 41 28 7a 46 69 6c 65  reateFileA(zFile
28d0: 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 47 45 4e  name,.       GEN
28e0: 45 52 49 43 5f 52 45 41 44 2c 0a 20 20 20 20 20  ERIC_READ,.     
28f0: 20 20 30 2c 0a 20 20 20 20 20 20 20 4e 55 4c 4c    0,.       NULL
2900: 2c 0a 20 20 20 20 20 20 20 4f 50 45 4e 5f 45 58  ,.       OPEN_EX
2910: 49 53 54 49 4e 47 2c 0a 20 20 20 20 20 20 20 46  ISTING,.       F
2920: 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 4e 4f  ILE_ATTRIBUTE_NO
2930: 52 4d 41 4c 20 7c 20 46 49 4c 45 5f 46 4c 41 47  RMAL | FILE_FLAG
2940: 5f 52 41 4e 44 4f 4d 5f 41 43 43 45 53 53 2c 0a  _RANDOM_ACCESS,.
2950: 20 20 20 20 20 20 20 4e 55 4c 4c 0a 20 20 20 20         NULL.    
2960: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20  );.#endif.  }.  
2970: 69 66 28 20 68 3d 3d 49 4e 56 41 4c 49 44 5f 48  if( h==INVALID_H
2980: 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 7b 0a 20  ANDLE_VALUE ){. 
2990: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
29a0: 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 7d 0a 20  _CANTOPEN;.  }. 
29b0: 20 66 2e 68 20 3d 20 68 3b 0a 20 20 66 2e 6c 6f   f.h = h;.  f.lo
29c0: 63 6b 74 79 70 65 20 3d 20 4e 4f 5f 4c 4f 43 4b  cktype = NO_LOCK
29d0: 3b 0a 20 20 66 2e 73 68 61 72 65 64 4c 6f 63 6b  ;.  f.sharedLock
29e0: 42 79 74 65 20 3d 20 30 3b 0a 23 69 66 20 4f 53  Byte = 0;.#if OS
29f0: 5f 57 49 4e 43 45 0a 20 20 66 2e 7a 44 65 6c 65  _WINCE.  f.zDele
2a00: 74 65 4f 6e 43 6c 6f 73 65 20 3d 20 30 3b 0a 23  teOnClose = 0;.#
2a10: 65 6e 64 69 66 0a 20 20 54 52 41 43 45 33 28 22  endif.  TRACE3("
2a20: 4f 50 45 4e 20 52 4f 20 25 64 20 5c 22 25 73 5c  OPEN RO %d \"%s\
2a30: 22 5c 6e 22 2c 20 68 2c 20 7a 46 69 6c 65 6e 61  "\n", h, zFilena
2a40: 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 6c  me);.  return al
2a50: 6c 6f 63 61 74 65 57 69 6e 46 69 6c 65 28 26 66  locateWinFile(&f
2a60: 2c 20 70 49 64 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  , pId);.}../*.**
2a70: 20 41 74 74 65 6d 70 74 20 74 6f 20 6f 70 65 6e   Attempt to open
2a80: 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74   a file descript
2a90: 6f 72 20 66 6f 72 20 74 68 65 20 64 69 72 65 63  or for the direc
2aa0: 74 6f 72 79 20 74 68 61 74 20 63 6f 6e 74 61 69  tory that contai
2ab0: 6e 73 20 61 0a 2a 2a 20 66 69 6c 65 2e 20 20 54  ns a.** file.  T
2ac0: 68 69 73 20 66 69 6c 65 20 64 65 73 63 72 69 70  his file descrip
2ad0: 74 6f 72 20 63 61 6e 20 62 65 20 75 73 65 64 20  tor can be used 
2ae0: 74 6f 20 66 73 79 6e 63 28 29 20 74 68 65 20 64  to fsync() the d
2af0: 69 72 65 63 74 6f 72 79 0a 2a 2a 20 69 6e 20 6f  irectory.** in o
2b00: 72 64 65 72 20 74 6f 20 6d 61 6b 65 20 73 75 72  rder to make sur
2b10: 65 20 74 68 65 20 63 72 65 61 74 69 6f 6e 20 6f  e the creation o
2b20: 66 20 61 20 6e 65 77 20 66 69 6c 65 20 69 73 20  f a new file is 
2b30: 61 63 74 75 61 6c 6c 79 20 77 72 69 74 74 65 6e  actually written
2b40: 0a 2a 2a 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a  .** to disk..**.
2b50: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2b60: 69 73 20 6f 6e 6c 79 20 6d 65 61 6e 69 6e 67 66  is only meaningf
2b70: 75 6c 20 66 6f 72 20 55 6e 69 78 2e 20 20 49 74  ul for Unix.  It
2b80: 20 69 73 20 61 20 6e 6f 2d 6f 70 20 75 6e 64 65   is a no-op unde
2b90: 72 0a 2a 2a 20 77 69 6e 64 6f 77 73 20 73 69 6e  r.** windows sin
2ba0: 63 65 20 77 69 6e 64 6f 77 73 20 64 6f 65 73 20  ce windows does 
2bb0: 6e 6f 74 20 73 75 70 70 6f 72 74 20 68 61 72 64  not support hard
2bc0: 20 6c 69 6e 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4f 6e   links..**.** On
2bd0: 20 73 75 63 63 65 73 73 2c 20 61 20 68 61 6e 64   success, a hand
2be0: 6c 65 20 66 6f 72 20 61 20 70 72 65 76 69 6f 75  le for a previou
2bf0: 73 6c 79 20 6f 70 65 6e 20 66 69 6c 65 20 69 73  sly open file is
2c00: 20 61 74 20 2a 69 64 20 69 73 0a 2a 2a 20 75 70   at *id is.** up
2c10: 64 61 74 65 64 20 77 69 74 68 20 74 68 65 20 6e  dated with the n
2c20: 65 77 20 64 69 72 65 63 74 6f 72 79 20 66 69 6c  ew directory fil
2c30: 65 20 64 65 73 63 72 69 70 74 6f 72 20 61 6e 64  e descriptor and
2c40: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 0a 2a 2a   SQLITE_OK is.**
2c50: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
2c60: 20 4f 6e 20 66 61 69 6c 75 72 65 2c 20 74 68 65   On failure, the
2c70: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
2c80: 73 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  s SQLITE_CANTOPE
2c90: 4e 20 61 6e 64 20 6c 65 61 76 65 73 0a 2a 2a 20  N and leaves.** 
2ca0: 2a 69 64 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a  *id unchanged..*
2cb0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
2cc0: 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 28 0a 20  OpenDirectory(. 
2cd0: 20 4f 73 46 69 6c 65 20 2a 69 64 2c 0a 20 20 63   OsFile *id,.  c
2ce0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 69 72 6e  onst char *zDirn
2cf0: 61 6d 65 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20  ame.){.  return 
2d00: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
2d10: 0a 2a 2a 20 49 66 20 74 68 65 20 66 6f 6c 6c 6f  .** If the follo
2d20: 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69  wing global vari
2d30: 61 62 6c 65 20 70 6f 69 6e 74 73 20 74 6f 20 61  able points to a
2d40: 20 73 74 72 69 6e 67 20 77 68 69 63 68 20 69 73   string which is
2d50: 20 74 68 65 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20   the.** name of 
2d60: 61 20 64 69 72 65 63 74 6f 72 79 2c 20 74 68 65  a directory, the
2d70: 6e 20 74 68 61 74 20 64 69 72 65 63 74 6f 72 79  n that directory
2d80: 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f   will be used to
2d90: 20 73 74 6f 72 65 0a 2a 2a 20 74 65 6d 70 6f 72   store.** tempor
2da0: 61 72 79 20 66 69 6c 65 73 2e 0a 2a 2f 0a 63 68  ary files..*/.ch
2db0: 61 72 20 2a 73 71 6c 69 74 65 33 5f 74 65 6d 70  ar *sqlite3_temp
2dc0: 5f 64 69 72 65 63 74 6f 72 79 20 3d 20 30 3b 0a  _directory = 0;.
2dd0: 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
2de0: 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6e  temporary file n
2df0: 61 6d 65 20 69 6e 20 7a 42 75 66 2e 20 20 7a 42  ame in zBuf.  zB
2e00: 75 66 20 6d 75 73 74 20 62 65 20 62 69 67 20 65  uf must be big e
2e10: 6e 6f 75 67 68 20 74 6f 0a 2a 2a 20 68 6f 6c 64  nough to.** hold
2e20: 20 61 74 20 6c 65 61 73 74 20 53 51 4c 49 54 45   at least SQLITE
2e30: 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 20 63  _TEMPNAME_SIZE c
2e40: 68 61 72 61 63 74 65 72 73 2e 0a 2a 2f 0a 69 6e  haracters..*/.in
2e50: 74 20 73 71 6c 69 74 65 33 57 69 6e 54 65 6d 70  t sqlite3WinTemp
2e60: 46 69 6c 65 4e 61 6d 65 28 63 68 61 72 20 2a 7a  FileName(char *z
2e70: 42 75 66 29 7b 0a 20 20 73 74 61 74 69 63 20 63  Buf){.  static c
2e80: 68 61 72 20 7a 43 68 61 72 73 5b 5d 20 3d 0a 20  har zChars[] =. 
2e90: 20 20 20 22 61 62 63 64 65 66 67 68 69 6a 6b 6c     "abcdefghijkl
2ea0: 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 22 0a  mnopqrstuvwxyz".
2eb0: 20 20 20 20 22 41 42 43 44 45 46 47 48 49 4a 4b      "ABCDEFGHIJK
2ec0: 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a 22  LMNOPQRSTUVWXYZ"
2ed0: 0a 20 20 20 20 22 30 31 32 33 34 35 36 37 38 39  .    "0123456789
2ee0: 22 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  ";.  int i, j;. 
2ef0: 20 63 68 61 72 20 7a 54 65 6d 70 50 61 74 68 5b   char zTempPath[
2f00: 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f  SQLITE_TEMPNAME_
2f10: 53 49 5a 45 5d 3b 0a 20 20 69 66 28 20 73 71 6c  SIZE];.  if( sql
2f20: 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74  ite3_temp_direct
2f30: 6f 72 79 20 29 7b 0a 20 20 20 20 73 74 72 6e 63  ory ){.    strnc
2f40: 70 79 28 7a 54 65 6d 70 50 61 74 68 2c 20 73 71  py(zTempPath, sq
2f50: 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63  lite3_temp_direc
2f60: 74 6f 72 79 2c 20 53 51 4c 49 54 45 5f 54 45 4d  tory, SQLITE_TEM
2f70: 50 4e 41 4d 45 5f 53 49 5a 45 2d 33 30 29 3b 0a  PNAME_SIZE-30);.
2f80: 20 20 20 20 7a 54 65 6d 70 50 61 74 68 5b 53 51      zTempPath[SQ
2f90: 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49  LITE_TEMPNAME_SI
2fa0: 5a 45 2d 33 30 5d 20 3d 20 30 3b 0a 20 20 7d 65  ZE-30] = 0;.  }e
2fb0: 6c 73 65 20 69 66 28 20 69 73 4e 54 28 29 20 29  lse if( isNT() )
2fc0: 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 75 6c  {.    char *zMul
2fd0: 74 69 3b 0a 20 20 20 20 57 43 48 41 52 20 7a 57  ti;.    WCHAR zW
2fe0: 69 64 65 50 61 74 68 5b 53 51 4c 49 54 45 5f 54  idePath[SQLITE_T
2ff0: 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 5d 3b 0a 20  EMPNAME_SIZE];. 
3000: 20 20 20 47 65 74 54 65 6d 70 50 61 74 68 57 28     GetTempPathW(
3010: 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f  SQLITE_TEMPNAME_
3020: 53 49 5a 45 2d 33 30 2c 20 7a 57 69 64 65 50 61  SIZE-30, zWidePa
3030: 74 68 29 3b 0a 20 20 20 20 7a 4d 75 6c 74 69 20  th);.    zMulti 
3040: 3d 20 75 6e 69 63 6f 64 65 54 6f 55 74 66 38 28  = unicodeToUtf8(
3050: 7a 57 69 64 65 50 61 74 68 29 3b 0a 20 20 20 20  zWidePath);.    
3060: 69 66 28 20 7a 4d 75 6c 74 69 20 29 7b 0a 20 20  if( zMulti ){.  
3070: 20 20 20 20 73 74 72 6e 63 70 79 28 7a 54 65 6d      strncpy(zTem
3080: 70 50 61 74 68 2c 20 7a 4d 75 6c 74 69 2c 20 53  pPath, zMulti, S
3090: 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53  QLITE_TEMPNAME_S
30a0: 49 5a 45 2d 33 30 29 3b 0a 20 20 20 20 20 20 7a  IZE-30);.      z
30b0: 54 65 6d 70 50 61 74 68 5b 53 51 4c 49 54 45 5f  TempPath[SQLITE_
30c0: 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 2d 33 30  TEMPNAME_SIZE-30
30d0: 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c  ] = 0;.      sql
30e0: 69 74 65 46 72 65 65 28 7a 4d 75 6c 74 69 29 3b  iteFree(zMulti);
30f0: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
3100: 20 20 20 20 47 65 74 54 65 6d 70 50 61 74 68 41      GetTempPathA
3110: 28 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45  (SQLITE_TEMPNAME
3120: 5f 53 49 5a 45 2d 33 30 2c 20 7a 54 65 6d 70 50  _SIZE-30, zTempP
3130: 61 74 68 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  ath);.  }.  for(
3140: 69 3d 73 74 72 6c 65 6e 28 7a 54 65 6d 70 50 61  i=strlen(zTempPa
3150: 74 68 29 3b 20 69 3e 30 20 26 26 20 7a 54 65 6d  th); i>0 && zTem
3160: 70 50 61 74 68 5b 69 2d 31 5d 3d 3d 27 5c 5c 27  pPath[i-1]=='\\'
3170: 3b 20 69 2d 2d 29 7b 7d 0a 20 20 7a 54 65 6d 70  ; i--){}.  zTemp
3180: 50 61 74 68 5b 69 5d 20 3d 20 30 3b 0a 20 20 66  Path[i] = 0;.  f
3190: 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 73 70 72 69  or(;;){.    spri
31a0: 6e 74 66 28 7a 42 75 66 2c 20 22 25 73 5c 5c 22  ntf(zBuf, "%s\\"
31b0: 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49 58  TEMP_FILE_PREFIX
31c0: 2c 20 7a 54 65 6d 70 50 61 74 68 29 3b 0a 20 20  , zTempPath);.  
31d0: 20 20 6a 20 3d 20 73 74 72 6c 65 6e 28 7a 42 75    j = strlen(zBu
31e0: 66 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52  f);.    sqlite3R
31f0: 61 6e 64 6f 6d 6e 65 73 73 28 31 35 2c 20 26 7a  andomness(15, &z
3200: 42 75 66 5b 6a 5d 29 3b 0a 20 20 20 20 66 6f 72  Buf[j]);.    for
3210: 28 69 3d 30 3b 20 69 3c 31 35 3b 20 69 2b 2b 2c  (i=0; i<15; i++,
3220: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 7a 42 75   j++){.      zBu
3230: 66 5b 6a 5d 20 3d 20 28 63 68 61 72 29 7a 43 68  f[j] = (char)zCh
3240: 61 72 73 5b 20 28 28 75 6e 73 69 67 6e 65 64 20  ars[ ((unsigned 
3250: 63 68 61 72 29 7a 42 75 66 5b 6a 5d 29 25 28 73  char)zBuf[j])%(s
3260: 69 7a 65 6f 66 28 7a 43 68 61 72 73 29 2d 31 29  izeof(zChars)-1)
3270: 20 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 42   ];.    }.    zB
3280: 75 66 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 69  uf[j] = 0;.    i
3290: 66 28 20 21 73 71 6c 69 74 65 33 4f 73 46 69 6c  f( !sqlite3OsFil
32a0: 65 45 78 69 73 74 73 28 7a 42 75 66 29 20 29 20  eExists(zBuf) ) 
32b0: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 54 52 41  break;.  }.  TRA
32c0: 43 45 32 28 22 54 45 4d 50 20 46 49 4c 45 4e 41  CE2("TEMP FILENA
32d0: 4d 45 3a 20 25 73 5c 6e 22 2c 20 7a 42 75 66 29  ME: %s\n", zBuf)
32e0: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
32f0: 45 5f 4f 4b 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  E_OK; .}../*.** 
3300: 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2f  Close a file..*/
3310: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 43  .static int winC
3320: 6c 6f 73 65 28 4f 73 46 69 6c 65 20 2a 2a 70 49  lose(OsFile **pI
3330: 64 29 7b 0a 20 20 77 69 6e 46 69 6c 65 20 2a 70  d){.  winFile *p
3340: 46 69 6c 65 3b 0a 20 20 69 66 28 20 70 49 64 20  File;.  if( pId 
3350: 26 26 20 28 70 46 69 6c 65 20 3d 20 28 77 69 6e  && (pFile = (win
3360: 46 69 6c 65 2a 29 2a 70 49 64 29 21 3d 30 20 29  File*)*pId)!=0 )
3370: 7b 0a 20 20 20 20 54 52 41 43 45 32 28 22 43 4c  {.    TRACE2("CL
3380: 4f 53 45 20 25 64 5c 6e 22 2c 20 70 46 69 6c 65  OSE %d\n", pFile
3390: 2d 3e 68 29 3b 0a 20 20 20 20 43 6c 6f 73 65 48  ->h);.    CloseH
33a0: 61 6e 64 6c 65 28 70 46 69 6c 65 2d 3e 68 29 3b  andle(pFile->h);
33b0: 0a 23 69 66 20 4f 53 5f 57 49 4e 43 45 0a 20 20  .#if OS_WINCE.  
33c0: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 7a 44 65    if( pFile->zDe
33d0: 6c 65 74 65 4f 6e 43 6c 6f 73 65 20 29 7b 0a 20  leteOnClose ){. 
33e0: 20 20 20 20 20 44 65 6c 65 74 65 46 69 6c 65 57       DeleteFileW
33f0: 28 70 46 69 6c 65 2d 3e 7a 44 65 6c 65 74 65 4f  (pFile->zDeleteO
3400: 6e 43 6c 6f 73 65 29 3b 0a 20 20 20 20 20 20 73  nClose);.      s
3410: 71 6c 69 74 65 46 72 65 65 28 70 46 69 6c 65 2d  qliteFree(pFile-
3420: 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f 73 65 29  >zDeleteOnClose)
3430: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
3440: 20 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2d     OpenCounter(-
3450: 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  1);.    sqliteFr
3460: 65 65 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 2a  ee(pFile);.    *
3470: 70 49 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  pId = 0;.  }.  r
3480: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
3490: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 64  .}../*.** Read d
34a0: 61 74 61 20 66 72 6f 6d 20 61 20 66 69 6c 65 20  ata from a file 
34b0: 69 6e 74 6f 20 61 20 62 75 66 66 65 72 2e 20 20  into a buffer.  
34c0: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
34d0: 20 69 66 20 61 6c 6c 0a 2a 2a 20 62 79 74 65 73   if all.** bytes
34e0: 20 77 65 72 65 20 72 65 61 64 20 73 75 63 63 65   were read succe
34f0: 73 73 66 75 6c 6c 79 20 61 6e 64 20 53 51 4c 49  ssfully and SQLI
3500: 54 45 5f 49 4f 45 52 52 20 69 66 20 61 6e 79 74  TE_IOERR if anyt
3510: 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f  hing goes.** wro
3520: 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
3530: 74 20 77 69 6e 52 65 61 64 28 4f 73 46 69 6c 65  t winRead(OsFile
3540: 20 2a 69 64 2c 20 76 6f 69 64 20 2a 70 42 75 66   *id, void *pBuf
3550: 2c 20 69 6e 74 20 61 6d 74 29 7b 0a 20 20 44 57  , int amt){.  DW
3560: 4f 52 44 20 67 6f 74 3b 0a 20 20 61 73 73 65 72  ORD got;.  asser
3570: 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 53 69  t( id!=0 );.  Si
3580: 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 53 51  mulateIOError(SQ
3590: 4c 49 54 45 5f 49 4f 45 52 52 29 3b 0a 20 20 54  LITE_IOERR);.  T
35a0: 52 41 43 45 33 28 22 52 45 41 44 20 25 64 20 6c  RACE3("READ %d l
35b0: 6f 63 6b 3d 25 64 5c 6e 22 2c 20 28 28 77 69 6e  ock=%d\n", ((win
35c0: 46 69 6c 65 2a 29 69 64 29 2d 3e 68 2c 20 28 28  File*)id)->h, ((
35d0: 77 69 6e 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 6f  winFile*)id)->lo
35e0: 63 6b 74 79 70 65 29 3b 0a 20 20 69 66 28 20 21  cktype);.  if( !
35f0: 52 65 61 64 46 69 6c 65 28 28 28 77 69 6e 46 69  ReadFile(((winFi
3600: 6c 65 2a 29 69 64 29 2d 3e 68 2c 20 70 42 75 66  le*)id)->h, pBuf
3610: 2c 20 61 6d 74 2c 20 26 67 6f 74 2c 20 30 29 20  , amt, &got, 0) 
3620: 29 7b 0a 20 20 20 20 67 6f 74 20 3d 20 30 3b 0a  ){.    got = 0;.
3630: 20 20 7d 0a 20 20 69 66 28 20 67 6f 74 3d 3d 28    }.  if( got==(
3640: 44 57 4f 52 44 29 61 6d 74 20 29 7b 0a 20 20 20  DWORD)amt ){.   
3650: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
3660: 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  K;.  }else{.    
3670: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
3680: 45 52 52 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ERR;.  }.}../*.*
3690: 2a 20 57 72 69 74 65 20 64 61 74 61 20 66 72 6f  * Write data fro
36a0: 6d 20 61 20 62 75 66 66 65 72 20 69 6e 74 6f 20  m a buffer into 
36b0: 61 20 66 69 6c 65 2e 20 20 52 65 74 75 72 6e 20  a file.  Return 
36c0: 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
36d0: 63 65 73 73 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20  cess.** or some 
36e0: 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65  other error code
36f0: 20 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a   on failure..*/.
3700: 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 57 72  static int winWr
3710: 69 74 65 28 4f 73 46 69 6c 65 20 2a 69 64 2c 20  ite(OsFile *id, 
3720: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 75 66  const void *pBuf
3730: 2c 20 69 6e 74 20 61 6d 74 29 7b 0a 20 20 69 6e  , int amt){.  in
3740: 74 20 72 63 20 3d 20 30 3b 0a 20 20 44 57 4f 52  t rc = 0;.  DWOR
3750: 44 20 77 72 6f 74 65 3b 0a 20 20 61 73 73 65 72  D wrote;.  asser
3760: 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 53 69  t( id!=0 );.  Si
3770: 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 53 51  mulateIOError(SQ
3780: 4c 49 54 45 5f 49 4f 45 52 52 29 3b 0a 20 20 53  LITE_IOERR);.  S
3790: 69 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45  imulateDiskfullE
37a0: 72 72 6f 72 3b 0a 20 20 54 52 41 43 45 33 28 22  rror;.  TRACE3("
37b0: 57 52 49 54 45 20 25 64 20 6c 6f 63 6b 3d 25 64  WRITE %d lock=%d
37c0: 5c 6e 22 2c 20 28 28 77 69 6e 46 69 6c 65 2a 29  \n", ((winFile*)
37d0: 69 64 29 2d 3e 68 2c 20 28 28 77 69 6e 46 69 6c  id)->h, ((winFil
37e0: 65 2a 29 69 64 29 2d 3e 6c 6f 63 6b 74 79 70 65  e*)id)->locktype
37f0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 6d 74  );.  assert( amt
3800: 3e 30 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 61  >0 );.  while( a
3810: 6d 74 3e 30 20 26 26 20 28 72 63 20 3d 20 57 72  mt>0 && (rc = Wr
3820: 69 74 65 46 69 6c 65 28 28 28 77 69 6e 46 69 6c  iteFile(((winFil
3830: 65 2a 29 69 64 29 2d 3e 68 2c 20 70 42 75 66 2c  e*)id)->h, pBuf,
3840: 20 61 6d 74 2c 20 26 77 72 6f 74 65 2c 20 30 29   amt, &wrote, 0)
3850: 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26  )!=0.         &&
3860: 20 77 72 6f 74 65 3e 30 20 29 7b 0a 20 20 20 20   wrote>0 ){.    
3870: 61 6d 74 20 2d 3d 20 77 72 6f 74 65 3b 0a 20 20  amt -= wrote;.  
3880: 20 20 70 42 75 66 20 3d 20 26 28 28 63 68 61 72    pBuf = &((char
3890: 2a 29 70 42 75 66 29 5b 77 72 6f 74 65 5d 3b 0a  *)pBuf)[wrote];.
38a0: 20 20 7d 0a 20 20 69 66 28 20 21 72 63 20 7c 7c    }.  if( !rc ||
38b0: 20 61 6d 74 3e 28 69 6e 74 29 77 72 6f 74 65 20   amt>(int)wrote 
38c0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
38d0: 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 7d 0a 20  LITE_FULL;.  }. 
38e0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
38f0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65  K;.}../*.** Some
3900: 20 6d 69 63 72 6f 73 6f 66 74 20 63 6f 6d 70 69   microsoft compi
3910: 6c 65 72 73 20 6c 61 63 6b 20 74 68 69 73 20 64  lers lack this d
3920: 65 66 69 6e 69 74 69 6f 6e 2e 0a 2a 2f 0a 23 69  efinition..*/.#i
3930: 66 6e 64 65 66 20 49 4e 56 41 4c 49 44 5f 53 45  fndef INVALID_SE
3940: 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 0a 23  T_FILE_POINTER.#
3950: 20 64 65 66 69 6e 65 20 49 4e 56 41 4c 49 44 5f   define INVALID_
3960: 53 45 54 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52  SET_FILE_POINTER
3970: 20 28 28 44 57 4f 52 44 29 2d 31 29 0a 23 65 6e   ((DWORD)-1).#en
3980: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  dif../*.** Move 
3990: 74 68 65 20 72 65 61 64 2f 77 72 69 74 65 20 70  the read/write p
39a0: 6f 69 6e 74 65 72 20 69 6e 20 61 20 66 69 6c 65  ointer in a file
39b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
39c0: 77 69 6e 53 65 65 6b 28 4f 73 46 69 6c 65 20 2a  winSeek(OsFile *
39d0: 69 64 2c 20 69 36 34 20 6f 66 66 73 65 74 29 7b  id, i64 offset){
39e0: 0a 20 20 4c 4f 4e 47 20 75 70 70 65 72 42 69 74  .  LONG upperBit
39f0: 73 20 3d 20 6f 66 66 73 65 74 3e 3e 33 32 3b 0a  s = offset>>32;.
3a00: 20 20 4c 4f 4e 47 20 6c 6f 77 65 72 42 69 74 73    LONG lowerBits
3a10: 20 3d 20 6f 66 66 73 65 74 20 26 20 30 78 66 66   = offset & 0xff
3a20: 66 66 66 66 66 66 3b 0a 20 20 44 57 4f 52 44 20  ffffff;.  DWORD 
3a30: 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64  rc;.  assert( id
3a40: 21 3d 30 20 29 3b 0a 23 69 66 64 65 66 20 53 51  !=0 );.#ifdef SQ
3a50: 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28 20  LITE_TEST.  if( 
3a60: 6f 66 66 73 65 74 20 29 20 53 69 6d 75 6c 61 74  offset ) Simulat
3a70: 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 0a 23  eDiskfullError.#
3a80: 65 6e 64 69 66 0a 20 20 53 45 45 4b 28 6f 66 66  endif.  SEEK(off
3a90: 73 65 74 2f 31 30 32 34 20 2b 20 31 29 3b 0a 20  set/1024 + 1);. 
3aa0: 20 72 63 20 3d 20 53 65 74 46 69 6c 65 50 6f 69   rc = SetFilePoi
3ab0: 6e 74 65 72 28 28 28 77 69 6e 46 69 6c 65 2a 29  nter(((winFile*)
3ac0: 69 64 29 2d 3e 68 2c 20 6c 6f 77 65 72 42 69 74  id)->h, lowerBit
3ad0: 73 2c 20 26 75 70 70 65 72 42 69 74 73 2c 20 46  s, &upperBits, F
3ae0: 49 4c 45 5f 42 45 47 49 4e 29 3b 0a 20 20 54 52  ILE_BEGIN);.  TR
3af0: 41 43 45 33 28 22 53 45 45 4b 20 25 64 20 25 6c  ACE3("SEEK %d %l
3b00: 6c 64 5c 6e 22 2c 20 28 28 77 69 6e 46 69 6c 65  ld\n", ((winFile
3b10: 2a 29 69 64 29 2d 3e 68 2c 20 6f 66 66 73 65 74  *)id)->h, offset
3b20: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 49 4e 56  );.  if( rc==INV
3b30: 41 4c 49 44 5f 53 45 54 5f 46 49 4c 45 5f 50 4f  ALID_SET_FILE_PO
3b40: 49 4e 54 45 52 20 26 26 20 47 65 74 4c 61 73 74  INTER && GetLast
3b50: 45 72 72 6f 72 28 29 21 3d 4e 4f 5f 45 52 52 4f  Error()!=NO_ERRO
3b60: 52 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  R ){.    return 
3b70: 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 7d  SQLITE_FULL;.  }
3b80: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
3b90: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  _OK;.}../*.** Ma
3ba0: 6b 65 20 73 75 72 65 20 61 6c 6c 20 77 72 69 74  ke sure all writ
3bb0: 65 73 20 74 6f 20 61 20 70 61 72 74 69 63 75 6c  es to a particul
3bc0: 61 72 20 66 69 6c 65 20 61 72 65 20 63 6f 6d 6d  ar file are comm
3bd0: 69 74 74 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a  itted to disk..*
3be0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
3bf0: 53 79 6e 63 28 4f 73 46 69 6c 65 20 2a 69 64 2c  Sync(OsFile *id,
3c00: 20 69 6e 74 20 64 61 74 61 4f 6e 6c 79 29 7b 0a   int dataOnly){.
3c10: 20 20 61 73 73 65 72 74 28 20 69 64 21 3d 30 20    assert( id!=0 
3c20: 29 3b 0a 20 20 54 52 41 43 45 33 28 22 53 59 4e  );.  TRACE3("SYN
3c30: 43 20 25 64 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c  C %d lock=%d\n",
3c40: 20 28 28 77 69 6e 46 69 6c 65 2a 29 69 64 29 2d   ((winFile*)id)-
3c50: 3e 68 2c 20 28 28 77 69 6e 46 69 6c 65 2a 29 69  >h, ((winFile*)i
3c60: 64 29 2d 3e 6c 6f 63 6b 74 79 70 65 29 3b 0a 20  d)->locktype);. 
3c70: 20 69 66 28 20 46 6c 75 73 68 46 69 6c 65 42 75   if( FlushFileBu
3c80: 66 66 65 72 73 28 28 28 77 69 6e 46 69 6c 65 2a  ffers(((winFile*
3c90: 29 69 64 29 2d 3e 68 29 20 29 7b 0a 20 20 20 20  )id)->h) ){.    
3ca0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
3cb0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
3cc0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
3cd0: 52 52 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  RR;.  }.}../*.**
3ce0: 20 53 79 6e 63 20 74 68 65 20 64 69 72 65 63 74   Sync the direct
3cf0: 6f 72 79 20 7a 44 69 72 6e 61 6d 65 2e 20 54 68  ory zDirname. Th
3d00: 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 6f 6e  is is a no-op on
3d10: 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
3d20: 6d 73 20 6f 74 68 65 72 0a 2a 2a 20 74 68 61 6e  ms other.** than
3d30: 20 55 4e 49 58 2e 0a 2a 2f 0a 69 6e 74 20 73 71   UNIX..*/.int sq
3d40: 6c 69 74 65 33 57 69 6e 53 79 6e 63 44 69 72 65  lite3WinSyncDire
3d50: 63 74 6f 72 79 28 63 6f 6e 73 74 20 63 68 61 72  ctory(const char
3d60: 20 2a 7a 44 69 72 6e 61 6d 65 29 7b 0a 20 20 53   *zDirname){.  S
3d70: 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 53  imulateIOError(S
3d80: 51 4c 49 54 45 5f 49 4f 45 52 52 29 3b 0a 20 20  QLITE_IOERR);.  
3d90: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
3da0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63  ;.}../*.** Trunc
3db0: 61 74 65 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65  ate an open file
3dc0: 20 74 6f 20 61 20 73 70 65 63 69 66 69 65 64 20   to a specified 
3dd0: 73 69 7a 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69  size.*/.static i
3de0: 6e 74 20 77 69 6e 54 72 75 6e 63 61 74 65 28 4f  nt winTruncate(O
3df0: 73 46 69 6c 65 20 2a 69 64 2c 20 69 36 34 20 6e  sFile *id, i64 n
3e00: 42 79 74 65 29 7b 0a 20 20 4c 4f 4e 47 20 75 70  Byte){.  LONG up
3e10: 70 65 72 42 69 74 73 20 3d 20 6e 42 79 74 65 3e  perBits = nByte>
3e20: 3e 33 32 3b 0a 20 20 61 73 73 65 72 74 28 20 69  >32;.  assert( i
3e30: 64 21 3d 30 20 29 3b 0a 20 20 54 52 41 43 45 33  d!=0 );.  TRACE3
3e40: 28 22 54 52 55 4e 43 41 54 45 20 25 64 20 25 6c  ("TRUNCATE %d %l
3e50: 6c 64 5c 6e 22 2c 20 28 28 77 69 6e 46 69 6c 65  ld\n", ((winFile
3e60: 2a 29 69 64 29 2d 3e 68 2c 20 6e 42 79 74 65 29  *)id)->h, nByte)
3e70: 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
3e80: 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
3e90: 29 3b 0a 20 20 53 65 74 46 69 6c 65 50 6f 69 6e  );.  SetFilePoin
3ea0: 74 65 72 28 28 28 77 69 6e 46 69 6c 65 2a 29 69  ter(((winFile*)i
3eb0: 64 29 2d 3e 68 2c 20 6e 42 79 74 65 2c 20 26 75  d)->h, nByte, &u
3ec0: 70 70 65 72 42 69 74 73 2c 20 46 49 4c 45 5f 42  pperBits, FILE_B
3ed0: 45 47 49 4e 29 3b 0a 20 20 53 65 74 45 6e 64 4f  EGIN);.  SetEndO
3ee0: 66 46 69 6c 65 28 28 28 77 69 6e 46 69 6c 65 2a  fFile(((winFile*
3ef0: 29 69 64 29 2d 3e 68 29 3b 0a 20 20 72 65 74 75  )id)->h);.  retu
3f00: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
3f10: 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65  ./*.** Determine
3f20: 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a   the current siz
3f30: 65 20 6f 66 20 61 20 66 69 6c 65 20 69 6e 20 62  e of a file in b
3f40: 79 74 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ytes.*/.static i
3f50: 6e 74 20 77 69 6e 46 69 6c 65 53 69 7a 65 28 4f  nt winFileSize(O
3f60: 73 46 69 6c 65 20 2a 69 64 2c 20 69 36 34 20 2a  sFile *id, i64 *
3f70: 70 53 69 7a 65 29 7b 0a 20 20 44 57 4f 52 44 20  pSize){.  DWORD 
3f80: 75 70 70 65 72 42 69 74 73 2c 20 6c 6f 77 65 72  upperBits, lower
3f90: 42 69 74 73 3b 0a 20 20 61 73 73 65 72 74 28 20  Bits;.  assert( 
3fa0: 69 64 21 3d 30 20 29 3b 0a 20 20 53 69 6d 75 6c  id!=0 );.  Simul
3fb0: 61 74 65 49 4f 45 72 72 6f 72 28 53 51 4c 49 54  ateIOError(SQLIT
3fc0: 45 5f 49 4f 45 52 52 29 3b 0a 20 20 6c 6f 77 65  E_IOERR);.  lowe
3fd0: 72 42 69 74 73 20 3d 20 47 65 74 46 69 6c 65 53  rBits = GetFileS
3fe0: 69 7a 65 28 28 28 77 69 6e 46 69 6c 65 2a 29 69  ize(((winFile*)i
3ff0: 64 29 2d 3e 68 2c 20 26 75 70 70 65 72 42 69 74  d)->h, &upperBit
4000: 73 29 3b 0a 20 20 2a 70 53 69 7a 65 20 3d 20 28  s);.  *pSize = (
4010: 28 28 69 36 34 29 75 70 70 65 72 42 69 74 73 29  ((i64)upperBits)
4020: 3c 3c 33 32 29 20 2b 20 6c 6f 77 65 72 42 69 74  <<32) + lowerBit
4030: 73 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  s;.  return SQLI
4040: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
4050: 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d  LOCKFILE_FAIL_IM
4060: 4d 45 44 49 41 54 45 4c 59 20 69 73 20 75 6e 64  MEDIATELY is und
4070: 65 66 69 6e 65 64 20 6f 6e 20 73 6f 6d 65 20 57  efined on some W
4080: 69 6e 64 6f 77 73 20 73 79 73 74 65 6d 73 2e 0a  indows systems..
4090: 2a 2f 0a 23 69 66 6e 64 65 66 20 4c 4f 43 4b 46  */.#ifndef LOCKF
40a0: 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44 49 41  ILE_FAIL_IMMEDIA
40b0: 54 45 4c 59 0a 23 20 64 65 66 69 6e 65 20 4c 4f  TELY.# define LO
40c0: 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45  CKFILE_FAIL_IMME
40d0: 44 49 41 54 45 4c 59 20 31 0a 23 65 6e 64 69 66  DIATELY 1.#endif
40e0: 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20  ../*.** Acquire 
40f0: 61 20 72 65 61 64 65 72 20 6c 6f 63 6b 2e 0a 2a  a reader lock..*
4100: 2a 20 44 69 66 66 65 72 65 6e 74 20 41 50 49 20  * Different API 
4110: 72 6f 75 74 69 6e 65 73 20 61 72 65 20 63 61 6c  routines are cal
4120: 6c 65 64 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  led depending on
4130: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
4140: 74 68 69 73 0a 2a 2a 20 69 73 20 57 69 6e 39 35  this.** is Win95
4150: 20 6f 72 20 57 69 6e 4e 54 2e 0a 2a 2f 0a 73 74   or WinNT..*/.st
4160: 61 74 69 63 20 69 6e 74 20 67 65 74 52 65 61 64  atic int getRead
4170: 4c 6f 63 6b 28 77 69 6e 46 69 6c 65 20 2a 69 64  Lock(winFile *id
4180: 29 7b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20  ){.  int res;.  
4190: 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20  if( isNT() ){.  
41a0: 20 20 4f 56 45 52 4c 41 50 50 45 44 20 6f 76 6c    OVERLAPPED ovl
41b0: 70 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f 66 66 73  p;.    ovlp.Offs
41c0: 65 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53  et = SHARED_FIRS
41d0: 54 3b 0a 20 20 20 20 6f 76 6c 70 2e 4f 66 66 73  T;.    ovlp.Offs
41e0: 65 74 48 69 67 68 20 3d 20 30 3b 0a 20 20 20 20  etHigh = 0;.    
41f0: 6f 76 6c 70 2e 68 45 76 65 6e 74 20 3d 20 30 3b  ovlp.hEvent = 0;
4200: 0a 20 20 20 20 72 65 73 20 3d 20 4c 6f 63 6b 46  .    res = LockF
4210: 69 6c 65 45 78 28 69 64 2d 3e 68 2c 20 4c 4f 43  ileEx(id->h, LOC
4220: 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d 45 44  KFILE_FAIL_IMMED
4230: 49 41 54 45 4c 59 2c 20 30 2c 20 53 48 41 52 45  IATELY, 0, SHARE
4240: 44 5f 53 49 5a 45 2c 30 2c 26 6f 76 6c 70 29 3b  D_SIZE,0,&ovlp);
4250: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
4260: 74 20 6c 6b 3b 0a 20 20 20 20 73 71 6c 69 74 65  t lk;.    sqlite
4270: 33 52 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65  3Randomness(size
4280: 6f 66 28 6c 6b 29 2c 20 26 6c 6b 29 3b 0a 20 20  of(lk), &lk);.  
4290: 20 20 69 64 2d 3e 73 68 61 72 65 64 4c 6f 63 6b    id->sharedLock
42a0: 42 79 74 65 20 3d 20 28 6c 6b 20 26 20 30 78 37  Byte = (lk & 0x7
42b0: 66 66 66 66 66 66 66 29 25 28 53 48 41 52 45 44  fffffff)%(SHARED
42c0: 5f 53 49 5a 45 20 2d 20 31 29 3b 0a 20 20 20 20  _SIZE - 1);.    
42d0: 72 65 73 20 3d 20 4c 6f 63 6b 46 69 6c 65 28 69  res = LockFile(i
42e0: 64 2d 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52  d->h, SHARED_FIR
42f0: 53 54 2b 69 64 2d 3e 73 68 61 72 65 64 4c 6f 63  ST+id->sharedLoc
4300: 6b 42 79 74 65 2c 20 30 2c 20 31 2c 20 30 29 3b  kByte, 0, 1, 0);
4310: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65  .  }.  return re
4320: 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 64 6f  s;.}../*.** Undo
4330: 20 61 20 72 65 61 64 6c 6f 63 6b 0a 2a 2f 0a 73   a readlock.*/.s
4340: 74 61 74 69 63 20 69 6e 74 20 75 6e 6c 6f 63 6b  tatic int unlock
4350: 52 65 61 64 4c 6f 63 6b 28 77 69 6e 46 69 6c 65  ReadLock(winFile
4360: 20 2a 70 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20   *pFile){.  int 
4370: 72 65 73 3b 0a 20 20 69 66 28 20 69 73 4e 54 28  res;.  if( isNT(
4380: 29 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 55  ) ){.    res = U
4390: 6e 6c 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d  nlockFile(pFile-
43a0: 3e 68 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54  >h, SHARED_FIRST
43b0: 2c 20 30 2c 20 53 48 41 52 45 44 5f 53 49 5a 45  , 0, SHARED_SIZE
43c0: 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  , 0);.  }else{. 
43d0: 20 20 20 72 65 73 20 3d 20 55 6e 6c 6f 63 6b 46     res = UnlockF
43e0: 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20 53 48  ile(pFile->h, SH
43f0: 41 52 45 44 5f 46 49 52 53 54 20 2b 20 70 46 69  ARED_FIRST + pFi
4400: 6c 65 2d 3e 73 68 61 72 65 64 4c 6f 63 6b 42 79  le->sharedLockBy
4410: 74 65 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20  te, 0, 1, 0);.  
4420: 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a  }.  return res;.
4430: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
4440: 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41  E_OMIT_PAGER_PRA
4450: 47 4d 41 53 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  GMAS./*.** Check
4460: 20 74 68 61 74 20 61 20 67 69 76 65 6e 20 70 61   that a given pa
4470: 74 68 6e 61 6d 65 20 69 73 20 61 20 64 69 72 65  thname is a dire
4480: 63 74 6f 72 79 20 61 6e 64 20 69 73 20 77 72 69  ctory and is wri
4490: 74 61 62 6c 65 20 0a 2a 2a 0a 2a 2f 0a 69 6e 74  table .**.*/.int
44a0: 20 73 71 6c 69 74 65 33 57 69 6e 49 73 44 69 72   sqlite3WinIsDir
44b0: 57 72 69 74 61 62 6c 65 28 63 68 61 72 20 2a 7a  Writable(char *z
44c0: 44 69 72 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20  Dirname){.  int 
44d0: 66 69 6c 65 41 74 74 72 3b 0a 20 20 57 43 48 41  fileAttr;.  WCHA
44e0: 52 20 2a 7a 57 69 64 65 3b 0a 20 20 69 66 28 20  R *zWide;.  if( 
44f0: 7a 44 69 72 6e 61 6d 65 3d 3d 30 20 29 20 72 65  zDirname==0 ) re
4500: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 69  turn 0;.  if( !i
4510: 73 4e 54 28 29 20 26 26 20 73 74 72 6c 65 6e 28  sNT() && strlen(
4520: 7a 44 69 72 6e 61 6d 65 29 3e 4d 41 58 5f 50 41  zDirname)>MAX_PA
4530: 54 48 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  TH ) return 0;. 
4540: 20 7a 57 69 64 65 20 3d 20 75 74 66 38 54 6f 55   zWide = utf8ToU
4550: 6e 69 63 6f 64 65 28 7a 44 69 72 6e 61 6d 65 29  nicode(zDirname)
4560: 3b 0a 20 20 69 66 28 20 7a 57 69 64 65 20 29 7b  ;.  if( zWide ){
4570: 0a 20 20 20 20 66 69 6c 65 41 74 74 72 20 3d 20  .    fileAttr = 
4580: 47 65 74 46 69 6c 65 41 74 74 72 69 62 75 74 65  GetFileAttribute
4590: 73 57 28 7a 57 69 64 65 29 3b 0a 20 20 20 20 73  sW(zWide);.    s
45a0: 71 6c 69 74 65 46 72 65 65 28 7a 57 69 64 65 29  qliteFree(zWide)
45b0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 23 69 66 20 4f  ;.  }else{.#if O
45c0: 53 5f 57 49 4e 43 45 0a 20 20 20 20 72 65 74 75  S_WINCE.    retu
45d0: 72 6e 20 30 3b 0a 23 65 6c 73 65 0a 20 20 20 20  rn 0;.#else.    
45e0: 66 69 6c 65 41 74 74 72 20 3d 20 47 65 74 46 69  fileAttr = GetFi
45f0: 6c 65 41 74 74 72 69 62 75 74 65 73 41 28 7a 44  leAttributesA(zD
4600: 69 72 6e 61 6d 65 29 3b 0a 23 65 6e 64 69 66 0a  irname);.#endif.
4610: 20 20 7d 0a 20 20 69 66 28 20 66 69 6c 65 41 74    }.  if( fileAt
4620: 74 72 20 3d 3d 20 30 78 66 66 66 66 66 66 66 66  tr == 0xffffffff
4630: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
4640: 66 28 20 28 66 69 6c 65 41 74 74 72 20 26 20 46  f( (fileAttr & F
4650: 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 44 49  ILE_ATTRIBUTE_DI
4660: 52 45 43 54 4f 52 59 29 20 21 3d 20 46 49 4c 45  RECTORY) != FILE
4670: 5f 41 54 54 52 49 42 55 54 45 5f 44 49 52 45 43  _ATTRIBUTE_DIREC
4680: 54 4f 52 59 20 29 7b 0a 20 20 20 20 72 65 74 75  TORY ){.    retu
4690: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 0;.  }.  retu
46a0: 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rn 1;.}.#endif /
46b0: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41  * SQLITE_OMIT_PA
46c0: 47 45 52 5f 50 52 41 47 4d 41 53 20 2a 2f 0a 0a  GER_PRAGMAS */..
46d0: 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66  /*.** Lock the f
46e0: 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63  ile with the loc
46f0: 6b 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70  k specified by p
4700: 61 72 61 6d 65 74 65 72 20 6c 6f 63 6b 74 79 70  arameter locktyp
4710: 65 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68  e - one.** of th
4720: 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
4730: 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45  **     (1) SHARE
4740: 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32  D_LOCK.**     (2
4750: 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a  ) RESERVED_LOCK.
4760: 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49  **     (3) PENDI
4770: 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  NG_LOCK.**     (
4780: 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  4) EXCLUSIVE_LOC
4790: 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65  K.**.** Sometime
47a0: 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e  s when requestin
47b0: 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65  g one lock state
47c0: 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63  , additional loc
47d0: 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20  k states.** are 
47e0: 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77  inserted in betw
47f0: 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e  een.  The lockin
4800: 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20  g might fail on 
4810: 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72  one of the later
4820: 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
4830: 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b  leaving the lock
4840: 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74   state different
4850: 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74   from what it st
4860: 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69  arted but.** sti
4870: 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20  ll short of its 
4880: 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  goal.  The follo
4890: 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73  wing chart shows
48a0: 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20   the allowed.** 
48b0: 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20  transitions and 
48c0: 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74  the inserted int
48d0: 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73  ermediate states
48e0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43  :.**.**    UNLOC
48f0: 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a  KED -> SHARED.**
4900: 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45      SHARED -> RE
4910: 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41  SERVED.**    SHA
4920: 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  RED -> (PENDING)
4930: 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
4940: 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20      RESERVED -> 
4950: 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
4960: 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e  LUSIVE.**    PEN
4970: 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56  DING -> EXCLUSIV
4980: 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  E.**.** This rou
4990: 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69  tine will only i
49a0: 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20  ncrease a lock. 
49b0: 20 54 68 65 20 77 69 6e 55 6e 6c 6f 63 6b 28 29   The winUnlock()
49c0: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 65 72 61 73   routine.** eras
49d0: 65 73 20 61 6c 6c 20 6c 6f 63 6b 73 20 61 74 20  es all locks at 
49e0: 6f 6e 63 65 20 61 6e 64 20 72 65 74 75 72 6e 73  once and returns
49f0: 20 75 73 20 69 6d 6d 65 64 69 61 74 65 6c 79 20   us immediately 
4a00: 74 6f 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  to locking level
4a10: 20 30 2e 0a 2a 2a 20 49 74 20 69 73 20 6e 6f 74   0..** It is not
4a20: 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 6c 6f 77   possible to low
4a30: 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  er the locking l
4a40: 65 76 65 6c 20 6f 6e 65 20 73 74 65 70 20 61 74  evel one step at
4a50: 20 61 20 74 69 6d 65 2e 20 20 59 6f 75 0a 2a 2a   a time.  You.**
4a60: 20 6d 75 73 74 20 67 6f 20 73 74 72 61 69 67 68   must go straigh
4a70: 74 20 74 6f 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  t to locking lev
4a80: 65 6c 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  el 0..*/.static 
4a90: 69 6e 74 20 77 69 6e 4c 6f 63 6b 28 4f 73 46 69  int winLock(OsFi
4aa0: 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6c 6f 63 6b  le *id, int lock
4ab0: 74 79 70 65 29 7b 0a 20 20 69 6e 74 20 72 63 20  type){.  int rc 
4ac0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
4ad0: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66  /* Return code f
4ae0: 72 6f 6d 20 73 75 62 72 6f 75 74 69 6e 65 73 20  rom subroutines 
4af0: 2a 2f 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 31  */.  int res = 1
4b00: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  ;           /* R
4b10: 65 73 75 6c 74 20 6f 66 20 61 20 77 69 6e 64 6f  esult of a windo
4b20: 77 73 20 6c 6f 63 6b 20 63 61 6c 6c 20 2a 2f 0a  ws lock call */.
4b30: 20 20 69 6e 74 20 6e 65 77 4c 6f 63 6b 74 79 70    int newLocktyp
4b40: 65 3b 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20  e;       /* Set 
4b50: 69 64 2d 3e 6c 6f 63 6b 74 79 70 65 20 74 6f 20  id->locktype to 
4b60: 74 68 69 73 20 76 61 6c 75 65 20 62 65 66 6f 72  this value befor
4b70: 65 20 65 78 69 74 69 6e 67 20 2a 2f 0a 20 20 69  e exiting */.  i
4b80: 6e 74 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63  nt gotPendingLoc
4b90: 6b 20 3d 20 30 3b 2f 2a 20 54 72 75 65 20 69 66  k = 0;/* True if
4ba0: 20 77 65 20 61 63 71 75 69 72 65 64 20 61 20 50   we acquired a P
4bb0: 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 74 68 69 73  ENDING lock this
4bc0: 20 74 69 6d 65 20 2a 2f 0a 20 20 77 69 6e 46 69   time */.  winFi
4bd0: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 77 69 6e  le *pFile = (win
4be0: 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 61 73 73  File*)id;..  ass
4bf0: 65 72 74 28 20 70 46 69 6c 65 21 3d 30 20 29 3b  ert( pFile!=0 );
4c00: 0a 20 20 54 52 41 43 45 35 28 22 4c 4f 43 4b 20  .  TRACE5("LOCK 
4c10: 25 64 20 25 64 20 77 61 73 20 25 64 28 25 64 29  %d %d was %d(%d)
4c20: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70  \n",.          p
4c30: 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70  File->h, locktyp
4c40: 65 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  e, pFile->lockty
4c50: 70 65 2c 20 70 46 69 6c 65 2d 3e 73 68 61 72 65  pe, pFile->share
4c60: 64 4c 6f 63 6b 42 79 74 65 29 3b 0a 0a 20 20 2f  dLockByte);..  /
4c70: 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c  * If there is al
4c80: 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20  ready a lock of 
4c90: 74 68 69 73 20 74 79 70 65 20 6f 72 20 6d 6f 72  this type or mor
4ca0: 65 20 72 65 73 74 72 69 63 74 69 76 65 20 6f 6e  e restrictive on
4cb0: 20 74 68 65 0a 20 20 2a 2a 20 4f 73 46 69 6c 65   the.  ** OsFile
4cc0: 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f  , do nothing. Do
4cd0: 6e 27 74 20 75 73 65 20 74 68 65 20 65 6e 64 5f  n't use the end_
4ce0: 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61 74 68 2c  lock: exit path,
4cf0: 20 61 73 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33   as.  ** sqlite3
4d00: 4f 73 45 6e 74 65 72 4d 75 74 65 78 28 29 20 68  OsEnterMutex() h
4d10: 61 73 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c 65  asn't been calle
4d20: 64 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  d yet..  */.  if
4d30: 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  ( pFile->locktyp
4d40: 65 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20  e>=locktype ){. 
4d50: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
4d60: 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  _OK;.  }..  /* M
4d70: 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63  ake sure the loc
4d80: 6b 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73  king sequence is
4d90: 20 63 6f 72 72 65 63 74 0a 20 20 2a 2f 0a 20 20   correct.  */.  
4da0: 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c  assert( pFile->l
4db0: 6f 63 6b 74 79 70 65 21 3d 4e 4f 5f 4c 4f 43 4b  ocktype!=NO_LOCK
4dc0: 20 7c 7c 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48   || locktype==SH
4dd0: 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  ARED_LOCK );.  a
4de0: 73 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 21  ssert( locktype!
4df0: 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b  =PENDING_LOCK );
4e00: 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74  .  assert( lockt
4e10: 79 70 65 21 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ype!=RESERVED_LO
4e20: 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 6c 6f 63  CK || pFile->loc
4e30: 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
4e40: 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 6b  CK );..  /* Lock
4e50: 20 74 68 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43   the PENDING_LOC
4e60: 4b 20 62 79 74 65 20 69 66 20 77 65 20 6e 65 65  K byte if we nee
4e70: 64 20 74 6f 20 61 63 71 75 69 72 65 20 61 20 50  d to acquire a P
4e80: 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 6f 72 0a 20  ENDING lock or. 
4e90: 20 2a 2a 20 61 20 53 48 41 52 45 44 20 6c 6f 63   ** a SHARED loc
4ea0: 6b 2e 20 20 49 66 20 77 65 20 61 72 65 20 61 63  k.  If we are ac
4eb0: 71 75 69 72 69 6e 67 20 61 20 53 48 41 52 45 44  quiring a SHARED
4ec0: 20 6c 6f 63 6b 2c 20 74 68 65 20 61 63 71 75 69   lock, the acqui
4ed0: 73 69 74 69 6f 6e 20 6f 66 0a 20 20 2a 2a 20 74  sition of.  ** t
4ee0: 68 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20  he PENDING_LOCK 
4ef0: 62 79 74 65 20 69 73 20 74 65 6d 70 6f 72 61 72  byte is temporar
4f00: 79 2e 0a 20 20 2a 2f 0a 20 20 6e 65 77 4c 6f 63  y..  */.  newLoc
4f10: 6b 74 79 70 65 20 3d 20 70 46 69 6c 65 2d 3e 6c  ktype = pFile->l
4f20: 6f 63 6b 74 79 70 65 3b 0a 20 20 69 66 28 20 70  ocktype;.  if( p
4f30: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d  File->locktype==
4f40: 4e 4f 5f 4c 4f 43 4b 0a 20 20 20 7c 7c 20 28 6c  NO_LOCK.   || (l
4f50: 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49  ocktype==EXCLUSI
4f60: 56 45 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65  VE_LOCK && pFile
4f70: 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 52 45 53 45  ->locktype==RESE
4f80: 52 56 45 44 5f 4c 4f 43 4b 29 0a 20 20 29 7b 0a  RVED_LOCK).  ){.
4f90: 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 33 3b      int cnt = 3;
4fa0: 0a 20 20 20 20 77 68 69 6c 65 28 20 63 6e 74 2d  .    while( cnt-
4fb0: 2d 3e 30 20 26 26 20 28 72 65 73 20 3d 20 4c 6f  ->0 && (res = Lo
4fc0: 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c  ckFile(pFile->h,
4fd0: 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 30   PENDING_BYTE, 0
4fe0: 2c 20 31 2c 20 30 29 29 3d 3d 30 20 29 7b 0a 20  , 1, 0))==0 ){. 
4ff0: 20 20 20 20 20 2f 2a 20 54 72 79 20 33 20 74 69       /* Try 3 ti
5000: 6d 65 73 20 74 6f 20 67 65 74 20 74 68 65 20 70  mes to get the p
5010: 65 6e 64 69 6e 67 20 6c 6f 63 6b 2e 20 20 54 68  ending lock.  Th
5020: 65 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 20 6d  e pending lock m
5030: 69 67 68 74 20 62 65 0a 20 20 20 20 20 20 2a 2a  ight be.      **
5040: 20 68 65 6c 64 20 62 79 20 61 6e 6f 74 68 65 72   held by another
5050: 20 72 65 61 64 65 72 20 70 72 6f 63 65 73 73 20   reader process 
5060: 77 68 6f 20 77 69 6c 6c 20 72 65 6c 65 61 73 65  who will release
5070: 20 69 74 20 6d 6f 6d 65 6e 74 61 72 69 6c 79 2e   it momentarily.
5080: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
5090: 54 52 41 43 45 32 28 22 63 6f 75 6c 64 20 6e 6f  TRACE2("could no
50a0: 74 20 67 65 74 20 61 20 50 45 4e 44 49 4e 47 20  t get a PENDING 
50b0: 6c 6f 63 6b 2e 20 63 6e 74 3d 25 64 5c 6e 22 2c  lock. cnt=%d\n",
50c0: 20 63 6e 74 29 3b 0a 20 20 20 20 20 20 53 6c 65   cnt);.      Sle
50d0: 65 70 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ep(1);.    }.   
50e0: 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20   gotPendingLock 
50f0: 3d 20 72 65 73 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  = res;.  }..  /*
5100: 20 41 63 71 75 69 72 65 20 61 20 73 68 61 72 65   Acquire a share
5110: 64 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66  d lock.  */.  if
5120: 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52  ( locktype==SHAR
5130: 45 44 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20 29  ED_LOCK && res )
5140: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46  {.    assert( pF
5150: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 4e  ile->locktype==N
5160: 4f 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 65  O_LOCK );.    re
5170: 73 20 3d 20 67 65 74 52 65 61 64 4c 6f 63 6b 28  s = getReadLock(
5180: 70 46 69 6c 65 29 3b 0a 20 20 20 20 69 66 28 20  pFile);.    if( 
5190: 72 65 73 20 29 7b 0a 20 20 20 20 20 20 6e 65 77  res ){.      new
51a0: 4c 6f 63 6b 74 79 70 65 20 3d 20 53 48 41 52 45  Locktype = SHARE
51b0: 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20  D_LOCK;.    }.  
51c0: 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20  }..  /* Acquire 
51d0: 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 0a  a RESERVED lock.
51e0: 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74    */.  if( lockt
51f0: 79 70 65 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ype==RESERVED_LO
5200: 43 4b 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20  CK && res ){.   
5210: 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e   assert( pFile->
5220: 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45 44  locktype==SHARED
5230: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 65 73  _LOCK );.    res
5240: 20 3d 20 4c 6f 63 6b 46 69 6c 65 28 70 46 69 6c   = LockFile(pFil
5250: 65 2d 3e 68 2c 20 52 45 53 45 52 56 45 44 5f 42  e->h, RESERVED_B
5260: 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20  YTE, 0, 1, 0);. 
5270: 20 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20     if( res ){.  
5280: 20 20 20 20 6e 65 77 4c 6f 63 6b 74 79 70 65 20      newLocktype 
5290: 3d 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 3b  = RESERVED_LOCK;
52a0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
52b0: 20 41 63 71 75 69 72 65 20 61 20 50 45 4e 44 49   Acquire a PENDI
52c0: 4e 47 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69  NG lock.  */.  i
52d0: 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43  f( locktype==EXC
52e0: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 72  LUSIVE_LOCK && r
52f0: 65 73 20 29 7b 0a 20 20 20 20 6e 65 77 4c 6f 63  es ){.    newLoc
5300: 6b 74 79 70 65 20 3d 20 50 45 4e 44 49 4e 47 5f  ktype = PENDING_
5310: 4c 4f 43 4b 3b 0a 20 20 20 20 67 6f 74 50 65 6e  LOCK;.    gotPen
5320: 64 69 6e 67 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20  dingLock = 0;.  
5330: 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20  }..  /* Acquire 
5340: 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
5350: 6b 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63  k.  */.  if( loc
5360: 6b 74 79 70 65 3d 3d 45 58 43 4c 55 53 49 56 45  ktype==EXCLUSIVE
5370: 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20 29 7b 0a  _LOCK && res ){.
5380: 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c      assert( pFil
5390: 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 53 48 41  e->locktype>=SHA
53a0: 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  RED_LOCK );.    
53b0: 72 65 73 20 3d 20 75 6e 6c 6f 63 6b 52 65 61 64  res = unlockRead
53c0: 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20 20  Lock(pFile);.   
53d0: 20 54 52 41 43 45 32 28 22 75 6e 72 65 61 64 6c   TRACE2("unreadl
53e0: 6f 63 6b 20 3d 20 25 64 5c 6e 22 2c 20 72 65 73  ock = %d\n", res
53f0: 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 4c 6f 63  );.    res = Loc
5400: 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c 20  kFile(pFile->h, 
5410: 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 30 2c  SHARED_FIRST, 0,
5420: 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29   SHARED_SIZE, 0)
5430: 3b 0a 20 20 20 20 69 66 28 20 72 65 73 20 29 7b  ;.    if( res ){
5440: 0a 20 20 20 20 20 20 6e 65 77 4c 6f 63 6b 74 79  .      newLockty
5450: 70 65 20 3d 20 45 58 43 4c 55 53 49 56 45 5f 4c  pe = EXCLUSIVE_L
5460: 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  OCK;.    }else{.
5470: 20 20 20 20 20 20 54 52 41 43 45 32 28 22 65 72        TRACE2("er
5480: 72 6f 72 2d 63 6f 64 65 20 3d 20 25 64 5c 6e 22  ror-code = %d\n"
5490: 2c 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  , GetLastError()
54a0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
54b0: 2f 2a 20 49 66 20 77 65 20 61 72 65 20 68 6f 6c  /* If we are hol
54c0: 64 69 6e 67 20 61 20 50 45 4e 44 49 4e 47 20 6c  ding a PENDING l
54d0: 6f 63 6b 20 74 68 61 74 20 6f 75 67 68 74 20 74  ock that ought t
54e0: 6f 20 62 65 20 72 65 6c 65 61 73 65 64 2c 20 74  o be released, t
54f0: 68 65 6e 0a 20 20 2a 2a 20 72 65 6c 65 61 73 65  hen.  ** release
5500: 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20   it now..  */.  
5510: 69 66 28 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f  if( gotPendingLo
5520: 63 6b 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d  ck && locktype==
5530: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20  SHARED_LOCK ){. 
5540: 20 20 20 55 6e 6c 6f 63 6b 46 69 6c 65 28 70 46     UnlockFile(pF
5550: 69 6c 65 2d 3e 68 2c 20 50 45 4e 44 49 4e 47 5f  ile->h, PENDING_
5560: 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a  BYTE, 0, 1, 0);.
5570: 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65    }..  /* Update
5580: 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68   the state of th
5590: 65 20 6c 6f 63 6b 20 68 61 73 20 68 65 6c 64 20  e lock has held 
55a0: 69 6e 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  in the file desc
55b0: 72 69 70 74 6f 72 20 74 68 65 6e 0a 20 20 2a 2a  riptor then.  **
55c0: 20 72 65 74 75 72 6e 20 74 68 65 20 61 70 70 72   return the appr
55d0: 6f 70 72 69 61 74 65 20 72 65 73 75 6c 74 20 63  opriate result c
55e0: 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ode..  */.  if( 
55f0: 72 65 73 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  res ){.    rc = 
5600: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c  SQLITE_OK;.  }el
5610: 73 65 7b 0a 20 20 20 20 54 52 41 43 45 34 28 22  se{.    TRACE4("
5620: 4c 4f 43 4b 20 46 41 49 4c 45 44 20 25 64 20 74  LOCK FAILED %d t
5630: 72 79 69 6e 67 20 66 6f 72 20 25 64 20 62 75 74  rying for %d but
5640: 20 67 6f 74 20 25 64 5c 6e 22 2c 20 70 46 69 6c   got %d\n", pFil
5650: 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20  e->h,.          
5660: 20 6c 6f 63 6b 74 79 70 65 2c 20 6e 65 77 4c 6f   locktype, newLo
5670: 63 6b 74 79 70 65 29 3b 0a 20 20 20 20 72 63 20  cktype);.    rc 
5680: 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
5690: 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b   }.  pFile->lock
56a0: 74 79 70 65 20 3d 20 6e 65 77 4c 6f 63 6b 74 79  type = newLockty
56b0: 70 65 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  pe;.  return rc;
56c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
56d0: 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66  outine checks if
56e0: 20 74 68 65 72 65 20 69 73 20 61 20 52 45 53 45   there is a RESE
56f0: 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f  RVED lock held o
5700: 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a  n the specified.
5710: 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73 20  ** file by this 
5720: 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f  or any other pro
5730: 63 65 73 73 2e 20 49 66 20 73 75 63 68 20 61 20  cess. If such a 
5740: 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 72 65  lock is held, re
5750: 74 75 72 6e 0a 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f  turn.** non-zero
5760: 2c 20 6f 74 68 65 72 77 69 73 65 20 7a 65 72 6f  , otherwise zero
5770: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
5780: 77 69 6e 43 68 65 63 6b 52 65 73 65 72 76 65 64  winCheckReserved
5790: 4c 6f 63 6b 28 4f 73 46 69 6c 65 20 2a 69 64 29  Lock(OsFile *id)
57a0: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 77 69  {.  int rc;.  wi
57b0: 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  nFile *pFile = (
57c0: 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a 20 20 61  winFile*)id;.  a
57d0: 73 73 65 72 74 28 20 70 46 69 6c 65 21 3d 30 20  ssert( pFile!=0 
57e0: 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  );.  if( pFile->
57f0: 6c 6f 63 6b 74 79 70 65 3e 3d 52 45 53 45 52 56  locktype>=RESERV
5800: 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72  ED_LOCK ){.    r
5810: 63 20 3d 20 31 3b 0a 20 20 20 20 54 52 41 43 45  c = 1;.    TRACE
5820: 33 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20  3("TEST WR-LOCK 
5830: 25 64 20 25 64 20 28 6c 6f 63 61 6c 29 5c 6e 22  %d %d (local)\n"
5840: 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 29 3b  , pFile->h, rc);
5850: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
5860: 20 3d 20 4c 6f 63 6b 46 69 6c 65 28 70 46 69 6c   = LockFile(pFil
5870: 65 2d 3e 68 2c 20 52 45 53 45 52 56 45 44 5f 42  e->h, RESERVED_B
5880: 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20  YTE, 0, 1, 0);. 
5890: 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
58a0: 20 20 20 55 6e 6c 6f 63 6b 46 69 6c 65 28 70 46     UnlockFile(pF
58b0: 69 6c 65 2d 3e 68 2c 20 52 45 53 45 52 56 45 44  ile->h, RESERVED
58c0: 5f 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b  _BYTE, 0, 1, 0);
58d0: 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
58e0: 21 72 63 3b 0a 20 20 20 20 54 52 41 43 45 33 28  !rc;.    TRACE3(
58f0: 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64  "TEST WR-LOCK %d
5900: 20 25 64 20 28 72 65 6d 6f 74 65 29 5c 6e 22 2c   %d (remote)\n",
5910: 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 29 3b 0a   pFile->h, rc);.
5920: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
5930: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20  .}../*.** Lower 
5940: 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
5950: 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69  l on file descri
5960: 70 74 6f 72 20 69 64 20 74 6f 20 6c 6f 63 6b 74  ptor id to lockt
5970: 79 70 65 2e 20 20 6c 6f 63 6b 74 79 70 65 0a 2a  ype.  locktype.*
5980: 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  * must be either
5990: 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52   NO_LOCK or SHAR
59a0: 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49  ED_LOCK..**.** I
59b0: 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  f the locking le
59c0: 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20  vel of the file 
59d0: 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c  descriptor is al
59e0: 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f  ready at or belo
59f0: 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74  w.** the request
5a00: 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  ed locking level
5a10: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
5a20: 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  s a no-op..**.**
5a30: 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   It is not possi
5a40: 62 6c 65 20 66 6f 72 20 74 68 69 73 20 72 6f 75  ble for this rou
5a50: 74 69 6e 65 20 74 6f 20 66 61 69 6c 20 69 66 20  tine to fail if 
5a60: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
5a70: 65 6e 74 0a 2a 2a 20 69 73 20 4e 4f 5f 4c 4f 43  ent.** is NO_LOC
5a80: 4b 2e 20 20 49 66 20 74 68 65 20 73 65 63 6f 6e  K.  If the secon
5a90: 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 53 48  d argument is SH
5aa0: 41 52 45 44 5f 4c 4f 43 4b 20 74 68 65 6e 20 74  ARED_LOCK then t
5ab0: 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d  his routine.** m
5ac0: 69 67 68 74 20 72 65 74 75 72 6e 20 53 51 4c 49  ight return SQLI
5ad0: 54 45 5f 49 4f 45 52 52 3b 0a 2a 2f 0a 73 74 61  TE_IOERR;.*/.sta
5ae0: 74 69 63 20 69 6e 74 20 77 69 6e 55 6e 6c 6f 63  tic int winUnloc
5af0: 6b 28 4f 73 46 69 6c 65 20 2a 69 64 2c 20 69 6e  k(OsFile *id, in
5b00: 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69  t locktype){.  i
5b10: 6e 74 20 74 79 70 65 3b 0a 20 20 69 6e 74 20 72  nt type;.  int r
5b20: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
5b30: 20 77 69 6e 46 69 6c 65 20 2a 70 46 69 6c 65 20   winFile *pFile 
5b40: 3d 20 28 77 69 6e 46 69 6c 65 2a 29 69 64 3b 0a  = (winFile*)id;.
5b50: 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 21    assert( pFile!
5b60: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
5b70: 6c 6f 63 6b 74 79 70 65 3c 3d 53 48 41 52 45 44  locktype<=SHARED
5b80: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 54 52 41 43 45  _LOCK );.  TRACE
5b90: 35 28 22 55 4e 4c 4f 43 4b 20 25 64 20 74 6f 20  5("UNLOCK %d to 
5ba0: 25 64 20 77 61 73 20 25 64 28 25 64 29 5c 6e 22  %d was %d(%d)\n"
5bb0: 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b  , pFile->h, lock
5bc0: 74 79 70 65 2c 0a 20 20 20 20 20 20 20 20 20 20  type,.          
5bd0: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 2c  pFile->locktype,
5be0: 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4c 6f   pFile->sharedLo
5bf0: 63 6b 42 79 74 65 29 3b 0a 20 20 74 79 70 65 20  ckByte);.  type 
5c00: 3d 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  = pFile->locktyp
5c10: 65 3b 0a 20 20 69 66 28 20 74 79 70 65 3e 3d 45  e;.  if( type>=E
5c20: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b  XCLUSIVE_LOCK ){
5c30: 0a 20 20 20 20 55 6e 6c 6f 63 6b 46 69 6c 65 28  .    UnlockFile(
5c40: 70 46 69 6c 65 2d 3e 68 2c 20 53 48 41 52 45 44  pFile->h, SHARED
5c50: 5f 46 49 52 53 54 2c 20 30 2c 20 53 48 41 52 45  _FIRST, 0, SHARE
5c60: 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 20 20 20 20  D_SIZE, 0);.    
5c70: 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48  if( locktype==SH
5c80: 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 21 67 65  ARED_LOCK && !ge
5c90: 74 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29  tReadLock(pFile)
5ca0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69   ){.      /* Thi
5cb0: 73 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 68  s should never h
5cc0: 61 70 70 65 6e 2e 20 20 57 65 20 73 68 6f 75 6c  appen.  We shoul
5cd0: 64 20 61 6c 77 61 79 73 20 62 65 20 61 62 6c 65  d always be able
5ce0: 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 72 65 61   to.      ** rea
5cf0: 63 71 75 69 72 65 20 74 68 65 20 72 65 61 64 20  cquire the read 
5d00: 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 72 63  lock */.      rc
5d10: 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b   = SQLITE_IOERR;
5d20: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
5d30: 20 74 79 70 65 3e 3d 52 45 53 45 52 56 45 44 5f   type>=RESERVED_
5d40: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 55 6e 6c 6f  LOCK ){.    Unlo
5d50: 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68 2c  ckFile(pFile->h,
5d60: 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20   RESERVED_BYTE, 
5d70: 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  0, 1, 0);.  }.  
5d80: 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f  if( locktype==NO
5d90: 5f 4c 4f 43 4b 20 26 26 20 74 79 70 65 3e 3d 53  _LOCK && type>=S
5da0: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
5db0: 20 20 75 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b    unlockReadLock
5dc0: 28 70 46 69 6c 65 29 3b 0a 20 20 7d 0a 20 20 69  (pFile);.  }.  i
5dd0: 66 28 20 74 79 70 65 3e 3d 50 45 4e 44 49 4e 47  f( type>=PENDING
5de0: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 55 6e 6c  _LOCK ){.    Unl
5df0: 6f 63 6b 46 69 6c 65 28 70 46 69 6c 65 2d 3e 68  ockFile(pFile->h
5e00: 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20  , PENDING_BYTE, 
5e10: 30 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  0, 1, 0);.  }.  
5e20: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20  pFile->locktype 
5e30: 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 72 65  = locktype;.  re
5e40: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
5e50: 2a 20 54 75 72 6e 20 61 20 72 65 6c 61 74 69 76  * Turn a relativ
5e60: 65 20 70 61 74 68 6e 61 6d 65 20 69 6e 74 6f 20  e pathname into 
5e70: 61 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 2e  a full pathname.
5e80: 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74    Return a point
5e90: 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 66 75 6c  er.** to the ful
5ea0: 6c 20 70 61 74 68 6e 61 6d 65 20 73 74 6f 72 65  l pathname store
5eb0: 64 20 69 6e 20 73 70 61 63 65 20 6f 62 74 61 69  d in space obtai
5ec0: 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d  ned from sqliteM
5ed0: 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 54 68 65 20  alloc()..** The 
5ee0: 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
5ef0: 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
5f00: 66 6f 72 20 66 72 65 65 69 6e 67 20 74 68 69 73  for freeing this
5f10: 20 73 70 61 63 65 20 6f 6e 63 65 20 69 74 0a 2a   space once it.*
5f20: 2a 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6e  * is no longer n
5f30: 65 65 64 65 64 2e 0a 2a 2f 0a 63 68 61 72 20 2a  eeded..*/.char *
5f40: 73 71 6c 69 74 65 33 57 69 6e 46 75 6c 6c 50 61  sqlite3WinFullPa
5f50: 74 68 6e 61 6d 65 28 63 6f 6e 73 74 20 63 68 61  thname(const cha
5f60: 72 20 2a 7a 52 65 6c 61 74 69 76 65 29 7b 0a 20  r *zRelative){. 
5f70: 20 63 68 61 72 20 2a 7a 46 75 6c 6c 3b 0a 23 69   char *zFull;.#i
5f80: 66 20 64 65 66 69 6e 65 64 28 5f 5f 43 59 47 57  f defined(__CYGW
5f90: 49 4e 5f 5f 29 0a 20 20 69 6e 74 20 6e 42 79 74  IN__).  int nByt
5fa0: 65 3b 0a 20 20 6e 42 79 74 65 20 3d 20 73 74 72  e;.  nByte = str
5fb0: 6c 65 6e 28 7a 52 65 6c 61 74 69 76 65 29 20 2b  len(zRelative) +
5fc0: 20 4d 41 58 5f 50 41 54 48 20 2b 20 31 30 30 31   MAX_PATH + 1001
5fd0: 3b 0a 20 20 7a 46 75 6c 6c 20 3d 20 73 71 6c 69  ;.  zFull = sqli
5fe0: 74 65 4d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 20  teMalloc( nByte 
5ff0: 29 3b 0a 20 20 69 66 28 20 7a 46 75 6c 6c 3d 3d  );.  if( zFull==
6000: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
6010: 69 66 28 20 63 79 67 77 69 6e 5f 63 6f 6e 76 5f  if( cygwin_conv_
6020: 74 6f 5f 66 75 6c 6c 5f 77 69 6e 33 32 5f 70 61  to_full_win32_pa
6030: 74 68 28 7a 52 65 6c 61 74 69 76 65 2c 20 7a 46  th(zRelative, zF
6040: 75 6c 6c 29 20 29 20 72 65 74 75 72 6e 20 30 3b  ull) ) return 0;
6050: 0a 23 65 6c 69 66 20 4f 53 5f 57 49 4e 43 45 0a  .#elif OS_WINCE.
6060: 20 20 2f 2a 20 57 69 6e 43 45 20 68 61 73 20 6e    /* WinCE has n
6070: 6f 20 63 6f 6e 63 65 70 74 20 6f 66 20 61 20 72  o concept of a r
6080: 65 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65  elative pathname
6090: 2c 20 6f 72 20 73 6f 20 49 20 61 6d 20 74 6f 6c  , or so I am tol
60a0: 64 2e 20 2a 2f 0a 20 20 7a 46 75 6c 6c 20 3d 20  d. */.  zFull = 
60b0: 73 71 6c 69 74 65 33 53 74 72 44 75 70 28 7a 52  sqlite3StrDup(zR
60c0: 65 6c 61 74 69 76 65 29 3b 0a 23 65 6c 73 65 0a  elative);.#else.
60d0: 20 20 63 68 61 72 20 2a 7a 4e 6f 74 55 73 65 64    char *zNotUsed
60e0: 3b 0a 20 20 57 43 48 41 52 20 2a 7a 57 69 64 65  ;.  WCHAR *zWide
60f0: 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20  ;.  int nByte;. 
6100: 20 7a 57 69 64 65 20 3d 20 75 74 66 38 54 6f 55   zWide = utf8ToU
6110: 6e 69 63 6f 64 65 28 7a 52 65 6c 61 74 69 76 65  nicode(zRelative
6120: 29 3b 0a 20 20 69 66 28 20 7a 57 69 64 65 20 29  );.  if( zWide )
6130: 7b 0a 20 20 20 20 57 43 48 41 52 20 2a 7a 54 65  {.    WCHAR *zTe
6140: 6d 70 2c 20 2a 7a 4e 6f 74 55 73 65 64 57 3b 0a  mp, *zNotUsedW;.
6150: 20 20 20 20 6e 42 79 74 65 20 3d 20 47 65 74 46      nByte = GetF
6160: 75 6c 6c 50 61 74 68 4e 61 6d 65 57 28 7a 57 69  ullPathNameW(zWi
6170: 64 65 2c 20 30 2c 20 30 2c 20 26 7a 4e 6f 74 55  de, 0, 0, &zNotU
6180: 73 65 64 57 29 20 2b 20 31 3b 0a 20 20 20 20 7a  sedW) + 1;.    z
6190: 54 65 6d 70 20 3d 20 73 71 6c 69 74 65 4d 61 6c  Temp = sqliteMal
61a0: 6c 6f 63 28 20 6e 42 79 74 65 2a 73 69 7a 65 6f  loc( nByte*sizeo
61b0: 66 28 7a 54 65 6d 70 5b 30 5d 29 20 29 3b 0a 20  f(zTemp[0]) );. 
61c0: 20 20 20 69 66 28 20 7a 54 65 6d 70 3d 3d 30 20     if( zTemp==0 
61d0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
61e0: 47 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 57  GetFullPathNameW
61f0: 28 7a 57 69 64 65 2c 20 6e 42 79 74 65 2c 20 7a  (zWide, nByte, z
6200: 54 65 6d 70 2c 20 26 7a 4e 6f 74 55 73 65 64 57  Temp, &zNotUsedW
6210: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
6220: 65 28 7a 57 69 64 65 29 3b 0a 20 20 20 20 7a 46  e(zWide);.    zF
6230: 75 6c 6c 20 3d 20 75 6e 69 63 6f 64 65 54 6f 55  ull = unicodeToU
6240: 74 66 38 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20  tf8(zTemp);.    
6250: 73 71 6c 69 74 65 46 72 65 65 28 7a 54 65 6d 70  sqliteFree(zTemp
6260: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
6270: 6e 42 79 74 65 20 3d 20 47 65 74 46 75 6c 6c 50  nByte = GetFullP
6280: 61 74 68 4e 61 6d 65 41 28 7a 52 65 6c 61 74 69  athNameA(zRelati
6290: 76 65 2c 20 30 2c 20 30 2c 20 26 7a 4e 6f 74 55  ve, 0, 0, &zNotU
62a0: 73 65 64 29 20 2b 20 31 3b 0a 20 20 20 20 7a 46  sed) + 1;.    zF
62b0: 75 6c 6c 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  ull = sqliteMall
62c0: 6f 63 28 20 6e 42 79 74 65 2a 73 69 7a 65 6f 66  oc( nByte*sizeof
62d0: 28 7a 46 75 6c 6c 5b 30 5d 29 20 29 3b 0a 20 20  (zFull[0]) );.  
62e0: 20 20 69 66 28 20 7a 46 75 6c 6c 3d 3d 30 20 29    if( zFull==0 )
62f0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 47   return 0;.    G
6300: 65 74 46 75 6c 6c 50 61 74 68 4e 61 6d 65 41 28  etFullPathNameA(
6310: 7a 52 65 6c 61 74 69 76 65 2c 20 6e 42 79 74 65  zRelative, nByte
6320: 2c 20 7a 46 75 6c 6c 2c 20 26 7a 4e 6f 74 55 73  , zFull, &zNotUs
6330: 65 64 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ed);.  }.#endif.
6340: 20 20 72 65 74 75 72 6e 20 7a 46 75 6c 6c 3b 0a    return zFull;.
6350: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 75 6c  }../*.** The ful
6360: 6c 53 79 6e 63 20 6f 70 74 69 6f 6e 20 69 73 20  lSync option is 
6370: 6d 65 61 6e 69 6e 67 6c 65 73 73 20 6f 6e 20 77  meaningless on w
6380: 69 6e 64 6f 77 73 2e 20 20 20 54 68 69 73 20 69  indows.   This i
6390: 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
63a0: 61 74 69 63 20 76 6f 69 64 20 77 69 6e 53 65 74  atic void winSet
63b0: 46 75 6c 6c 53 79 6e 63 28 4f 73 46 69 6c 65 20  FullSync(OsFile 
63c0: 2a 69 64 2c 20 69 6e 74 20 76 29 7b 0a 20 20 72  *id, int v){.  r
63d0: 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eturn;.}../*.** 
63e0: 52 65 74 75 72 6e 20 74 68 65 20 75 6e 64 65 72  Return the under
63f0: 6c 79 69 6e 67 20 66 69 6c 65 20 68 61 6e 64 6c  lying file handl
6400: 65 20 66 6f 72 20 61 6e 20 4f 73 46 69 6c 65 0a  e for an OsFile.
6410: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
6420: 6e 46 69 6c 65 48 61 6e 64 6c 65 28 4f 73 46 69  nFileHandle(OsFi
6430: 6c 65 20 2a 69 64 29 7b 0a 20 20 72 65 74 75 72  le *id){.  retur
6440: 6e 20 28 69 6e 74 29 28 28 77 69 6e 46 69 6c 65  n (int)((winFile
6450: 2a 29 69 64 29 2d 3e 68 3b 0a 7d 0a 0a 2f 2a 0a  *)id)->h;.}../*.
6460: 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74  ** Return an int
6470: 65 67 65 72 20 74 68 61 74 20 69 6e 64 69 63 65  eger that indice
6480: 73 20 74 68 65 20 74 79 70 65 20 6f 66 20 6c 6f  s the type of lo
6490: 63 6b 20 63 75 72 72 65 6e 74 6c 79 20 68 65 6c  ck currently hel
64a0: 64 0a 2a 2a 20 62 79 20 74 68 69 73 20 68 61 6e  d.** by this han
64b0: 64 6c 65 2e 20 20 28 55 73 65 64 20 66 6f 72 20  dle.  (Used for 
64c0: 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c  testing and anal
64d0: 79 73 69 73 20 6f 6e 6c 79 2e 29 0a 2a 2f 0a 73  ysis only.).*/.s
64e0: 74 61 74 69 63 20 69 6e 74 20 77 69 6e 4c 6f 63  tatic int winLoc
64f0: 6b 53 74 61 74 65 28 4f 73 46 69 6c 65 20 2a 69  kState(OsFile *i
6500: 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 28 77  d){.  return ((w
6510: 69 6e 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 6f 63  inFile*)id)->loc
6520: 6b 74 79 70 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ktype;.}../*.** 
6530: 54 68 69 73 20 76 65 63 74 6f 72 20 64 65 66 69  This vector defi
6540: 6e 65 73 20 61 6c 6c 20 74 68 65 20 6d 65 74 68  nes all the meth
6550: 6f 64 73 20 74 68 61 74 20 63 61 6e 20 6f 70 65  ods that can ope
6560: 72 61 74 65 20 6f 6e 20 61 6e 20 4f 73 46 69 6c  rate on an OsFil
6570: 65 0a 2a 2a 20 66 6f 72 20 77 69 6e 33 32 2e 0a  e.** for win32..
6580: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
6590: 49 6f 4d 65 74 68 6f 64 20 73 71 6c 69 74 65 33  IoMethod sqlite3
65a0: 57 69 6e 49 6f 4d 65 74 68 6f 64 20 3d 20 7b 0a  WinIoMethod = {.
65b0: 20 20 77 69 6e 43 6c 6f 73 65 2c 0a 20 20 77 69    winClose,.  wi
65c0: 6e 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 2c 0a  nOpenDirectory,.
65d0: 20 20 77 69 6e 52 65 61 64 2c 0a 20 20 77 69 6e    winRead,.  win
65e0: 57 72 69 74 65 2c 0a 20 20 77 69 6e 53 65 65 6b  Write,.  winSeek
65f0: 2c 0a 20 20 77 69 6e 54 72 75 6e 63 61 74 65 2c  ,.  winTruncate,
6600: 0a 20 20 77 69 6e 53 79 6e 63 2c 0a 20 20 77 69  .  winSync,.  wi
6610: 6e 53 65 74 46 75 6c 6c 53 79 6e 63 2c 0a 20 20  nSetFullSync,.  
6620: 77 69 6e 46 69 6c 65 48 61 6e 64 6c 65 2c 0a 20  winFileHandle,. 
6630: 20 77 69 6e 46 69 6c 65 53 69 7a 65 2c 0a 20 20   winFileSize,.  
6640: 77 69 6e 4c 6f 63 6b 2c 0a 20 20 77 69 6e 55 6e  winLock,.  winUn
6650: 6c 6f 63 6b 2c 0a 20 20 77 69 6e 4c 6f 63 6b 53  lock,.  winLockS
6660: 74 61 74 65 2c 0a 20 20 77 69 6e 43 68 65 63 6b  tate,.  winCheck
6670: 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 0a 7d 3b  ReservedLock,.};
6680: 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
6690: 20 6d 65 6d 6f 72 79 20 66 6f 72 20 61 6e 20 4f   memory for an O
66a0: 73 46 69 6c 65 2e 20 20 49 6e 69 74 69 61 6c 69  sFile.  Initiali
66b0: 7a 65 20 74 68 65 20 6e 65 77 20 4f 73 46 69 6c  ze the new OsFil
66c0: 65 0a 2a 2a 20 74 6f 20 74 68 65 20 76 61 6c 75  e.** to the valu
66d0: 65 20 67 69 76 65 6e 20 69 6e 20 70 49 6e 69 74  e given in pInit
66e0: 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f   and return a po
66f0: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6e 65 77  inter to the new
6700: 0a 2a 2a 20 4f 73 46 69 6c 65 2e 20 20 49 66 20  .** OsFile.  If 
6710: 77 65 20 72 75 6e 20 6f 75 74 20 6f 66 20 6d 65  we run out of me
6720: 6d 6f 72 79 2c 20 63 6c 6f 73 65 20 74 68 65 20  mory, close the 
6730: 66 69 6c 65 20 61 6e 64 20 72 65 74 75 72 6e 20  file and return 
6740: 4e 55 4c 4c 2e 0a 2a 2f 0a 69 6e 74 20 61 6c 6c  NULL..*/.int all
6750: 6f 63 61 74 65 57 69 6e 46 69 6c 65 28 77 69 6e  ocateWinFile(win
6760: 46 69 6c 65 20 2a 70 49 6e 69 74 2c 20 4f 73 46  File *pInit, OsF
6770: 69 6c 65 20 2a 2a 70 49 64 29 7b 0a 20 20 77 69  ile **pId){.  wi
6780: 6e 46 69 6c 65 20 2a 70 4e 65 77 3b 0a 20 20 70  nFile *pNew;.  p
6790: 4e 65 77 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  New = sqliteMall
67a0: 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77  oc( sizeof(*pNew
67b0: 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d  ) );.  if( pNew=
67c0: 3d 30 20 29 7b 0a 20 20 20 20 43 6c 6f 73 65 48  =0 ){.    CloseH
67d0: 61 6e 64 6c 65 28 70 49 6e 69 74 2d 3e 68 29 3b  andle(pInit->h);
67e0: 0a 23 69 66 20 4f 53 5f 57 49 4e 43 45 0a 20 20  .#if OS_WINCE.  
67f0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 49 6e    sqliteFree(pIn
6800: 69 74 2d 3e 7a 44 65 6c 65 74 65 4f 6e 43 6c 6f  it->zDeleteOnClo
6810: 73 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  se);.#endif.    
6820: 2a 70 49 64 20 3d 20 30 3b 0a 20 20 20 20 72 65  *pId = 0;.    re
6830: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
6840: 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  M;.  }else{.    
6850: 2a 70 4e 65 77 20 3d 20 2a 70 49 6e 69 74 3b 0a  *pNew = *pInit;.
6860: 20 20 20 20 70 4e 65 77 2d 3e 70 4d 65 74 68 6f      pNew->pMetho
6870: 64 20 3d 20 26 73 71 6c 69 74 65 33 57 69 6e 49  d = &sqlite3WinI
6880: 6f 4d 65 74 68 6f 64 3b 0a 20 20 20 20 2a 70 49  oMethod;.    *pI
6890: 64 20 3d 20 28 4f 73 46 69 6c 65 2a 29 70 4e 65  d = (OsFile*)pNe
68a0: 77 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  w;.    return SQ
68b0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a  LITE_OK;.  }.}..
68c0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
68d0: 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 20 2a 2f  E_OMIT_DISKIO */
68e0: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
68f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6900: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6910: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6920: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
6930: 20 45 76 65 72 79 74 68 69 6e 67 20 61 62 6f 76   Everything abov
6940: 65 20 64 65 61 6c 73 20 77 69 74 68 20 66 69 6c  e deals with fil
6950: 65 20 49 2f 4f 2e 20 20 45 76 65 72 79 74 68 69  e I/O.  Everythi
6960: 6e 67 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20  ng that follows 
6970: 64 65 61 6c 73 0a 2a 2a 20 77 69 74 68 20 6f 74  deals.** with ot
6980: 68 65 72 20 6d 69 73 63 65 6c 6c 61 6e 6f 75 73  her miscellanous
6990: 20 61 73 70 65 63 74 73 20 6f 66 20 74 68 65 20   aspects of the 
69a0: 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
69b0: 20 69 6e 74 65 72 66 61 63 65 0a 2a 2a 2a 2a 2a   interface.*****
69c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
69d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
69e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
69f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6a00: 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  *******/../*.** 
6a10: 47 65 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  Get information 
6a20: 74 6f 20 73 65 65 64 20 74 68 65 20 72 61 6e 64  to seed the rand
6a30: 6f 6d 20 6e 75 6d 62 65 72 20 67 65 6e 65 72 61  om number genera
6a40: 74 6f 72 2e 20 20 54 68 65 20 73 65 65 64 0a 2a  tor.  The seed.*
6a50: 2a 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  * is written int
6a60: 6f 20 74 68 65 20 62 75 66 66 65 72 20 7a 42 75  o the buffer zBu
6a70: 66 5b 32 35 36 5d 2e 20 20 54 68 65 20 63 61 6c  f[256].  The cal
6a80: 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6d 75  ling function mu
6a90: 73 74 0a 2a 2a 20 73 75 70 70 6c 79 20 61 20 73  st.** supply a s
6aa0: 75 66 66 69 63 69 65 6e 74 6c 79 20 6c 61 72 67  ufficiently larg
6ab0: 65 20 62 75 66 66 65 72 2e 0a 2a 2f 0a 69 6e 74  e buffer..*/.int
6ac0: 20 73 71 6c 69 74 65 33 57 69 6e 52 61 6e 64 6f   sqlite3WinRando
6ad0: 6d 53 65 65 64 28 63 68 61 72 20 2a 7a 42 75 66  mSeed(char *zBuf
6ae0: 29 7b 0a 20 20 2f 2a 20 57 65 20 68 61 76 65 20  ){.  /* We have 
6af0: 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 7a 42  to initialize zB
6b00: 75 66 20 74 6f 20 70 72 65 76 65 6e 74 20 76 61  uf to prevent va
6b10: 6c 67 72 69 6e 64 20 66 72 6f 6d 20 72 65 70 6f  lgrind from repo
6b20: 72 74 69 6e 67 0a 20 20 2a 2a 20 65 72 72 6f 72  rting.  ** error
6b30: 73 2e 20 20 54 68 65 20 72 65 70 6f 72 74 73 20  s.  The reports 
6b40: 69 73 73 75 65 64 20 62 79 20 76 61 6c 67 72 69  issued by valgri
6b50: 6e 64 20 61 72 65 20 69 6e 63 6f 72 72 65 63 74  nd are incorrect
6b60: 20 2d 20 77 65 20 77 6f 75 6c 64 0a 20 20 2a 2a   - we would.  **
6b70: 20 70 72 65 66 65 72 20 74 68 61 74 20 74 68 65   prefer that the
6b80: 20 72 61 6e 64 6f 6d 6e 65 73 73 20 62 65 20 69   randomness be i
6b90: 6e 63 72 65 61 73 65 64 20 62 79 20 6d 61 6b 69  ncreased by maki
6ba0: 6e 67 20 75 73 65 20 6f 66 20 74 68 65 0a 20 20  ng use of the.  
6bb0: 2a 2a 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64  ** uninitialized
6bc0: 20 73 70 61 63 65 20 69 6e 20 7a 42 75 66 20 2d   space in zBuf -
6bd0: 20 62 75 74 20 76 61 6c 67 72 69 6e 64 20 65 72   but valgrind er
6be0: 72 6f 72 73 20 74 65 6e 64 20 74 6f 20 77 6f 72  rors tend to wor
6bf0: 72 79 0a 20 20 2a 2a 20 73 6f 6d 65 20 75 73 65  ry.  ** some use
6c00: 72 73 2e 20 20 52 61 74 68 65 72 20 74 68 61 6e  rs.  Rather than
6c10: 20 61 72 67 75 65 2c 20 69 74 20 73 65 65 6d 73   argue, it seems
6c20: 20 65 61 73 69 65 72 20 6a 75 73 74 20 74 6f 20   easier just to 
6c30: 69 6e 69 74 69 61 6c 69 7a 65 0a 20 20 2a 2a 20  initialize.  ** 
6c40: 74 68 65 20 77 68 6f 6c 65 20 61 72 72 61 79 20  the whole array 
6c50: 61 6e 64 20 73 69 6c 65 6e 63 65 20 76 61 6c 67  and silence valg
6c60: 72 69 6e 64 2c 20 65 76 65 6e 20 69 66 20 74 68  rind, even if th
6c70: 61 74 20 6d 65 61 6e 73 20 6c 65 73 73 20 72 61  at means less ra
6c80: 6e 64 6f 6d 6e 65 73 73 0a 20 20 2a 2a 20 69 6e  ndomness.  ** in
6c90: 20 74 68 65 20 72 61 6e 64 6f 6d 20 73 65 65 64   the random seed
6ca0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e  ..  **.  ** When
6cb0: 20 74 65 73 74 69 6e 67 2c 20 69 6e 69 74 69 61   testing, initia
6cc0: 6c 69 7a 69 6e 67 20 7a 42 75 66 5b 5d 20 74 6f  lizing zBuf[] to
6cd0: 20 7a 65 72 6f 20 69 73 20 61 6c 6c 20 77 65 20   zero is all we 
6ce0: 64 6f 2e 20 20 54 68 61 74 20 6d 65 61 6e 73 0a  do.  That means.
6cf0: 20 20 2a 2a 20 74 68 61 74 20 77 65 20 61 6c 77    ** that we alw
6d00: 61 79 73 20 75 73 65 20 74 68 65 20 73 61 6d 65  ays use the same
6d10: 20 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 73   random number s
6d20: 65 71 75 65 6e 63 65 2e 2a 20 54 68 69 73 20 6d  equence.* This m
6d30: 61 6b 65 73 20 74 68 65 0a 20 20 2a 2a 20 74 65  akes the.  ** te
6d40: 73 74 73 20 72 65 70 65 61 74 61 62 6c 65 2e 0a  sts repeatable..
6d50: 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 7a 42    */.  memset(zB
6d60: 75 66 2c 20 30 2c 20 32 35 36 29 3b 0a 20 20 47  uf, 0, 256);.  G
6d70: 65 74 53 79 73 74 65 6d 54 69 6d 65 28 28 4c 50  etSystemTime((LP
6d80: 53 59 53 54 45 4d 54 49 4d 45 29 7a 42 75 66 29  SYSTEMTIME)zBuf)
6d90: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
6da0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  E_OK;.}../*.** S
6db0: 6c 65 65 70 20 66 6f 72 20 61 20 6c 69 74 74 6c  leep for a littl
6dc0: 65 20 77 68 69 6c 65 2e 20 20 52 65 74 75 72 6e  e while.  Return
6dd0: 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74   the amount of t
6de0: 69 6d 65 20 73 6c 65 70 74 2e 0a 2a 2f 0a 69 6e  ime slept..*/.in
6df0: 74 20 73 71 6c 69 74 65 33 57 69 6e 53 6c 65 65  t sqlite3WinSlee
6e00: 70 28 69 6e 74 20 6d 73 29 7b 0a 20 20 53 6c 65  p(int ms){.  Sle
6e10: 65 70 28 6d 73 29 3b 0a 20 20 72 65 74 75 72 6e  ep(ms);.  return
6e20: 20 6d 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74   ms;.}../*.** St
6e30: 61 74 69 63 20 76 61 72 69 61 62 6c 65 73 20 75  atic variables u
6e40: 73 65 64 20 66 6f 72 20 74 68 72 65 61 64 20 73  sed for thread s
6e50: 79 6e 63 68 72 6f 6e 69 7a 61 74 69 6f 6e 0a 2a  ynchronization.*
6e60: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 4d  /.static int inM
6e70: 75 74 65 78 20 3d 20 30 3b 0a 23 69 66 64 65 66  utex = 0;.#ifdef
6e80: 20 53 51 4c 49 54 45 5f 57 33 32 5f 54 48 52 45   SQLITE_W32_THRE
6e90: 41 44 53 0a 20 20 73 74 61 74 69 63 20 43 52 49  ADS.  static CRI
6ea0: 54 49 43 41 4c 5f 53 45 43 54 49 4f 4e 20 63 73  TICAL_SECTION cs
6eb0: 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ;.#endif../*.** 
6ec0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 61  The following pa
6ed0: 69 72 20 6f 66 20 72 6f 75 74 69 6e 65 20 69 6d  ir of routine im
6ee0: 70 6c 65 6d 65 6e 74 20 6d 75 74 75 61 6c 20 65  plement mutual e
6ef0: 78 63 6c 75 73 69 6f 6e 20 66 6f 72 0a 2a 2a 20  xclusion for.** 
6f00: 6d 75 6c 74 69 2d 74 68 72 65 61 64 65 64 20 70  multi-threaded p
6f10: 72 6f 63 65 73 73 65 73 2e 20 20 4f 6e 6c 79 20  rocesses.  Only 
6f20: 61 20 73 69 6e 67 6c 65 20 74 68 72 65 61 64 20  a single thread 
6f30: 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f 0a 2a 2a  is allowed to.**
6f40: 20 65 78 65 63 75 74 65 64 20 63 6f 64 65 20 74   executed code t
6f50: 68 61 74 20 69 73 20 73 75 72 72 6f 75 6e 64 65  hat is surrounde
6f60: 64 20 62 79 20 45 6e 74 65 72 4d 75 74 65 78 28  d by EnterMutex(
6f70: 29 20 61 6e 64 20 4c 65 61 76 65 4d 75 74 65 78  ) and LeaveMutex
6f80: 28 29 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65  ()..**.** SQLite
6f90: 20 75 73 65 73 20 6f 6e 6c 79 20 61 20 73 69 6e   uses only a sin
6fa0: 67 6c 65 20 4d 75 74 65 78 2e 20 20 54 68 65 72  gle Mutex.  Ther
6fb0: 65 20 69 73 20 6e 6f 74 20 6d 75 63 68 20 63 72  e is not much cr
6fc0: 69 74 69 63 61 6c 0a 2a 2a 20 63 6f 64 65 20 61  itical.** code a
6fd0: 6e 64 20 77 68 61 74 20 6c 69 74 74 6c 65 20 74  nd what little t
6fe0: 68 65 72 65 20 69 73 20 65 78 65 63 75 74 65 73  here is executes
6ff0: 20 71 75 69 63 6b 6c 79 20 61 6e 64 20 77 69 74   quickly and wit
7000: 68 6f 75 74 20 62 6c 6f 63 6b 69 6e 67 2e 0a 2a  hout blocking..*
7010: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57 69  /.void sqlite3Wi
7020: 6e 45 6e 74 65 72 4d 75 74 65 78 28 29 7b 0a 23  nEnterMutex(){.#
7030: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 33 32  ifdef SQLITE_W32
7040: 5f 54 48 52 45 41 44 53 0a 20 20 73 74 61 74 69  _THREADS.  stati
7050: 63 20 69 6e 74 20 69 73 49 6e 69 74 20 3d 20 30  c int isInit = 0
7060: 3b 0a 20 20 77 68 69 6c 65 28 20 21 69 73 49 6e  ;.  while( !isIn
7070: 69 74 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63  it ){.    static
7080: 20 6c 6f 6e 67 20 6c 6f 63 6b 20 3d 20 30 3b 0a   long lock = 0;.
7090: 20 20 20 20 69 66 28 20 49 6e 74 65 72 6c 6f 63      if( Interloc
70a0: 6b 65 64 49 6e 63 72 65 6d 65 6e 74 28 26 6c 6f  kedIncrement(&lo
70b0: 63 6b 29 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  ck)==1 ){.      
70c0: 49 6e 69 74 69 61 6c 69 7a 65 43 72 69 74 69 63  InitializeCritic
70d0: 61 6c 53 65 63 74 69 6f 6e 28 26 63 73 29 3b 0a  alSection(&cs);.
70e0: 20 20 20 20 20 20 69 73 49 6e 69 74 20 3d 20 31        isInit = 1
70f0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
7100: 20 20 20 53 6c 65 65 70 28 31 29 3b 0a 20 20 20     Sleep(1);.   
7110: 20 7d 0a 20 20 7d 0a 20 20 45 6e 74 65 72 43 72   }.  }.  EnterCr
7120: 69 74 69 63 61 6c 53 65 63 74 69 6f 6e 28 26 63  iticalSection(&c
7130: 73 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73  s);.#endif.  ass
7140: 65 72 74 28 20 21 69 6e 4d 75 74 65 78 20 29 3b  ert( !inMutex );
7150: 0a 20 20 69 6e 4d 75 74 65 78 20 3d 20 31 3b 0a  .  inMutex = 1;.
7160: 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 57 69  }.void sqlite3Wi
7170: 6e 4c 65 61 76 65 4d 75 74 65 78 28 29 7b 0a 20  nLeaveMutex(){. 
7180: 20 61 73 73 65 72 74 28 20 69 6e 4d 75 74 65 78   assert( inMutex
7190: 20 29 3b 0a 20 20 69 6e 4d 75 74 65 78 20 3d 20   );.  inMutex = 
71a0: 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  0;.#ifdef SQLITE
71b0: 5f 57 33 32 5f 54 48 52 45 41 44 53 0a 20 20 4c  _W32_THREADS.  L
71c0: 65 61 76 65 43 72 69 74 69 63 61 6c 53 65 63 74  eaveCriticalSect
71d0: 69 6f 6e 28 26 63 73 29 3b 0a 23 65 6e 64 69 66  ion(&cs);.#endif
71e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
71f0: 20 54 52 55 45 20 69 66 20 77 65 20 61 72 65 20   TRUE if we are 
7200: 63 75 72 72 65 6e 74 6c 79 20 77 69 74 68 69 6e  currently within
7210: 20 74 68 65 20 6d 75 74 65 78 20 61 6e 64 20 46   the mutex and F
7220: 41 4c 53 45 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a  ALSE if not..*/.
7230: 69 6e 74 20 73 71 6c 69 74 65 33 57 69 6e 49 6e  int sqlite3WinIn
7240: 4d 75 74 65 78 28 29 7b 0a 20 20 72 65 74 75 72  Mutex(){.  retur
7250: 6e 20 69 6e 4d 75 74 65 78 3b 0a 7d 0a 0a 0a 2f  n inMutex;.}.../
7260: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
7270: 6e 67 20 76 61 72 69 61 62 6c 65 2c 20 69 66 20  ng variable, if 
7280: 73 65 74 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72  set to a non-zer
7290: 6f 20 76 61 6c 75 65 2c 20 62 65 63 6f 6d 65 73  o value, becomes
72a0: 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 72   the result.** r
72b0: 65 74 75 72 6e 65 64 20 66 72 6f 6d 20 73 71 6c  eturned from sql
72c0: 69 74 65 33 4f 73 43 75 72 72 65 6e 74 54 69 6d  ite3OsCurrentTim
72d0: 65 28 29 2e 20 20 54 68 69 73 20 69 73 20 75 73  e().  This is us
72e0: 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 2e 0a  ed for testing..
72f0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
7300: 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65  _TEST.int sqlite
7310: 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 3d  3_current_time =
7320: 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a   0;.#endif../*.*
7330: 2a 20 46 69 6e 64 20 74 68 65 20 63 75 72 72 65  * Find the curre
7340: 6e 74 20 74 69 6d 65 20 28 69 6e 20 55 6e 69 76  nt time (in Univ
7350: 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65  ersal Coordinate
7360: 64 20 54 69 6d 65 29 2e 20 20 57 72 69 74 65 20  d Time).  Write 
7370: 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 74  the.** current t
7380: 69 6d 65 20 61 6e 64 20 64 61 74 65 20 61 73 20  ime and date as 
7390: 61 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d  a Julian Day num
73a0: 62 65 72 20 69 6e 74 6f 20 2a 70 72 4e 6f 77 20  ber into *prNow 
73b0: 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20 30 2e  and.** return 0.
73c0: 20 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68    Return 1 if th
73d0: 65 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20  e time and date 
73e0: 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e  cannot be found.
73f0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 57  .*/.int sqlite3W
7400: 69 6e 43 75 72 72 65 6e 74 54 69 6d 65 28 64 6f  inCurrentTime(do
7410: 75 62 6c 65 20 2a 70 72 4e 6f 77 29 7b 0a 20 20  uble *prNow){.  
7420: 46 49 4c 45 54 49 4d 45 20 66 74 3b 0a 20 20 2f  FILETIME ft;.  /
7430: 2a 20 46 49 4c 45 54 49 4d 45 20 73 74 72 75 63  * FILETIME struc
7440: 74 75 72 65 20 69 73 20 61 20 36 34 2d 62 69 74  ture is a 64-bit
7450: 20 76 61 6c 75 65 20 72 65 70 72 65 73 65 6e 74   value represent
7460: 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ing the number o
7470: 66 20 0a 20 20 20 20 20 31 30 30 2d 6e 61 6e 6f  f .     100-nano
7480: 73 65 63 6f 6e 64 20 69 6e 74 65 72 76 61 6c 73  second intervals
7490: 20 73 69 6e 63 65 20 4a 61 6e 75 61 72 79 20 31   since January 1
74a0: 2c 20 31 36 30 31 20 28 3d 20 4a 44 20 32 33 30  , 1601 (= JD 230
74b0: 35 38 31 33 2e 35 29 2e 20 0a 20 20 2a 2f 0a 20  5813.5). .  */. 
74c0: 20 64 6f 75 62 6c 65 20 6e 6f 77 3b 0a 23 69 66   double now;.#if
74d0: 20 4f 53 5f 57 49 4e 43 45 0a 20 20 53 59 53 54   OS_WINCE.  SYST
74e0: 45 4d 54 49 4d 45 20 74 69 6d 65 3b 0a 20 20 47  EMTIME time;.  G
74f0: 65 74 53 79 73 74 65 6d 54 69 6d 65 28 26 74 69  etSystemTime(&ti
7500: 6d 65 29 3b 0a 20 20 53 79 73 74 65 6d 54 69 6d  me);.  SystemTim
7510: 65 54 6f 46 69 6c 65 54 69 6d 65 28 26 74 69 6d  eToFileTime(&tim
7520: 65 2c 26 66 74 29 3b 0a 23 65 6c 73 65 0a 20 20  e,&ft);.#else.  
7530: 47 65 74 53 79 73 74 65 6d 54 69 6d 65 41 73 46  GetSystemTimeAsF
7540: 69 6c 65 54 69 6d 65 28 20 26 66 74 20 29 3b 0a  ileTime( &ft );.
7550: 23 65 6e 64 69 66 0a 20 20 6e 6f 77 20 3d 20 28  #endif.  now = (
7560: 28 64 6f 75 62 6c 65 29 66 74 2e 64 77 48 69 67  (double)ft.dwHig
7570: 68 44 61 74 65 54 69 6d 65 29 20 2a 20 34 32 39  hDateTime) * 429
7580: 34 39 36 37 32 39 36 2e 30 3b 20 0a 20 20 2a 70  4967296.0; .  *p
7590: 72 4e 6f 77 20 3d 20 28 6e 6f 77 20 2b 20 66 74  rNow = (now + ft
75a0: 2e 64 77 4c 6f 77 44 61 74 65 54 69 6d 65 29 2f  .dwLowDateTime)/
75b0: 38 36 34 30 30 30 30 30 30 30 30 30 2e 30 20 2b  864000000000.0 +
75c0: 20 32 33 30 35 38 31 33 2e 35 3b 0a 23 69 66 64   2305813.5;.#ifd
75d0: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
75e0: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63 75 72   if( sqlite3_cur
75f0: 72 65 6e 74 5f 74 69 6d 65 20 29 7b 0a 20 20 20  rent_time ){.   
7600: 20 2a 70 72 4e 6f 77 20 3d 20 73 71 6c 69 74 65   *prNow = sqlite
7610: 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 2f 38  3_current_time/8
7620: 36 34 30 30 2e 30 20 2b 20 32 34 34 30 35 38 37  6400.0 + 2440587
7630: 2e 35 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  .5;.  }.#endif. 
7640: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
7650: 0a 2a 2a 20 49 66 20 63 61 6c 6c 65 64 20 77 69  .** If called wi
7660: 74 68 20 61 6c 6c 6f 63 61 74 65 46 6c 61 67 3d  th allocateFlag=
7670: 3d 31 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20  =1, then return 
7680: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 72  a pointer to thr
7690: 65 61 64 0a 2a 2a 20 73 70 65 63 69 66 69 63 20  ead.** specific 
76a0: 64 61 74 61 20 66 6f 72 20 74 68 65 20 63 75 72  data for the cur
76b0: 72 65 6e 74 20 74 68 72 65 61 64 2e 20 20 41 6c  rent thread.  Al
76c0: 6c 6f 63 61 74 65 20 61 6e 64 20 7a 65 72 6f 20  locate and zero 
76d0: 74 68 65 0a 2a 2a 20 74 68 72 65 61 64 2d 73 70  the.** thread-sp
76e0: 65 63 69 66 69 63 20 64 61 74 61 20 69 66 20 69  ecific data if i
76f0: 74 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61  t does not alrea
7700: 64 79 20 65 78 69 73 74 20 6e 65 63 65 73 73 61  dy exist necessa
7710: 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 63 61 6c  ry..**.** If cal
7720: 6c 65 64 20 77 69 74 68 20 61 6c 6c 6f 63 61 74  led with allocat
7730: 65 46 6c 61 67 3d 3d 30 2c 20 74 68 65 6e 20 63  eFlag==0, then c
7740: 68 65 63 6b 20 74 68 65 20 63 75 72 72 65 6e 74  heck the current
7750: 20 74 68 72 65 61 64 0a 2a 2a 20 73 70 65 63 69   thread.** speci
7760: 66 69 63 20 64 61 74 61 2e 20 20 49 66 20 69 74  fic data.  If it
7770: 20 65 78 69 73 74 73 20 61 6e 64 20 69 73 20 61   exists and is a
7780: 6c 6c 20 7a 65 72 6f 73 2c 20 74 68 65 6e 20 64  ll zeros, then d
7790: 65 61 6c 6c 6f 63 61 74 65 20 69 74 2e 0a 2a 2a  eallocate it..**
77a0: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
77b0: 72 20 74 6f 20 74 68 65 20 74 68 72 65 61 64 20  r to the thread 
77c0: 73 70 65 63 69 66 69 63 20 64 61 74 61 20 6f 72  specific data or
77d0: 20 4e 55 4c 4c 20 69 66 20 69 74 20 69 73 0a 2a   NULL if it is.*
77e0: 2a 20 75 6e 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a  * unallocated..*
77f0: 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 57  /.void *sqlite3W
7800: 69 6e 54 68 72 65 61 64 53 70 65 63 69 66 69 63  inThreadSpecific
7810: 44 61 74 61 28 69 6e 74 20 61 6c 6c 6f 63 61 74  Data(int allocat
7820: 65 46 6c 61 67 29 7b 0a 20 20 73 74 61 74 69 63  eFlag){.  static
7830: 20 76 6f 69 64 20 2a 70 54 73 64 20 3d 20 30 3b   void *pTsd = 0;
7840: 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 6b 65  .  static int ke
7850: 79 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20  y;.  static int 
7860: 6b 65 79 49 6e 69 74 20 3d 20 30 3b 0a 20 20 73  keyInit = 0;.  s
7870: 74 61 74 69 63 20 63 6f 6e 73 74 20 54 68 72 65  tatic const Thre
7880: 61 64 44 61 74 61 20 7a 65 72 6f 44 61 74 61 3b  adData zeroData;
7890: 0a 0a 20 20 69 66 28 20 21 6b 65 79 49 6e 69 74  ..  if( !keyInit
78a0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
78b0: 73 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  sEnterMutex();. 
78c0: 20 20 20 69 66 28 20 21 6b 65 79 49 6e 69 74 20     if( !keyInit 
78d0: 29 7b 0a 20 20 20 20 20 20 6b 65 79 20 3d 20 54  ){.      key = T
78e0: 6c 73 41 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20  lsAlloc();.     
78f0: 20 69 66 28 20 6b 65 79 3d 3d 30 78 66 66 66 66   if( key==0xffff
7900: 66 66 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20  ffff ){.        
7910: 73 71 6c 69 74 65 33 4f 73 4c 65 61 76 65 4d 75  sqlite3OsLeaveMu
7920: 74 65 78 28 29 3b 0a 20 20 20 20 20 20 20 20 72  tex();.        r
7930: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d  eturn 0;.      }
7940: 0a 20 20 20 20 20 20 6b 65 79 49 6e 69 74 20 3d  .      keyInit =
7950: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71   1;.    }.    sq
7960: 6c 69 74 65 33 4f 73 4c 65 61 76 65 4d 75 74 65  lite3OsLeaveMute
7970: 78 28 29 3b 0a 20 20 7d 0a 20 20 70 54 73 64 20  x();.  }.  pTsd 
7980: 3d 20 54 6c 73 47 65 74 56 61 6c 75 65 28 6b 65  = TlsGetValue(ke
7990: 79 29 3b 0a 20 20 69 66 28 20 61 6c 6c 6f 63 61  y);.  if( alloca
79a0: 74 65 46 6c 61 67 20 29 7b 0a 20 20 20 20 69 66  teFlag ){.    if
79b0: 28 20 21 70 54 73 64 20 29 7b 0a 20 20 20 20 20  ( !pTsd ){.     
79c0: 20 70 54 73 64 20 3d 20 73 71 6c 69 74 65 33 4f   pTsd = sqlite3O
79d0: 73 4d 61 6c 6c 6f 63 28 6e 42 79 74 65 29 3b 0a  sMalloc(nByte);.
79e0: 20 20 20 20 20 20 69 66 28 20 70 54 73 64 20 29        if( pTsd )
79f0: 7b 0a 20 20 20 20 20 20 20 20 2a 70 54 73 64 20  {.        *pTsd 
7a00: 3d 20 7a 65 72 6f 44 61 74 61 3b 0a 20 20 20 20  = zeroData;.    
7a10: 20 20 20 20 54 6c 73 53 65 74 56 61 6c 75 65 28      TlsSetValue(
7a20: 6b 65 79 2c 20 70 54 73 64 29 3b 0a 20 20 20 20  key, pTsd);.    
7a30: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73    }.    }.  }els
7a40: 65 20 69 66 28 20 70 54 73 64 21 3d 30 20 26 26  e if( pTsd!=0 &&
7a50: 20 6d 65 6d 63 6d 70 28 70 54 73 64 2c 20 26 7a   memcmp(pTsd, &z
7a60: 65 72 6f 44 61 74 61 2c 20 73 69 7a 65 6f 66 28  eroData, sizeof(
7a70: 7a 65 72 6f 44 61 74 61 29 29 3d 3d 30 20 29 7b  zeroData))==0 ){
7a80: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 46 72  .    sqlite3OsFr
7a90: 65 65 28 70 54 73 64 29 3b 0a 20 20 20 20 54 6c  ee(pTsd);.    Tl
7aa0: 73 53 65 74 56 61 6c 75 65 28 6b 65 79 2c 20 30  sSetValue(key, 0
7ab0: 29 3b 0a 20 20 20 20 70 54 73 64 20 3d 20 30 3b  );.    pTsd = 0;
7ac0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 54  .  }.  return pT
7ad0: 73 64 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  sd;.}.#endif /* 
7ae0: 4f 53 5f 57 49 4e 20 2a 2f 0a                    OS_WIN */.