/ Hex Artifact Content
Login

Artifact 8cfb27bd84900d542d2f520375aa407cb3ed6aab:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 36 0a 2a 2a 0a 2a 2a 20 54 68  mber 16.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
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 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a  ***********.**.*
0180: 2a 20 54 68 69 73 20 66 69 6c 65 20 63 6f 6e 74  * This file cont
0190: 61 69 6e 73 20 63 6f 64 65 20 74 68 61 74 20 69  ains code that i
01a0: 73 20 73 70 65 63 69 66 69 63 20 74 6f 20 70 61  s specific to pa
01b0: 72 74 69 63 75 6c 61 72 20 6f 70 65 72 61 74 69  rticular operati
01c0: 6e 67 0a 2a 2a 20 73 79 73 74 65 6d 73 2e 20 20  ng.** systems.  
01d0: 54 68 65 20 70 75 72 70 6f 73 65 20 6f 66 20 74  The purpose of t
01e0: 68 69 73 20 66 69 6c 65 20 69 73 20 74 6f 20 70  his file is to p
01f0: 72 6f 76 69 64 65 20 61 20 75 6e 69 66 6f 72 6d  rovide a uniform
0200: 20 61 62 73 74 72 61 63 74 69 6f 6e 0a 2a 2a 20   abstraction.** 
0210: 6f 6e 20 77 68 69 63 68 20 74 68 65 20 72 65 73  on which the res
0220: 74 20 6f 66 20 53 51 4c 69 74 65 20 63 61 6e 20  t of SQLite can 
0230: 6f 70 65 72 61 74 65 2e 0a 2a 2f 0a 23 69 6e 63  operate..*/.#inc
0240: 6c 75 64 65 20 22 6f 73 2e 68 22 20 20 20 20 20  lude "os.h"     
0250: 20 20 20 20 20 2f 2a 20 4d 75 73 74 20 62 65 20       /* Must be 
0260: 66 69 72 73 74 20 74 6f 20 65 6e 61 62 6c 65 20  first to enable 
0270: 6c 61 72 67 65 20 66 69 6c 65 20 73 75 70 70 6f  large file suppo
0280: 72 74 20 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22  rt */.#include "
0290: 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a 23 69  sqliteInt.h"..#i
02a0: 66 20 4f 53 5f 55 4e 49 58 0a 23 20 69 6e 63 6c  f OS_UNIX.# incl
02b0: 75 64 65 20 3c 74 69 6d 65 2e 68 3e 0a 23 20 69  ude <time.h>.# i
02c0: 6e 63 6c 75 64 65 20 3c 65 72 72 6e 6f 2e 68 3e  nclude <errno.h>
02d0: 0a 23 20 69 6e 63 6c 75 64 65 20 3c 75 6e 69 73  .# include <unis
02e0: 74 64 2e 68 3e 0a 23 20 69 66 6e 64 65 66 20 4f  td.h>.# ifndef O
02f0: 5f 4c 41 52 47 45 46 49 4c 45 0a 23 20 20 64 65  _LARGEFILE.#  de
0300: 66 69 6e 65 20 4f 5f 4c 41 52 47 45 46 49 4c 45  fine O_LARGEFILE
0310: 20 30 0a 23 20 65 6e 64 69 66 0a 23 20 69 66 64   0.# endif.# ifd
0320: 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c  ef SQLITE_DISABL
0330: 45 5f 4c 46 53 0a 23 20 20 75 6e 64 65 66 20 4f  E_LFS.#  undef O
0340: 5f 4c 41 52 47 45 46 49 4c 45 0a 23 20 20 64 65  _LARGEFILE.#  de
0350: 66 69 6e 65 20 4f 5f 4c 41 52 47 45 46 49 4c 45  fine O_LARGEFILE
0360: 20 30 0a 23 20 65 6e 64 69 66 0a 23 20 69 66 6e   0.# endif.# ifn
0370: 64 65 66 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57 0a 23  def O_NOFOLLOW.#
0380: 20 20 64 65 66 69 6e 65 20 4f 5f 4e 4f 46 4f 4c    define O_NOFOL
0390: 4c 4f 57 20 30 0a 23 20 65 6e 64 69 66 0a 23 20  LOW 0.# endif.# 
03a0: 69 66 6e 64 65 66 20 4f 5f 42 49 4e 41 52 59 0a  ifndef O_BINARY.
03b0: 23 20 20 64 65 66 69 6e 65 20 4f 5f 42 49 4e 41  #  define O_BINA
03c0: 52 59 20 30 0a 23 20 65 6e 64 69 66 0a 23 65 6e  RY 0.# endif.#en
03d0: 64 69 66 0a 0a 0a 23 69 66 20 4f 53 5f 57 49 4e  dif...#if OS_WIN
03e0: 0a 23 20 69 6e 63 6c 75 64 65 20 3c 77 69 6e 62  .# include <winb
03f0: 61 73 65 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 23  ase.h>.#endif..#
0400: 69 66 20 4f 53 5f 4d 41 43 0a 23 20 69 6e 63 6c  if OS_MAC.# incl
0410: 75 64 65 20 3c 65 78 74 72 61 73 2e 68 3e 0a 23  ude <extras.h>.#
0420: 20 69 6e 63 6c 75 64 65 20 3c 70 61 74 68 32 66   include <path2f
0430: 73 73 2e 68 3e 0a 23 20 69 6e 63 6c 75 64 65 20  ss.h>.# include 
0440: 3c 54 65 78 74 55 74 69 6c 73 2e 68 3e 0a 23 20  <TextUtils.h>.# 
0450: 69 6e 63 6c 75 64 65 20 3c 46 69 6e 64 65 72 52  include <FinderR
0460: 65 67 69 73 74 72 79 2e 68 3e 0a 23 20 69 6e 63  egistry.h>.# inc
0470: 6c 75 64 65 20 3c 46 6f 6c 64 65 72 73 2e 68 3e  lude <Folders.h>
0480: 0a 23 20 69 6e 63 6c 75 64 65 20 3c 54 69 6d 65  .# include <Time
0490: 72 2e 68 3e 0a 23 20 69 6e 63 6c 75 64 65 20 3c  r.h>.# include <
04a0: 4f 53 55 74 69 6c 73 2e 68 3e 0a 23 65 6e 64 69  OSUtils.h>.#endi
04b0: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 44 4a 47  f../*.** The DJG
04c0: 50 50 20 63 6f 6d 70 69 6c 65 72 20 65 6e 76 69  PP compiler envi
04d0: 72 6f 6e 6d 65 6e 74 20 6c 6f 6f 6b 73 20 6d 6f  ronment looks mo
04e0: 73 74 6c 79 20 6c 69 6b 65 20 55 6e 69 78 2c 20  stly like Unix, 
04f0: 62 75 74 20 69 74 0a 2a 2a 20 6c 61 63 6b 73 20  but it.** lacks 
0500: 74 68 65 20 66 63 6e 74 6c 28 29 20 73 79 73 74  the fcntl() syst
0510: 65 6d 20 63 61 6c 6c 2e 20 20 53 6f 20 72 65 64  em call.  So red
0520: 65 66 69 6e 65 20 66 63 6e 74 6c 28 29 20 74 6f  efine fcntl() to
0530: 20 62 65 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a   be something.**
0540: 20 74 68 61 74 20 61 6c 77 61 79 73 20 73 75 63   that always suc
0550: 63 65 65 64 73 2e 20 20 54 68 69 73 20 6d 65 61  ceeds.  This mea
0560: 6e 73 20 74 68 61 74 20 6c 6f 63 6b 69 6e 67 20  ns that locking 
0570: 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72 20 75  does not occur u
0580: 6e 64 65 72 0a 2a 2a 20 44 4a 47 50 50 2e 20 20  nder.** DJGPP.  
0590: 42 75 74 20 69 74 73 20 44 4f 53 20 2d 20 77 68  But its DOS - wh
05a0: 61 74 20 64 69 64 20 79 6f 75 20 65 78 70 65 63  at did you expec
05b0: 74 3f 0a 2a 2f 0a 23 69 66 64 65 66 20 5f 5f 44  t?.*/.#ifdef __D
05c0: 4a 47 50 50 5f 5f 0a 23 20 64 65 66 69 6e 65 20  JGPP__.# define 
05d0: 66 63 6e 74 6c 28 41 2c 42 2c 43 29 20 30 0a 23  fcntl(A,B,C) 0.#
05e0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 63  endif../*.** Mac
05f0: 72 6f 73 20 75 73 65 64 20 74 6f 20 64 65 74 65  ros used to dete
0600: 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72  rmine whether or
0610: 20 6e 6f 74 20 74 6f 20 75 73 65 20 74 68 72 65   not to use thre
0620: 61 64 73 2e 20 20 54 68 65 0a 2a 2a 20 53 51 4c  ads.  The.** SQL
0630: 49 54 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53  ITE_UNIX_THREADS
0640: 20 6d 61 63 72 6f 20 69 73 20 64 65 66 69 6e 65   macro is define
0650: 64 20 69 66 20 77 65 20 61 72 65 20 73 79 6e 63  d if we are sync
0660: 68 72 6f 6e 69 7a 69 6e 67 20 66 6f 72 0a 2a 2a  hronizing for.**
0670: 20 50 6f 73 69 78 20 74 68 72 65 61 64 73 20 61   Posix threads a
0680: 6e 64 20 53 51 4c 49 54 45 5f 57 33 32 5f 54 48  nd SQLITE_W32_TH
0690: 52 45 41 44 53 20 69 73 20 64 65 66 69 6e 65 64  READS is defined
06a0: 20 69 66 20 77 65 20 61 72 65 0a 2a 2a 20 73 79   if we are.** sy
06b0: 6e 63 68 72 6f 6e 69 7a 69 6e 67 20 75 73 69 6e  nchronizing usin
06c0: 67 20 57 69 6e 33 32 20 74 68 72 65 61 64 73 2e  g Win32 threads.
06d0: 0a 2a 2f 0a 23 69 66 20 4f 53 5f 55 4e 49 58 20  .*/.#if OS_UNIX 
06e0: 26 26 20 64 65 66 69 6e 65 64 28 54 48 52 45 41  && defined(THREA
06f0: 44 53 41 46 45 29 20 26 26 20 54 48 52 45 41 44  DSAFE) && THREAD
0700: 53 41 46 45 0a 23 20 69 6e 63 6c 75 64 65 20 3c  SAFE.# include <
0710: 70 74 68 72 65 61 64 2e 68 3e 0a 23 20 64 65 66  pthread.h>.# def
0720: 69 6e 65 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f  ine SQLITE_UNIX_
0730: 54 48 52 45 41 44 53 20 31 0a 23 65 6e 64 69 66  THREADS 1.#endif
0740: 0a 23 69 66 20 4f 53 5f 57 49 4e 20 26 26 20 64  .#if OS_WIN && d
0750: 65 66 69 6e 65 64 28 54 48 52 45 41 44 53 41 46  efined(THREADSAF
0760: 45 29 20 26 26 20 54 48 52 45 41 44 53 41 46 45  E) && THREADSAFE
0770: 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  .# define SQLITE
0780: 5f 57 33 32 5f 54 48 52 45 41 44 53 20 31 0a 23  _W32_THREADS 1.#
0790: 65 6e 64 69 66 0a 23 69 66 20 4f 53 5f 4d 41 43  endif.#if OS_MAC
07a0: 20 26 26 20 64 65 66 69 6e 65 64 28 54 48 52 45   && defined(THRE
07b0: 41 44 53 41 46 45 29 20 26 26 20 54 48 52 45 41  ADSAFE) && THREA
07c0: 44 53 41 46 45 0a 23 20 69 6e 63 6c 75 64 65 20  DSAFE.# include 
07d0: 3c 4d 75 6c 74 69 70 72 6f 63 65 73 73 69 6e 67  <Multiprocessing
07e0: 2e 68 3e 0a 23 20 64 65 66 69 6e 65 20 53 51 4c  .h>.# define SQL
07f0: 49 54 45 5f 4d 41 43 4f 53 5f 4d 55 4c 54 49 54  ITE_MACOS_MULTIT
0800: 41 53 4b 49 4e 47 20 31 0a 23 65 6e 64 69 66 0a  ASKING 1.#endif.
0810: 0a 2f 2a 0a 2a 2a 20 4d 61 63 72 6f 73 20 66 6f  ./*.** Macros fo
0820: 72 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 74 72  r performance tr
0830: 61 63 69 6e 67 2e 20 20 4e 6f 72 6d 61 6c 6c 79  acing.  Normally
0840: 20 74 75 72 6e 65 64 20 6f 66 66 0a 2a 2f 0a 23   turned off.*/.#
0850: 69 66 20 30 0a 73 74 61 74 69 63 20 69 6e 74 20  if 0.static int 
0860: 6c 61 73 74 5f 70 61 67 65 20 3d 20 30 3b 0a 5f  last_page = 0;._
0870: 5f 69 6e 6c 69 6e 65 5f 5f 20 75 6e 73 69 67 6e  _inline__ unsign
0880: 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 69 6e 74  ed long long int
0890: 20 68 77 74 69 6d 65 28 76 6f 69 64 29 7b 0a 20   hwtime(void){. 
08a0: 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c   unsigned long l
08b0: 6f 6e 67 20 69 6e 74 20 78 3b 0a 20 20 5f 5f 61  ong int x;.  __a
08c0: 73 6d 5f 5f 28 22 72 64 74 73 63 5c 6e 5c 74 22  sm__("rdtsc\n\t"
08d0: 0a 20 20 20 20 20 20 20 20 20 20 22 6d 6f 76 20  .          "mov 
08e0: 25 25 65 64 78 2c 20 25 25 65 63 78 5c 6e 5c 74  %%edx, %%ecx\n\t
08f0: 22 0a 20 20 20 20 20 20 20 20 20 20 3a 22 3d 41  ".          :"=A
0900: 22 20 28 78 29 29 3b 0a 20 20 72 65 74 75 72 6e  " (x));.  return
0910: 20 78 3b 0a 7d 0a 73 74 61 74 69 63 20 75 6e 73   x;.}.static uns
0920: 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20  igned long long 
0930: 69 6e 74 20 67 5f 73 74 61 72 74 3b 0a 73 74 61  int g_start;.sta
0940: 74 69 63 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  tic unsigned int
0950: 20 65 6c 61 70 73 65 3b 0a 23 64 65 66 69 6e 65   elapse;.#define
0960: 20 54 49 4d 45 52 5f 53 54 41 52 54 20 20 20 20   TIMER_START    
0970: 20 20 20 67 5f 73 74 61 72 74 3d 68 77 74 69 6d     g_start=hwtim
0980: 65 28 29 0a 23 64 65 66 69 6e 65 20 54 49 4d 45  e().#define TIME
0990: 52 5f 45 4e 44 20 20 20 20 20 20 20 20 20 65 6c  R_END         el
09a0: 61 70 73 65 3d 68 77 74 69 6d 65 28 29 2d 67 5f  apse=hwtime()-g_
09b0: 73 74 61 72 74 0a 23 64 65 66 69 6e 65 20 53 45  start.#define SE
09c0: 45 4b 28 58 29 20 20 20 20 20 20 20 20 20 20 20  EK(X)           
09d0: 6c 61 73 74 5f 70 61 67 65 3d 28 58 29 0a 23 64  last_page=(X).#d
09e0: 65 66 69 6e 65 20 54 52 41 43 45 31 28 58 29 20  efine TRACE1(X) 
09f0: 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
0a00: 73 74 64 65 72 72 2c 58 29 0a 23 64 65 66 69 6e  stderr,X).#defin
0a10: 65 20 54 52 41 43 45 32 28 58 2c 59 29 20 20 20  e TRACE2(X,Y)   
0a20: 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
0a30: 72 72 2c 58 2c 59 29 0a 23 64 65 66 69 6e 65 20  rr,X,Y).#define 
0a40: 54 52 41 43 45 33 28 58 2c 59 2c 5a 29 20 20 20  TRACE3(X,Y,Z)   
0a50: 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
0a60: 2c 58 2c 59 2c 5a 29 0a 23 64 65 66 69 6e 65 20  ,X,Y,Z).#define 
0a70: 54 52 41 43 45 34 28 58 2c 59 2c 5a 2c 41 29 20  TRACE4(X,Y,Z,A) 
0a80: 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
0a90: 2c 58 2c 59 2c 5a 2c 41 29 0a 23 64 65 66 69 6e  ,X,Y,Z,A).#defin
0aa0: 65 20 54 52 41 43 45 35 28 58 2c 59 2c 5a 2c 41  e TRACE5(X,Y,Z,A
0ab0: 2c 42 29 20 66 70 72 69 6e 74 66 28 73 74 64 65  ,B) fprintf(stde
0ac0: 72 72 2c 58 2c 59 2c 5a 2c 41 2c 42 29 0a 23 65  rr,X,Y,Z,A,B).#e
0ad0: 6c 73 65 0a 23 64 65 66 69 6e 65 20 54 49 4d 45  lse.#define TIME
0ae0: 52 5f 53 54 41 52 54 0a 23 64 65 66 69 6e 65 20  R_START.#define 
0af0: 54 49 4d 45 52 5f 45 4e 44 0a 23 64 65 66 69 6e  TIMER_END.#defin
0b00: 65 20 53 45 45 4b 28 58 29 0a 23 64 65 66 69 6e  e SEEK(X).#defin
0b10: 65 20 54 52 41 43 45 31 28 58 29 0a 23 64 65 66  e TRACE1(X).#def
0b20: 69 6e 65 20 54 52 41 43 45 32 28 58 2c 59 29 0a  ine TRACE2(X,Y).
0b30: 23 64 65 66 69 6e 65 20 54 52 41 43 45 33 28 58  #define TRACE3(X
0b40: 2c 59 2c 5a 29 0a 23 64 65 66 69 6e 65 20 54 52  ,Y,Z).#define TR
0b50: 41 43 45 34 28 58 2c 59 2c 5a 2c 41 29 0a 23 64  ACE4(X,Y,Z,A).#d
0b60: 65 66 69 6e 65 20 54 52 41 43 45 35 28 58 2c 59  efine TRACE5(X,Y
0b70: 2c 5a 2c 41 2c 42 29 0a 23 65 6e 64 69 66 0a 0a  ,Z,A,B).#endif..
0b80: 0a 23 69 66 20 4f 53 5f 55 4e 49 58 0a 2f 2a 0a  .#if OS_UNIX./*.
0b90: 2a 2a 20 48 65 72 65 20 69 73 20 74 68 65 20 64  ** Here is the d
0ba0: 69 72 74 20 6f 6e 20 50 4f 53 49 58 20 61 64 76  irt on POSIX adv
0bb0: 69 73 6f 72 79 20 6c 6f 63 6b 73 3a 20 20 41 4e  isory locks:  AN
0bc0: 53 49 20 53 54 44 20 31 30 30 33 2e 31 20 28 31  SI STD 1003.1 (1
0bd0: 39 39 36 29 0a 2a 2a 20 73 65 63 74 69 6f 6e 20  996).** section 
0be0: 36 2e 35 2e 32 2e 32 20 6c 69 6e 65 73 20 34 38  6.5.2.2 lines 48
0bf0: 33 20 74 68 72 6f 75 67 68 20 34 39 30 20 73 70  3 through 490 sp
0c00: 65 63 69 66 79 20 74 68 61 74 20 77 68 65 6e 20  ecify that when 
0c10: 61 20 70 72 6f 63 65 73 73 0a 2a 2a 20 73 65 74  a process.** set
0c20: 73 20 6f 72 20 63 6c 65 61 72 73 20 61 20 6c 6f  s or clears a lo
0c30: 63 6b 2c 20 74 68 61 74 20 6f 70 65 72 61 74 69  ck, that operati
0c40: 6f 6e 20 6f 76 65 72 72 69 64 65 73 20 61 6e 79  on overrides any
0c50: 20 70 72 69 6f 72 20 6c 6f 63 6b 73 20 73 65 74   prior locks set
0c60: 0a 2a 2a 20 62 79 20 74 68 65 20 73 61 6d 65 20  .** by the same 
0c70: 70 72 6f 63 65 73 73 2e 20 20 49 74 20 64 6f 65  process.  It doe
0c80: 73 20 6e 6f 74 20 65 78 70 6c 69 63 69 74 6c 79  s not explicitly
0c90: 20 73 61 79 20 73 6f 2c 20 62 75 74 20 74 68 69   say so, but thi
0ca0: 73 20 69 6d 70 6c 69 65 73 0a 2a 2a 20 74 68 61  s implies.** tha
0cb0: 74 20 69 74 20 6f 76 65 72 72 69 64 65 73 20 6c  t it overrides l
0cc0: 6f 63 6b 73 20 73 65 74 20 62 79 20 74 68 65 20  ocks set by the 
0cd0: 73 61 6d 65 20 70 72 6f 63 65 73 73 20 75 73 69  same process usi
0ce0: 6e 67 20 61 20 64 69 66 66 65 72 65 6e 74 0a 2a  ng a different.*
0cf0: 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * file descripto
0d00: 72 2e 20 20 43 6f 6e 73 69 64 65 72 20 74 68 69  r.  Consider thi
0d10: 73 20 74 65 73 74 20 63 61 73 65 3a 0a 2a 2a 0a  s test case:.**.
0d20: 2a 2a 20 20 20 20 20 20 20 69 6e 74 20 66 64 31  **       int fd1
0d30: 20 3d 20 6f 70 65 6e 28 22 2e 2f 66 69 6c 65 31   = open("./file1
0d40: 22 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41  ", O_RDWR|O_CREA
0d50: 54 2c 20 30 36 34 34 29 3b 0a 2a 2a 20 20 20 20  T, 0644);.**    
0d60: 20 20 20 69 6e 74 20 66 64 32 20 3d 20 6f 70 65     int fd2 = ope
0d70: 6e 28 22 2e 2f 66 69 6c 65 32 22 2c 20 4f 5f 52  n("./file2", O_R
0d80: 44 57 52 7c 4f 5f 43 52 45 41 54 2c 20 30 36 34  DWR|O_CREAT, 064
0d90: 34 29 3b 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73  4);.**.** Suppos
0da0: 65 20 2e 2f 66 69 6c 65 31 20 61 6e 64 20 2e 2f  e ./file1 and ./
0db0: 66 69 6c 65 32 20 61 72 65 20 72 65 61 6c 6c 79  file2 are really
0dc0: 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20 28   the same file (
0dd0: 62 65 63 61 75 73 65 0a 2a 2a 20 6f 6e 65 20 69  because.** one i
0de0: 73 20 61 20 68 61 72 64 20 6f 72 20 73 79 6d 62  s a hard or symb
0df0: 6f 6c 69 63 20 6c 69 6e 6b 20 74 6f 20 74 68 65  olic link to the
0e00: 20 6f 74 68 65 72 29 20 74 68 65 6e 20 69 66 20   other) then if 
0e10: 79 6f 75 20 73 65 74 0a 2a 2a 20 61 6e 20 65 78  you set.** an ex
0e20: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20  clusive lock on 
0e30: 66 64 31 2c 20 74 68 65 6e 20 74 72 79 20 74 6f  fd1, then try to
0e40: 20 67 65 74 20 61 6e 20 65 78 63 6c 75 73 69 76   get an exclusiv
0e50: 65 20 6c 6f 63 6b 0a 2a 2a 20 6f 6e 20 66 64 32  e lock.** on fd2
0e60: 2c 20 69 74 20 77 6f 72 6b 73 2e 20 20 49 20 77  , it works.  I w
0e70: 6f 75 6c 64 20 68 61 76 65 20 65 78 70 65 63 74  ould have expect
0e80: 65 64 20 74 68 65 20 73 65 63 6f 6e 64 20 6c 6f  ed the second lo
0e90: 63 6b 20 74 6f 0a 2a 2a 20 66 61 69 6c 20 73 69  ck to.** fail si
0ea0: 6e 63 65 20 74 68 65 72 65 20 77 61 73 20 61 6c  nce there was al
0eb0: 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 6e 20  ready a lock on 
0ec0: 74 68 65 20 66 69 6c 65 20 64 75 65 20 74 6f 20  the file due to 
0ed0: 66 64 31 2e 0a 2a 2a 20 42 75 74 20 6e 6f 74 20  fd1..** But not 
0ee0: 73 6f 2e 20 20 53 69 6e 63 65 20 62 6f 74 68 20  so.  Since both 
0ef0: 6c 6f 63 6b 73 20 63 61 6d 65 20 66 72 6f 6d 20  locks came from 
0f00: 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73  the same process
0f10: 2c 20 74 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20  , the.** second 
0f20: 6f 76 65 72 72 69 64 65 73 20 74 68 65 20 66 69  overrides the fi
0f30: 72 73 74 2c 20 65 76 65 6e 20 74 68 6f 75 67 68  rst, even though
0f40: 20 74 68 65 79 20 77 65 72 65 20 6f 6e 20 64 69   they were on di
0f50: 66 66 65 72 65 6e 74 0a 2a 2a 20 66 69 6c 65 20  fferent.** file 
0f60: 64 65 73 63 72 69 70 74 6f 72 73 20 6f 70 65 6e  descriptors open
0f70: 65 64 20 6f 6e 20 64 69 66 66 65 72 65 6e 74 20  ed on different 
0f80: 66 69 6c 65 20 6e 61 6d 65 73 2e 0a 2a 2a 0a 2a  file names..**.*
0f90: 2a 20 42 75 6d 6d 65 72 2e 20 20 49 66 20 79 6f  * Bummer.  If yo
0fa0: 75 20 61 73 6b 20 6d 65 2c 20 74 68 69 73 20 69  u ask me, this i
0fb0: 73 20 62 72 6f 6b 65 6e 2e 20 20 42 61 64 6c 79  s broken.  Badly
0fc0: 20 62 72 6f 6b 65 6e 2e 20 20 49 74 20 6d 65 61   broken.  It mea
0fd0: 6e 73 0a 2a 2a 20 74 68 61 74 20 77 65 20 63 61  ns.** that we ca
0fe0: 6e 6e 6f 74 20 75 73 65 20 50 4f 53 49 58 20 6c  nnot use POSIX l
0ff0: 6f 63 6b 73 20 74 6f 20 73 79 6e 63 68 72 6f 6e  ocks to synchron
1000: 69 7a 65 20 66 69 6c 65 20 61 63 63 65 73 73 20  ize file access 
1010: 61 6d 6f 6e 67 0a 2a 2a 20 63 6f 6d 70 65 74 69  among.** competi
1020: 6e 67 20 74 68 72 65 61 64 73 20 6f 66 20 74 68  ng threads of th
1030: 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2e 20  e same process. 
1040: 20 50 4f 53 49 58 20 6c 6f 63 6b 73 20 77 69 6c   POSIX locks wil
1050: 6c 20 77 6f 72 6b 20 66 69 6e 65 0a 2a 2a 20 74  l work fine.** t
1060: 6f 20 73 79 6e 63 68 72 6f 6e 69 7a 65 20 61 63  o synchronize ac
1070: 63 65 73 73 20 66 6f 72 20 74 68 72 65 61 64 73  cess for threads
1080: 20 69 6e 20 73 65 70 61 72 61 74 65 20 70 72 6f   in separate pro
1090: 63 65 73 73 65 73 2c 20 62 75 74 20 6e 6f 74 0a  cesses, but not.
10a0: 2a 2a 20 74 68 72 65 61 64 73 20 77 69 74 68 69  ** threads withi
10b0: 6e 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65  n the same proce
10c0: 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72  ss..**.** To wor
10d0: 6b 20 61 72 6f 75 6e 64 20 74 68 65 20 70 72 6f  k around the pro
10e0: 62 6c 65 6d 2c 20 53 51 4c 69 74 65 20 68 61 73  blem, SQLite has
10f0: 20 74 6f 20 6d 61 6e 61 67 65 20 66 69 6c 65 20   to manage file 
1100: 6c 6f 63 6b 73 20 69 6e 74 65 72 6e 61 6c 6c 79  locks internally
1110: 0a 2a 2a 20 6f 6e 20 69 74 73 20 6f 77 6e 2e 20  .** on its own. 
1120: 20 57 68 65 6e 65 76 65 72 20 61 20 6e 65 77 20   Whenever a new 
1130: 64 61 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e  database is open
1140: 65 64 2c 20 77 65 20 68 61 76 65 20 74 6f 20 66  ed, we have to f
1150: 69 6e 64 20 74 68 65 0a 2a 2a 20 73 70 65 63 69  ind the.** speci
1160: 66 69 63 20 69 6e 6f 64 65 20 6f 66 20 74 68 65  fic inode of the
1170: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28   database file (
1180: 74 68 65 20 69 6e 6f 64 65 20 69 73 20 64 65 74  the inode is det
1190: 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 0a 2a  ermined by the.*
11a0: 2a 20 73 74 5f 64 65 76 20 61 6e 64 20 73 74 5f  * st_dev and st_
11b0: 69 6e 6f 20 66 69 65 6c 64 73 20 6f 66 20 74 68  ino fields of th
11c0: 65 20 73 74 61 74 20 73 74 72 75 63 74 75 72 65  e stat structure
11d0: 20 74 68 61 74 20 66 73 74 61 74 28 29 20 66 69   that fstat() fi
11e0: 6c 6c 73 20 69 6e 29 0a 2a 2a 20 61 6e 64 20 63  lls in).** and c
11f0: 68 65 63 6b 20 66 6f 72 20 6c 6f 63 6b 73 20 61  heck for locks a
1200: 6c 72 65 61 64 79 20 65 78 69 73 74 69 6e 67 20  lready existing 
1210: 6f 6e 20 74 68 61 74 20 69 6e 6f 64 65 2e 20 20  on that inode.  
1220: 57 68 65 6e 20 6c 6f 63 6b 73 20 61 72 65 0a 2a  When locks are.*
1230: 2a 20 63 72 65 61 74 65 64 20 6f 72 20 72 65 6d  * created or rem
1240: 6f 76 65 64 2c 20 77 65 20 68 61 76 65 20 74 6f  oved, we have to
1250: 20 6c 6f 6f 6b 20 61 74 20 6f 75 72 20 6f 77 6e   look at our own
1260: 20 69 6e 74 65 72 6e 61 6c 20 72 65 63 6f 72 64   internal record
1270: 20 6f 66 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 73   of the.** locks
1280: 20 74 6f 20 73 65 65 20 69 66 20 61 6e 6f 74 68   to see if anoth
1290: 65 72 20 74 68 72 65 61 64 20 68 61 73 20 70 72  er thread has pr
12a0: 65 76 69 6f 75 73 6c 79 20 73 65 74 20 61 20 6c  eviously set a l
12b0: 6f 63 6b 20 6f 6e 20 74 68 61 74 20 73 61 6d 65  ock on that same
12c0: 0a 2a 2a 20 69 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a  .** inode..**.**
12d0: 20 54 68 65 20 4f 73 46 69 6c 65 20 73 74 72 75   The OsFile stru
12e0: 63 74 75 72 65 20 66 6f 72 20 50 4f 53 49 58 20  cture for POSIX 
12f0: 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6a 75 73  is no longer jus
1300: 74 20 61 6e 20 69 6e 74 65 67 65 72 20 66 69 6c  t an integer fil
1310: 65 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 2e  e.** descriptor.
1320: 20 20 49 74 20 69 73 20 6e 6f 77 20 61 20 73 74    It is now a st
1330: 72 75 63 74 75 72 65 20 74 68 61 74 20 68 6f 6c  ructure that hol
1340: 64 73 20 74 68 65 20 69 6e 74 65 67 65 72 20 66  ds the integer f
1350: 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f  ile.** descripto
1360: 72 20 61 6e 64 20 61 20 70 6f 69 6e 74 65 72 20  r and a pointer 
1370: 74 6f 20 61 20 73 74 72 75 63 74 75 72 65 20 74  to a structure t
1380: 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74 68  hat describes th
1390: 65 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20 6c 6f  e internal.** lo
13a0: 63 6b 73 20 6f 6e 20 74 68 65 20 63 6f 72 72 65  cks on the corre
13b0: 73 70 6f 6e 64 69 6e 67 20 69 6e 6f 64 65 2e 20  sponding inode. 
13c0: 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 6c 6f   There is one lo
13d0: 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65 0a  cking structure.
13e0: 2a 2a 20 70 65 72 20 69 6e 6f 64 65 2c 20 73 6f  ** per inode, so
13f0: 20 69 66 20 74 68 65 20 73 61 6d 65 20 69 6e 6f   if the same ino
1400: 64 65 20 69 73 20 6f 70 65 6e 65 64 20 74 77 69  de is opened twi
1410: 63 65 2c 20 62 6f 74 68 20 4f 73 46 69 6c 65 20  ce, both OsFile 
1420: 73 74 72 75 63 74 75 72 65 73 0a 2a 2a 20 70 6f  structures.** po
1430: 69 6e 74 20 74 6f 20 74 68 65 20 73 61 6d 65 20  int to the same 
1440: 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72  locking structur
1450: 65 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20  e.  The locking 
1460: 73 74 72 75 63 74 75 72 65 20 6b 65 65 70 73 0a  structure keeps.
1470: 2a 2a 20 61 20 72 65 66 65 72 65 6e 63 65 20 63  ** a reference c
1480: 6f 75 6e 74 20 28 73 6f 20 77 65 20 77 69 6c 6c  ount (so we will
1490: 20 6b 6e 6f 77 20 77 68 65 6e 20 74 6f 20 64 65   know when to de
14a0: 6c 65 74 65 20 69 74 29 20 61 6e 64 20 61 20 22  lete it) and a "
14b0: 63 6e 74 22 0a 2a 2a 20 66 69 65 6c 64 20 74 68  cnt".** field th
14c0: 61 74 20 74 65 6c 6c 73 20 75 73 20 69 74 73 20  at tells us its 
14d0: 69 6e 74 65 72 6e 61 6c 20 6c 6f 63 6b 20 73 74  internal lock st
14e0: 61 74 75 73 2e 20 20 63 6e 74 3d 3d 30 20 6d 65  atus.  cnt==0 me
14f0: 61 6e 73 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20  ans the.** file 
1500: 69 73 20 75 6e 6c 6f 63 6b 65 64 2e 20 20 63 6e  is unlocked.  cn
1510: 74 3d 3d 2d 31 20 6d 65 61 6e 73 20 74 68 65 20  t==-1 means the 
1520: 66 69 6c 65 20 68 61 73 20 61 6e 20 65 78 63 6c  file has an excl
1530: 75 73 69 76 65 20 6c 6f 63 6b 2e 0a 2a 2a 20 63  usive lock..** c
1540: 6e 74 3e 30 20 6d 65 61 6e 73 20 74 68 65 72 65  nt>0 means there
1550: 20 61 72 65 20 63 6e 74 20 73 68 61 72 65 64 20   are cnt shared 
1560: 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20 66 69 6c  locks on the fil
1570: 65 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 61 74 74  e..**.** Any att
1580: 65 6d 70 74 20 74 6f 20 6c 6f 63 6b 20 6f 72 20  empt to lock or 
1590: 75 6e 6c 6f 63 6b 20 61 20 66 69 6c 65 20 66 69  unlock a file fi
15a0: 72 73 74 20 63 68 65 63 6b 73 20 74 68 65 20 6c  rst checks the l
15b0: 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74 72 75 63 74  ocking.** struct
15c0: 75 72 65 2e 20 20 54 68 65 20 66 63 6e 74 6c 28  ure.  The fcntl(
15d0: 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 69 73  ) system call is
15e0: 20 6f 6e 6c 79 20 69 6e 76 6f 6b 65 64 20 74 6f   only invoked to
15f0: 20 73 65 74 20 61 20 0a 2a 2a 20 50 4f 53 49 58   set a .** POSIX
1600: 20 6c 6f 63 6b 20 69 66 20 74 68 65 20 69 6e 74   lock if the int
1610: 65 72 6e 61 6c 20 6c 6f 63 6b 20 73 74 72 75 63  ernal lock struc
1620: 74 75 72 65 20 74 72 61 6e 73 69 74 69 6f 6e 73  ture transitions
1630: 20 62 65 74 77 65 65 6e 0a 2a 2a 20 61 20 6c 6f   between.** a lo
1640: 63 6b 65 64 20 61 6e 64 20 61 6e 20 75 6e 6c 6f  cked and an unlo
1650: 63 6b 65 64 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a  cked state..**.*
1660: 2a 20 32 30 30 34 2d 4a 61 6e 2d 31 31 3a 0a 2a  * 2004-Jan-11:.*
1670: 2a 20 4d 6f 72 65 20 72 65 63 65 6e 74 20 64 69  * More recent di
1680: 73 63 6f 76 65 72 69 65 73 20 61 62 6f 75 74 20  scoveries about 
1690: 50 4f 53 49 58 20 61 64 76 69 73 6f 72 79 20 6c  POSIX advisory l
16a0: 6f 63 6b 73 2e 20 20 28 54 68 65 20 6d 6f 72 65  ocks.  (The more
16b0: 0a 2a 2a 20 49 20 64 69 73 63 6f 76 65 72 2c 20  .** I discover, 
16c0: 74 68 65 20 6d 6f 72 65 20 49 20 72 65 61 6c 69  the more I reali
16d0: 7a 65 20 74 68 65 20 61 20 50 4f 53 49 58 20 61  ze the a POSIX a
16e0: 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20 61 72  dvisory locks ar
16f0: 65 0a 2a 2a 20 61 6e 20 61 62 6f 6d 69 6e 61 74  e.** an abominat
1700: 69 6f 6e 2e 29 0a 2a 2a 0a 2a 2a 20 49 66 20 79  ion.).**.** If y
1710: 6f 75 20 63 6c 6f 73 65 20 61 20 66 69 6c 65 20  ou close a file 
1720: 64 65 73 63 72 69 70 74 6f 72 20 74 68 61 74 20  descriptor that 
1730: 70 6f 69 6e 74 73 20 74 6f 20 61 20 66 69 6c 65  points to a file
1740: 20 74 68 61 74 20 68 61 73 20 6c 6f 63 6b 73 2c   that has locks,
1750: 0a 2a 2a 20 61 6c 6c 20 6c 6f 63 6b 73 20 6f 6e  .** all locks on
1760: 20 74 68 61 74 20 66 69 6c 65 20 74 68 61 74 20   that file that 
1770: 61 72 65 20 6f 77 6e 65 64 20 62 79 20 74 68 65  are owned by the
1780: 20 63 75 72 72 65 6e 74 20 70 72 6f 63 65 73 73   current process
1790: 20 61 72 65 0a 2a 2a 20 72 65 6c 65 61 73 65 64   are.** released
17a0: 2e 20 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e  .  To work aroun
17b0: 64 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 2c 20  d this problem, 
17c0: 65 61 63 68 20 4f 73 46 69 6c 65 20 73 74 72 75  each OsFile stru
17d0: 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 0a 2a  cture contains.*
17e0: 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  * a pointer to a
17f0: 6e 20 6f 70 65 6e 43 6e 74 20 73 74 72 75 63 74  n openCnt struct
1800: 75 72 65 2e 20 20 54 68 65 72 65 20 69 73 20 6f  ure.  There is o
1810: 6e 65 20 6f 70 65 6e 43 6e 74 20 73 74 72 75 63  ne openCnt struc
1820: 74 75 72 65 0a 2a 2a 20 70 65 72 20 6f 70 65 6e  ture.** per open
1830: 20 69 6e 6f 64 65 2c 20 77 68 69 63 68 20 6d 65   inode, which me
1840: 61 6e 73 20 74 68 61 74 20 6d 75 6c 74 69 70 6c  ans that multipl
1850: 65 20 4f 73 46 69 6c 65 73 20 63 61 6e 20 70 6f  e OsFiles can po
1860: 69 6e 74 20 74 6f 20 61 20 73 69 6e 67 6c 65 0a  int to a single.
1870: 2a 2a 20 6f 70 65 6e 43 6e 74 2e 20 20 57 68 65  ** openCnt.  Whe
1880: 6e 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20  n an attempt is 
1890: 6d 61 64 65 20 74 6f 20 63 6c 6f 73 65 20 61 6e  made to close an
18a0: 20 4f 73 46 69 6c 65 2c 20 69 66 20 74 68 65 72   OsFile, if ther
18b0: 65 20 61 72 65 0a 2a 2a 20 6f 74 68 65 72 20 4f  e are.** other O
18c0: 73 46 69 6c 65 73 20 6f 70 65 6e 20 6f 6e 20 74  sFiles open on t
18d0: 68 65 20 73 61 6d 65 20 69 6e 6f 64 65 20 74 68  he same inode th
18e0: 61 74 20 61 72 65 20 68 6f 6c 64 69 6e 67 20 6c  at are holding l
18f0: 6f 63 6b 73 2c 20 74 68 65 20 63 61 6c 6c 0a 2a  ocks, the call.*
1900: 2a 20 74 6f 20 63 6c 6f 73 65 28 29 20 74 68 65  * to close() the
1910: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
1920: 20 69 73 20 64 65 66 65 72 72 65 64 20 75 6e 74   is deferred unt
1930: 69 6c 20 61 6c 6c 20 6f 66 20 74 68 65 20 6c 6f  il all of the lo
1940: 63 6b 73 20 63 6c 65 61 72 2e 0a 2a 2a 20 54 68  cks clear..** Th
1950: 65 20 6f 70 65 6e 43 6e 74 20 73 74 72 75 63 74  e openCnt struct
1960: 75 72 65 20 6b 65 65 70 73 20 61 20 6c 69 73 74  ure keeps a list
1970: 20 6f 66 20 66 69 6c 65 20 64 65 73 63 72 69 70   of file descrip
1980: 74 6f 72 73 20 74 68 61 74 20 6e 65 65 64 20 74  tors that need t
1990: 6f 0a 2a 2a 20 62 65 20 63 6c 6f 73 65 64 20 61  o.** be closed a
19a0: 6e 64 20 74 68 61 74 20 6c 69 73 74 20 69 73 20  nd that list is 
19b0: 77 61 6c 6b 65 64 20 28 61 6e 64 20 63 6c 65 61  walked (and clea
19c0: 72 65 64 29 20 77 68 65 6e 20 74 68 65 20 6c 61  red) when the la
19d0: 73 74 20 6c 6f 63 6b 0a 2a 2a 20 63 6c 65 61 72  st lock.** clear
19e0: 73 2e 0a 2a 2a 0a 2a 2a 20 46 69 72 73 74 2c 20  s..**.** First, 
19f0: 75 6e 64 65 72 20 4c 69 6e 75 78 20 74 68 72 65  under Linux thre
1a00: 61 64 73 2c 20 62 65 63 61 75 73 65 20 65 61 63  ads, because eac
1a10: 68 20 74 68 72 65 61 64 20 68 61 73 20 61 20 73  h thread has a s
1a20: 65 70 61 72 61 74 65 0a 2a 2a 20 70 72 6f 63 65  eparate.** proce
1a30: 73 73 20 49 44 2c 20 6c 6f 63 6b 20 6f 70 65 72  ss ID, lock oper
1a40: 61 74 69 6f 6e 73 20 69 6e 20 6f 6e 65 20 74 68  ations in one th
1a50: 72 65 61 64 20 64 6f 20 6e 6f 74 20 6f 76 65 72  read do not over
1a60: 72 69 64 65 20 6c 6f 63 6b 73 0a 2a 2a 20 74 6f  ride locks.** to
1a70: 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20 69   the same file i
1a80: 6e 20 6f 74 68 65 72 20 74 68 72 65 61 64 73 2e  n other threads.
1a90: 20 20 4c 69 6e 75 78 20 74 68 72 65 61 64 73 20    Linux threads 
1aa0: 62 65 68 61 76 65 20 6c 69 6b 65 0a 2a 2a 20 73  behave like.** s
1ab0: 65 70 61 72 61 74 65 20 70 72 6f 63 65 73 73 65  eparate processe
1ac0: 73 20 69 6e 20 74 68 69 73 20 72 65 73 70 65 63  s in this respec
1ad0: 74 2e 20 20 42 75 74 2c 20 69 66 20 79 6f 75 20  t.  But, if you 
1ae0: 63 6c 6f 73 65 20 61 20 66 69 6c 65 0a 2a 2a 20  close a file.** 
1af0: 64 65 73 63 72 69 70 74 6f 72 20 69 6e 20 6c 69  descriptor in li
1b00: 6e 75 78 20 74 68 72 65 61 64 73 2c 20 61 6c 6c  nux threads, all
1b10: 20 6c 6f 63 6b 73 20 61 72 65 20 63 6c 65 61 72   locks are clear
1b20: 65 64 2c 20 65 76 65 6e 20 6c 6f 63 6b 73 0a 2a  ed, even locks.*
1b30: 2a 20 6f 6e 20 6f 74 68 65 72 20 74 68 72 65 61  * on other threa
1b40: 64 73 20 61 6e 64 20 65 76 65 6e 20 74 68 6f 75  ds and even thou
1b50: 67 68 20 74 68 65 20 6f 74 68 65 72 20 74 68 72  gh the other thr
1b60: 65 61 64 73 20 68 61 76 65 20 64 69 66 66 65 72  eads have differ
1b70: 65 6e 74 0a 2a 2a 20 70 72 6f 63 65 73 73 20 49  ent.** process I
1b80: 44 73 2e 20 20 4c 69 6e 75 78 20 74 68 72 65 61  Ds.  Linux threa
1b90: 64 73 20 69 73 20 69 6e 63 6f 6e 73 69 73 74 65  ds is inconsiste
1ba0: 6e 74 20 69 6e 20 74 68 69 73 20 72 65 73 70 65  nt in this respe
1bb0: 63 74 2e 0a 2a 2a 20 28 49 27 6d 20 62 65 67 69  ct..** (I'm begi
1bc0: 6e 6e 69 6e 67 20 74 6f 20 74 68 69 6e 6b 20 74  nning to think t
1bd0: 68 61 74 20 6c 69 6e 75 78 20 74 68 72 65 61 64  hat linux thread
1be0: 73 20 69 73 20 61 6e 20 61 62 6f 6d 69 6e 61 74  s is an abominat
1bf0: 69 6f 6e 20 74 6f 6f 2e 29 0a 2a 2a 20 54 68 65  ion too.).** The
1c00: 20 63 6f 6e 73 65 71 75 65 6e 63 65 20 6f 66 20   consequence of 
1c10: 74 68 69 73 20 61 6c 6c 20 69 73 20 74 68 61 74  this all is that
1c20: 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20   the hash table 
1c30: 66 6f 72 20 74 68 65 20 6c 6f 63 6b 49 6e 66 6f  for the lockInfo
1c40: 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 68 61  .** structure ha
1c50: 73 20 74 6f 20 69 6e 63 6c 75 64 65 20 74 68 65  s to include the
1c60: 20 70 72 6f 63 65 73 73 20 69 64 20 61 73 20 70   process id as p
1c70: 61 72 74 20 6f 66 20 69 74 73 20 6b 65 79 20 62  art of its key b
1c80: 65 63 61 75 73 65 0a 2a 2a 20 6c 6f 63 6b 73 20  ecause.** locks 
1c90: 69 6e 20 64 69 66 66 65 72 65 6e 74 20 74 68 72  in different thr
1ca0: 65 61 64 73 20 61 72 65 20 74 72 65 61 74 65 64  eads are treated
1cb0: 20 61 73 20 64 69 73 74 69 6e 63 74 2e 20 20 42   as distinct.  B
1cc0: 75 74 20 74 68 65 20 0a 2a 2a 20 6f 70 65 6e 43  ut the .** openC
1cd0: 6e 74 20 73 74 72 75 63 74 75 72 65 20 73 68 6f  nt structure sho
1ce0: 75 6c 64 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20  uld not include 
1cf0: 74 68 65 20 70 72 6f 63 65 73 73 20 69 64 20 69  the process id i
1d00: 6e 20 69 74 73 0a 2a 2a 20 6b 65 79 20 62 65 63  n its.** key bec
1d10: 61 75 73 65 20 63 6c 6f 73 65 28 29 20 63 6c 65  ause close() cle
1d20: 61 72 73 20 6c 6f 63 6b 20 6f 6e 20 61 6c 6c 20  ars lock on all 
1d30: 74 68 72 65 61 64 73 2c 20 6e 6f 74 20 6a 75 73  threads, not jus
1d40: 74 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a  t the current.**
1d50: 20 74 68 72 65 61 64 2e 20 20 57 65 72 65 20 69   thread.  Were i
1d60: 74 20 6e 6f 74 20 66 6f 72 20 74 68 69 73 20 67  t not for this g
1d70: 6f 6f 66 69 6e 65 73 73 20 69 6e 20 6c 69 6e 75  oofiness in linu
1d80: 78 20 74 68 72 65 61 64 73 2c 20 77 65 20 63 6f  x threads, we co
1d90: 75 6c 64 0a 2a 2a 20 63 6f 6d 62 69 6e 65 20 74  uld.** combine t
1da0: 68 65 20 6c 6f 63 6b 49 6e 66 6f 20 61 6e 64 20  he lockInfo and 
1db0: 6f 70 65 6e 43 6e 74 20 73 74 72 75 63 74 75 72  openCnt structur
1dc0: 65 73 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c 65  es into a single
1dd0: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 0a   structure..*/..
1de0: 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63  /*.** An instanc
1df0: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
1e00: 6e 67 20 73 74 72 75 63 74 75 72 65 20 73 65 72  ng structure ser
1e10: 76 65 73 20 61 73 20 74 68 65 20 6b 65 79 20 75  ves as the key u
1e20: 73 65 64 0a 2a 2a 20 74 6f 20 6c 6f 63 61 74 65  sed.** to locate
1e30: 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 6c 6f   a particular lo
1e40: 63 6b 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  ckInfo structure
1e50: 20 67 69 76 65 6e 20 69 74 73 20 69 6e 6f 64 65   given its inode
1e60: 2e 20 20 4e 6f 74 65 0a 2a 2a 20 74 68 61 74 20  .  Note.** that 
1e70: 77 65 20 68 61 76 65 20 74 6f 20 69 6e 63 6c 75  we have to inclu
1e80: 64 65 20 74 68 65 20 70 72 6f 63 65 73 73 20 49  de the process I
1e90: 44 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65  D as part of the
1ea0: 20 6b 65 79 2e 20 20 4f 6e 20 73 6f 6d 65 0a 2a   key.  On some.*
1eb0: 2a 20 74 68 72 65 61 64 69 6e 67 20 69 6d 70 6c  * threading impl
1ec0: 65 6d 65 6e 74 61 74 69 6f 6e 73 20 28 65 78 3a  ementations (ex:
1ed0: 20 6c 69 6e 75 78 29 2c 20 65 61 63 68 20 74 68   linux), each th
1ee0: 72 65 61 64 20 68 61 73 20 61 20 73 65 70 61 72  read has a separ
1ef0: 61 74 65 0a 2a 2a 20 70 72 6f 63 65 73 73 20 49  ate.** process I
1f00: 44 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 6c 6f 63  D..*/.struct loc
1f10: 6b 4b 65 79 20 7b 0a 20 20 64 65 76 5f 74 20 64  kKey {.  dev_t d
1f20: 65 76 3b 20 20 20 2f 2a 20 44 65 76 69 63 65 20  ev;   /* Device 
1f30: 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 6f 5f  number */.  ino_
1f40: 74 20 69 6e 6f 3b 20 20 20 2f 2a 20 49 6e 6f 64  t ino;   /* Inod
1f50: 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 70 69  e number */.  pi
1f60: 64 5f 74 20 70 69 64 3b 20 20 20 2f 2a 20 50 72  d_t pid;   /* Pr
1f70: 6f 63 65 73 73 20 49 44 20 2a 2f 0a 7d 3b 0a 0a  ocess ID */.};..
1f80: 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63  /*.** An instanc
1f90: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
1fa0: 6e 67 20 73 74 72 75 63 74 75 72 65 20 69 73 20  ng structure is 
1fb0: 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 65 61  allocated for ea
1fc0: 63 68 20 6f 70 65 6e 0a 2a 2a 20 69 6e 6f 64 65  ch open.** inode
1fd0: 20 6f 6e 20 65 61 63 68 20 74 68 72 65 61 64 20   on each thread 
1fe0: 77 69 74 68 20 61 20 64 69 66 66 65 72 65 6e 74  with a different
1ff0: 20 70 72 6f 63 65 73 73 20 49 44 2e 20 20 28 54   process ID.  (T
2000: 68 72 65 61 64 73 20 68 61 76 65 0a 2a 2a 20 64  hreads have.** d
2010: 69 66 66 65 72 65 6e 74 20 70 72 6f 63 65 73 73  ifferent process
2020: 20 49 44 73 20 6f 6e 20 6c 69 6e 75 78 2c 20 62   IDs on linux, b
2030: 75 74 20 6e 6f 74 20 6f 6e 20 6d 6f 73 74 20 6f  ut not on most o
2040: 74 68 65 72 20 75 6e 69 78 65 73 2e 29 0a 2a 2a  ther unixes.).**
2050: 0a 2a 2a 20 41 20 73 69 6e 67 6c 65 20 69 6e 6f  .** A single ino
2060: 64 65 20 63 61 6e 20 68 61 76 65 20 6d 75 6c 74  de can have mult
2070: 69 70 6c 65 20 66 69 6c 65 20 64 65 73 63 72 69  iple file descri
2080: 70 74 6f 72 73 2c 20 73 6f 20 65 61 63 68 20 4f  ptors, so each O
2090: 73 46 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74 75  sFile.** structu
20a0: 72 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f  re contains a po
20b0: 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 73 74  inter to an inst
20c0: 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6f 62 6a  ance of this obj
20d0: 65 63 74 20 61 6e 64 20 74 68 69 73 0a 2a 2a 20  ect and this.** 
20e0: 6f 62 6a 65 63 74 20 6b 65 65 70 73 20 61 20 63  object keeps a c
20f0: 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d 62  ount of the numb
2100: 65 72 20 6f 66 20 4f 73 46 69 6c 65 73 20 70 6f  er of OsFiles po
2110: 69 6e 74 69 6e 67 20 74 6f 20 69 74 2e 0a 2a 2f  inting to it..*/
2120: 0a 73 74 72 75 63 74 20 6c 6f 63 6b 49 6e 66 6f  .struct lockInfo
2130: 20 7b 0a 20 20 73 74 72 75 63 74 20 6c 6f 63 6b   {.  struct lock
2140: 4b 65 79 20 6b 65 79 3b 20 20 2f 2a 20 54 68 65  Key key;  /* The
2150: 20 6c 6f 6f 6b 75 70 20 6b 65 79 20 2a 2f 0a 20   lookup key */. 
2160: 20 69 6e 74 20 63 6e 74 3b 20 20 20 20 20 20 20   int cnt;       
2170: 20 20 20 20 20 20 2f 2a 20 30 3a 20 75 6e 6c 6f        /* 0: unlo
2180: 63 6b 65 64 2e 20 20 2d 31 3a 20 77 72 69 74 65  cked.  -1: write
2190: 20 6c 6f 63 6b 2e 20 20 31 2e 2e 2e 3a 20 72 65   lock.  1...: re
21a0: 61 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 69 6e  ad lock. */.  in
21b0: 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20  t nRef;         
21c0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
21d0: 70 6f 69 6e 74 65 72 73 20 74 6f 20 74 68 69 73  pointers to this
21e0: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 7d 3b   structure */.};
21f0: 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61  ../*.** An insta
2200: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
2210: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 73  wing structure s
2220: 65 72 76 65 73 20 61 73 20 74 68 65 20 6b 65 79  erves as the key
2230: 20 75 73 65 64 0a 2a 2a 20 74 6f 20 6c 6f 63 61   used.** to loca
2240: 74 65 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  te a particular 
2250: 6f 70 65 6e 43 6e 74 20 73 74 72 75 63 74 75 72  openCnt structur
2260: 65 20 67 69 76 65 6e 20 69 74 73 20 69 6e 6f 64  e given its inod
2270: 65 2e 20 20 54 68 69 73 0a 2a 2a 20 69 73 20 74  e.  This.** is t
2280: 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 6c  he same as the l
2290: 6f 63 6b 4b 65 79 20 65 78 63 65 70 74 20 74 68  ockKey except th
22a0: 61 74 20 74 68 65 20 70 72 6f 63 65 73 73 20 49  at the process I
22b0: 44 20 69 73 20 6f 6d 69 74 74 65 64 2e 0a 2a 2f  D is omitted..*/
22c0: 0a 73 74 72 75 63 74 20 6f 70 65 6e 4b 65 79 20  .struct openKey 
22d0: 7b 0a 20 20 64 65 76 5f 74 20 64 65 76 3b 20 20  {.  dev_t dev;  
22e0: 20 2f 2a 20 44 65 76 69 63 65 20 6e 75 6d 62 65   /* Device numbe
22f0: 72 20 2a 2f 0a 20 20 69 6e 6f 5f 74 20 69 6e 6f  r */.  ino_t ino
2300: 3b 20 20 20 2f 2a 20 49 6e 6f 64 65 20 6e 75 6d  ;   /* Inode num
2310: 62 65 72 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  ber */.};../*.**
2320: 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   An instance of 
2330: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
2340: 72 75 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 63  ructure is alloc
2350: 61 74 65 64 20 66 6f 72 20 65 61 63 68 20 6f 70  ated for each op
2360: 65 6e 0a 2a 2a 20 69 6e 6f 64 65 2e 20 20 54 68  en.** inode.  Th
2370: 69 73 20 73 74 72 75 63 74 75 72 65 20 6b 65 65  is structure kee
2380: 70 73 20 74 72 61 63 6b 20 6f 66 20 74 68 65 20  ps track of the 
2390: 6e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20  number of locks 
23a0: 6f 6e 20 74 68 61 74 0a 2a 2a 20 69 6e 6f 64 65  on that.** inode
23b0: 2e 20 20 49 66 20 61 20 63 6c 6f 73 65 20 69 73  .  If a close is
23c0: 20 61 74 74 65 6d 70 74 65 64 20 61 67 61 69 6e   attempted again
23d0: 73 74 20 61 6e 20 69 6e 6f 64 65 20 74 68 61 74  st an inode that
23e0: 20 69 73 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20 6c   is holding.** l
23f0: 6f 63 6b 73 2c 20 74 68 65 20 63 6c 6f 73 65 20  ocks, the close 
2400: 69 73 20 64 65 66 65 72 72 65 64 20 75 6e 74 69  is deferred unti
2410: 6c 20 61 6c 6c 20 6c 6f 63 6b 73 20 63 6c 65 61  l all locks clea
2420: 72 20 62 79 20 61 64 64 69 6e 67 20 74 68 65 0a  r by adding the.
2430: 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ** file descript
2440: 6f 72 20 74 6f 20 62 65 20 63 6c 6f 73 65 64 20  or to be closed 
2450: 74 6f 20 74 68 65 20 70 65 6e 64 69 6e 67 20 6c  to the pending l
2460: 69 73 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 6f  ist..*/.struct o
2470: 70 65 6e 43 6e 74 20 7b 0a 20 20 73 74 72 75 63  penCnt {.  struc
2480: 74 20 6f 70 65 6e 4b 65 79 20 6b 65 79 3b 20 20  t openKey key;  
2490: 20 2f 2a 20 54 68 65 20 6c 6f 6f 6b 75 70 20 6b   /* The lookup k
24a0: 65 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66  ey */.  int nRef
24b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
24c0: 20 4e 75 6d 62 65 72 20 6f 66 20 70 6f 69 6e 74   Number of point
24d0: 65 72 73 20 74 6f 20 74 68 69 73 20 73 74 72 75  ers to this stru
24e0: 63 74 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  cture */.  int n
24f0: 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Lock;           
2500: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 75   /* Number of ou
2510: 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 20  tstanding locks 
2520: 2a 2f 0a 20 20 69 6e 74 20 6e 50 65 6e 64 69 6e  */.  int nPendin
2530: 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  g;         /* Nu
2540: 6d 62 65 72 20 6f 66 20 70 65 6e 64 69 6e 67 20  mber of pending 
2550: 63 6c 6f 73 65 28 29 20 6f 70 65 72 61 74 69 6f  close() operatio
2560: 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 50 65  ns */.  int *aPe
2570: 6e 64 69 6e 67 3b 20 20 20 20 20 20 20 20 2f 2a  nding;        /*
2580: 20 4d 61 6c 6c 6f 63 65 64 20 73 70 61 63 65 20   Malloced space 
2590: 68 6f 6c 64 69 6e 67 20 66 64 27 73 20 61 77 61  holding fd's awa
25a0: 69 74 69 6e 67 20 61 20 63 6c 6f 73 65 28 29 20  iting a close() 
25b0: 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 0a 2a 2a 20 54 68  */.};../* .** Th
25c0: 65 73 65 20 68 61 73 68 20 74 61 62 6c 65 20 6d  ese hash table m
25d0: 61 70 73 20 69 6e 6f 64 65 73 20 61 6e 64 20 70  aps inodes and p
25e0: 72 6f 63 65 73 73 20 49 44 73 20 69 6e 74 6f 20  rocess IDs into 
25f0: 6c 6f 63 6b 49 6e 66 6f 20 61 6e 64 20 6f 70 65  lockInfo and ope
2600: 6e 43 6e 74 0a 2a 2a 20 73 74 72 75 63 74 75 72  nCnt.** structur
2610: 65 73 2e 20 20 41 63 63 65 73 73 20 74 6f 20 74  es.  Access to t
2620: 68 65 73 65 20 68 61 73 68 20 74 61 62 6c 65 73  hese hash tables
2630: 20 6d 75 73 74 20 62 65 20 70 72 6f 74 65 63 74   must be protect
2640: 65 64 20 62 79 20 61 20 6d 75 74 65 78 2e 0a 2a  ed by a mutex..*
2650: 2f 0a 73 74 61 74 69 63 20 48 61 73 68 20 6c 6f  /.static Hash lo
2660: 63 6b 48 61 73 68 20 3d 20 7b 20 53 51 4c 49 54  ckHash = { SQLIT
2670: 45 5f 48 41 53 48 5f 42 49 4e 41 52 59 2c 20 30  E_HASH_BINARY, 0
2680: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 20 7d 3b 0a  , 0, 0, 0, 0 };.
2690: 73 74 61 74 69 63 20 48 61 73 68 20 6f 70 65 6e  static Hash open
26a0: 48 61 73 68 20 3d 20 7b 20 53 51 4c 49 54 45 5f  Hash = { SQLITE_
26b0: 48 41 53 48 5f 42 49 4e 41 52 59 2c 20 30 2c 20  HASH_BINARY, 0, 
26c0: 30 2c 20 30 2c 20 30 2c 20 30 20 7d 3b 0a 0a 2f  0, 0, 0, 0 };../
26d0: 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 6c  *.** Release a l
26e0: 6f 63 6b 49 6e 66 6f 20 73 74 72 75 63 74 75 72  ockInfo structur
26f0: 65 20 70 72 65 76 69 6f 75 73 6c 79 20 61 6c 6c  e previously all
2700: 6f 63 61 74 65 64 20 62 79 20 66 69 6e 64 4c 6f  ocated by findLo
2710: 63 6b 49 6e 66 6f 28 29 2e 0a 2a 2f 0a 73 74 61  ckInfo()..*/.sta
2720: 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65  tic void release
2730: 4c 6f 63 6b 49 6e 66 6f 28 73 74 72 75 63 74 20  LockInfo(struct 
2740: 6c 6f 63 6b 49 6e 66 6f 20 2a 70 4c 6f 63 6b 29  lockInfo *pLock)
2750: 7b 0a 20 20 70 4c 6f 63 6b 2d 3e 6e 52 65 66 2d  {.  pLock->nRef-
2760: 2d 3b 0a 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e  -;.  if( pLock->
2770: 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 73  nRef==0 ){.    s
2780: 71 6c 69 74 65 48 61 73 68 49 6e 73 65 72 74 28  qliteHashInsert(
2790: 26 6c 6f 63 6b 48 61 73 68 2c 20 26 70 4c 6f 63  &lockHash, &pLoc
27a0: 6b 2d 3e 6b 65 79 2c 20 73 69 7a 65 6f 66 28 70  k->key, sizeof(p
27b0: 4c 6f 63 6b 2d 3e 6b 65 79 29 2c 20 30 29 3b 0a  Lock->key), 0);.
27c0: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
27d0: 4c 6f 63 6b 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  Lock);.  }.}../*
27e0: 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 6f 70  .** Release a op
27f0: 65 6e 43 6e 74 20 73 74 72 75 63 74 75 72 65 20  enCnt structure 
2800: 70 72 65 76 69 6f 75 73 6c 79 20 61 6c 6c 6f 63  previously alloc
2810: 61 74 65 64 20 62 79 20 66 69 6e 64 4c 6f 63 6b  ated by findLock
2820: 49 6e 66 6f 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  Info()..*/.stati
2830: 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 4f 70  c void releaseOp
2840: 65 6e 43 6e 74 28 73 74 72 75 63 74 20 6f 70 65  enCnt(struct ope
2850: 6e 43 6e 74 20 2a 70 4f 70 65 6e 29 7b 0a 20 20  nCnt *pOpen){.  
2860: 70 4f 70 65 6e 2d 3e 6e 52 65 66 2d 2d 3b 0a 20  pOpen->nRef--;. 
2870: 20 69 66 28 20 70 4f 70 65 6e 2d 3e 6e 52 65 66   if( pOpen->nRef
2880: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
2890: 65 48 61 73 68 49 6e 73 65 72 74 28 26 6f 70 65  eHashInsert(&ope
28a0: 6e 48 61 73 68 2c 20 26 70 4f 70 65 6e 2d 3e 6b  nHash, &pOpen->k
28b0: 65 79 2c 20 73 69 7a 65 6f 66 28 70 4f 70 65 6e  ey, sizeof(pOpen
28c0: 2d 3e 6b 65 79 29 2c 20 30 29 3b 0a 20 20 20 20  ->key), 0);.    
28d0: 73 71 6c 69 74 65 46 72 65 65 28 70 4f 70 65 6e  sqliteFree(pOpen
28e0: 2d 3e 61 50 65 6e 64 69 6e 67 29 3b 0a 20 20 20  ->aPending);.   
28f0: 20 73 71 6c 69 74 65 46 72 65 65 28 70 4f 70 65   sqliteFree(pOpe
2900: 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  n);.  }.}../*.**
2910: 20 47 69 76 65 6e 20 61 20 66 69 6c 65 20 64 65   Given a file de
2920: 73 63 72 69 70 74 6f 72 2c 20 6c 6f 63 61 74 65  scriptor, locate
2930: 20 6c 6f 63 6b 49 6e 66 6f 20 61 6e 64 20 6f 70   lockInfo and op
2940: 65 6e 43 6e 74 20 73 74 72 75 63 74 75 72 65 73  enCnt structures
2950: 20 74 68 61 74 0a 2a 2a 20 64 65 73 63 72 69 62   that.** describ
2960: 65 73 20 74 68 61 74 20 66 69 6c 65 20 64 65 73  es that file des
2970: 63 72 69 70 74 6f 72 2e 20 20 43 72 65 61 74 65  criptor.  Create
2980: 20 61 20 6e 65 77 20 6f 6e 65 73 20 69 66 20 6e   a new ones if n
2990: 65 63 65 73 73 61 72 79 2e 20 20 54 68 65 0a 2a  ecessary.  The.*
29a0: 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 73 20  * return values 
29b0: 6d 69 67 68 74 20 62 65 20 75 6e 73 65 74 20 69  might be unset i
29c0: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
29d0: 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  s..**.** Return 
29e0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72  the number of er
29f0: 72 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 66 69 6e  rors..*/.int fin
2a00: 64 4c 6f 63 6b 49 6e 66 6f 28 0a 20 20 69 6e 74  dLockInfo(.  int
2a10: 20 66 64 2c 20 20 20 20 20 20 20 20 20 20 20 20   fd,            
2a20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2a30: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
2a40: 20 75 73 65 64 20 69 6e 20 74 68 65 20 6b 65 79   used in the key
2a50: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 6c 6f 63   */.  struct loc
2a60: 6b 49 6e 66 6f 20 2a 2a 70 70 4c 6f 63 6b 2c 20  kInfo **ppLock, 
2a70: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65     /* Return the
2a80: 20 6c 6f 63 6b 49 6e 66 6f 20 73 74 72 75 63 74   lockInfo struct
2a90: 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 73 74  ure here */.  st
2aa0: 72 75 63 74 20 6f 70 65 6e 43 6e 74 20 2a 2a 70  ruct openCnt **p
2ab0: 70 4f 70 65 6e 20 20 20 2f 2a 20 52 65 74 75 72  pOpen   /* Retur
2ac0: 6e 20 74 68 65 20 6f 70 65 6e 43 6e 74 20 73 74  n the openCnt st
2ad0: 72 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a  ructure here */.
2ae0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  ){.  int rc;.  s
2af0: 74 72 75 63 74 20 6c 6f 63 6b 4b 65 79 20 6b 65  truct lockKey ke
2b00: 79 31 3b 0a 20 20 73 74 72 75 63 74 20 6f 70 65  y1;.  struct ope
2b10: 6e 4b 65 79 20 6b 65 79 32 3b 0a 20 20 73 74 72  nKey key2;.  str
2b20: 75 63 74 20 73 74 61 74 20 73 74 61 74 62 75 66  uct stat statbuf
2b30: 3b 0a 20 20 73 74 72 75 63 74 20 6c 6f 63 6b 49  ;.  struct lockI
2b40: 6e 66 6f 20 2a 70 4c 6f 63 6b 3b 0a 20 20 73 74  nfo *pLock;.  st
2b50: 72 75 63 74 20 6f 70 65 6e 43 6e 74 20 2a 70 4f  ruct openCnt *pO
2b60: 70 65 6e 3b 0a 20 20 72 63 20 3d 20 66 73 74 61  pen;.  rc = fsta
2b70: 74 28 66 64 2c 20 26 73 74 61 74 62 75 66 29 3b  t(fd, &statbuf);
2b80: 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29 20 72  .  if( rc!=0 ) r
2b90: 65 74 75 72 6e 20 31 3b 0a 20 20 6d 65 6d 73 65  eturn 1;.  memse
2ba0: 74 28 26 6b 65 79 31 2c 20 30 2c 20 73 69 7a 65  t(&key1, 0, size
2bb0: 6f 66 28 6b 65 79 31 29 29 3b 0a 20 20 6b 65 79  of(key1));.  key
2bc0: 31 2e 64 65 76 20 3d 20 73 74 61 74 62 75 66 2e  1.dev = statbuf.
2bd0: 73 74 5f 64 65 76 3b 0a 20 20 6b 65 79 31 2e 69  st_dev;.  key1.i
2be0: 6e 6f 20 3d 20 73 74 61 74 62 75 66 2e 73 74 5f  no = statbuf.st_
2bf0: 69 6e 6f 3b 0a 20 20 6b 65 79 31 2e 70 69 64 20  ino;.  key1.pid 
2c00: 3d 20 67 65 74 70 69 64 28 29 3b 0a 20 20 6d 65  = getpid();.  me
2c10: 6d 73 65 74 28 26 6b 65 79 32 2c 20 30 2c 20 73  mset(&key2, 0, s
2c20: 69 7a 65 6f 66 28 6b 65 79 32 29 29 3b 0a 20 20  izeof(key2));.  
2c30: 6b 65 79 32 2e 64 65 76 20 3d 20 73 74 61 74 62  key2.dev = statb
2c40: 75 66 2e 73 74 5f 64 65 76 3b 0a 20 20 6b 65 79  uf.st_dev;.  key
2c50: 32 2e 69 6e 6f 20 3d 20 73 74 61 74 62 75 66 2e  2.ino = statbuf.
2c60: 73 74 5f 69 6e 6f 3b 0a 20 20 70 4c 6f 63 6b 20  st_ino;.  pLock 
2c70: 3d 20 28 73 74 72 75 63 74 20 6c 6f 63 6b 49 6e  = (struct lockIn
2c80: 66 6f 2a 29 73 71 6c 69 74 65 48 61 73 68 46 69  fo*)sqliteHashFi
2c90: 6e 64 28 26 6c 6f 63 6b 48 61 73 68 2c 20 26 6b  nd(&lockHash, &k
2ca0: 65 79 31 2c 20 73 69 7a 65 6f 66 28 6b 65 79 31  ey1, sizeof(key1
2cb0: 29 29 3b 0a 20 20 69 66 28 20 70 4c 6f 63 6b 3d  ));.  if( pLock=
2cc0: 3d 30 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  =0 ){.    struct
2cd0: 20 6c 6f 63 6b 49 6e 66 6f 20 2a 70 4f 6c 64 3b   lockInfo *pOld;
2ce0: 0a 20 20 20 20 70 4c 6f 63 6b 20 3d 20 73 71 6c  .    pLock = sql
2cf0: 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 73 69  iteMallocRaw( si
2d00: 7a 65 6f 66 28 2a 70 4c 6f 63 6b 29 20 29 3b 0a  zeof(*pLock) );.
2d10: 20 20 20 20 69 66 28 20 70 4c 6f 63 6b 3d 3d 30      if( pLock==0
2d20: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20   ) return 1;.   
2d30: 20 70 4c 6f 63 6b 2d 3e 6b 65 79 20 3d 20 6b 65   pLock->key = ke
2d40: 79 31 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 6e  y1;.    pLock->n
2d50: 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 70 4c 6f  Ref = 1;.    pLo
2d60: 63 6b 2d 3e 63 6e 74 20 3d 20 30 3b 0a 20 20 20  ck->cnt = 0;.   
2d70: 20 70 4f 6c 64 20 3d 20 73 71 6c 69 74 65 48 61   pOld = sqliteHa
2d80: 73 68 49 6e 73 65 72 74 28 26 6c 6f 63 6b 48 61  shInsert(&lockHa
2d90: 73 68 2c 20 26 70 4c 6f 63 6b 2d 3e 6b 65 79 2c  sh, &pLock->key,
2da0: 20 73 69 7a 65 6f 66 28 6b 65 79 31 29 2c 20 70   sizeof(key1), p
2db0: 4c 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28 20 70  Lock);.    if( p
2dc0: 4f 6c 64 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  Old!=0 ){.      
2dd0: 61 73 73 65 72 74 28 20 70 4f 6c 64 3d 3d 70 4c  assert( pOld==pL
2de0: 6f 63 6b 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ock );.      sql
2df0: 69 74 65 46 72 65 65 28 70 4c 6f 63 6b 29 3b 0a  iteFree(pLock);.
2e00: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
2e10: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
2e20: 20 20 20 70 4c 6f 63 6b 2d 3e 6e 52 65 66 2b 2b     pLock->nRef++
2e30: 3b 0a 20 20 7d 0a 20 20 2a 70 70 4c 6f 63 6b 20  ;.  }.  *ppLock 
2e40: 3d 20 70 4c 6f 63 6b 3b 0a 20 20 70 4f 70 65 6e  = pLock;.  pOpen
2e50: 20 3d 20 28 73 74 72 75 63 74 20 6f 70 65 6e 43   = (struct openC
2e60: 6e 74 2a 29 73 71 6c 69 74 65 48 61 73 68 46 69  nt*)sqliteHashFi
2e70: 6e 64 28 26 6f 70 65 6e 48 61 73 68 2c 20 26 6b  nd(&openHash, &k
2e80: 65 79 32 2c 20 73 69 7a 65 6f 66 28 6b 65 79 32  ey2, sizeof(key2
2e90: 29 29 3b 0a 20 20 69 66 28 20 70 4f 70 65 6e 3d  ));.  if( pOpen=
2ea0: 3d 30 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  =0 ){.    struct
2eb0: 20 6f 70 65 6e 43 6e 74 20 2a 70 4f 6c 64 3b 0a   openCnt *pOld;.
2ec0: 20 20 20 20 70 4f 70 65 6e 20 3d 20 73 71 6c 69      pOpen = sqli
2ed0: 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 73 69 7a  teMallocRaw( siz
2ee0: 65 6f 66 28 2a 70 4f 70 65 6e 29 20 29 3b 0a 20  eof(*pOpen) );. 
2ef0: 20 20 20 69 66 28 20 70 4f 70 65 6e 3d 3d 30 20     if( pOpen==0 
2f00: 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ){.      release
2f10: 4c 6f 63 6b 49 6e 66 6f 28 70 4c 6f 63 6b 29 3b  LockInfo(pLock);
2f20: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
2f30: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4f 70 65 6e  .    }.    pOpen
2f40: 2d 3e 6b 65 79 20 3d 20 6b 65 79 32 3b 0a 20 20  ->key = key2;.  
2f50: 20 20 70 4f 70 65 6e 2d 3e 6e 52 65 66 20 3d 20    pOpen->nRef = 
2f60: 31 3b 0a 20 20 20 20 70 4f 70 65 6e 2d 3e 6e 4c  1;.    pOpen->nL
2f70: 6f 63 6b 20 3d 20 30 3b 0a 20 20 20 20 70 4f 70  ock = 0;.    pOp
2f80: 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67 20 3d 20 30  en->nPending = 0
2f90: 3b 0a 20 20 20 20 70 4f 70 65 6e 2d 3e 61 50 65  ;.    pOpen->aPe
2fa0: 6e 64 69 6e 67 20 3d 20 30 3b 0a 20 20 20 20 70  nding = 0;.    p
2fb0: 4f 6c 64 20 3d 20 73 71 6c 69 74 65 48 61 73 68  Old = sqliteHash
2fc0: 49 6e 73 65 72 74 28 26 6f 70 65 6e 48 61 73 68  Insert(&openHash
2fd0: 2c 20 26 70 4f 70 65 6e 2d 3e 6b 65 79 2c 20 73  , &pOpen->key, s
2fe0: 69 7a 65 6f 66 28 6b 65 79 32 29 2c 20 70 4f 70  izeof(key2), pOp
2ff0: 65 6e 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c  en);.    if( pOl
3000: 64 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73  d!=0 ){.      as
3010: 73 65 72 74 28 20 70 4f 6c 64 3d 3d 70 4f 70 65  sert( pOld==pOpe
3020: 6e 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  n );.      sqlit
3030: 65 46 72 65 65 28 70 4f 70 65 6e 29 3b 0a 20 20  eFree(pOpen);.  
3040: 20 20 20 20 72 65 6c 65 61 73 65 4c 6f 63 6b 49      releaseLockI
3050: 6e 66 6f 28 70 4c 6f 63 6b 29 3b 0a 20 20 20 20  nfo(pLock);.    
3060: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
3070: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  }.  }else{.    p
3080: 4f 70 65 6e 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20  Open->nRef++;.  
3090: 7d 0a 20 20 2a 70 70 4f 70 65 6e 20 3d 20 70 4f  }.  *ppOpen = pO
30a0: 70 65 6e 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  pen;.  return 0;
30b0: 0a 7d 0a 0a 23 65 6e 64 69 66 20 20 2f 2a 2a 20  .}..#endif  /** 
30c0: 50 4f 53 49 58 20 61 64 76 69 73 6f 72 79 20 6c  POSIX advisory l
30d0: 6f 63 6b 20 77 6f 72 6b 2d 61 72 6f 75 6e 64 20  ock work-around 
30e0: 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65  **/../*.** If we
30f0: 20 63 6f 6d 70 69 6c 65 20 77 69 74 68 20 74 68   compile with th
3100: 65 20 53 51 4c 49 54 45 5f 54 45 53 54 20 6d 61  e SQLITE_TEST ma
3110: 63 72 6f 20 73 65 74 2c 20 74 68 65 6e 20 74 68  cro set, then th
3120: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63  e following bloc
3130: 6b 0a 2a 2a 20 6f 66 20 63 6f 64 65 20 77 69 6c  k.** of code wil
3140: 6c 20 67 69 76 65 20 75 73 20 74 68 65 20 61 62  l give us the ab
3150: 69 6c 69 74 79 20 74 6f 20 73 69 6d 75 6c 61 74  ility to simulat
3160: 65 20 61 20 64 69 73 6b 20 49 2f 4f 20 65 72 72  e a disk I/O err
3170: 6f 72 2e 20 20 54 68 69 73 0a 2a 2a 20 69 73 20  or.  This.** is 
3180: 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67  used for testing
3190: 20 74 68 65 20 49 2f 4f 20 72 65 63 6f 76 65 72   the I/O recover
31a0: 79 20 6c 6f 67 69 63 2e 0a 2a 2f 0a 23 69 66 64  y logic..*/.#ifd
31b0: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69  ef SQLITE_TEST.i
31c0: 6e 74 20 73 71 6c 69 74 65 5f 69 6f 5f 65 72 72  nt sqlite_io_err
31d0: 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 30 3b 0a  or_pending = 0;.
31e0: 23 64 65 66 69 6e 65 20 53 69 6d 75 6c 61 74 65  #define Simulate
31f0: 49 4f 45 72 72 6f 72 28 41 29 20 20 5c 0a 20 20  IOError(A)  \.  
3200: 20 69 66 28 20 73 71 6c 69 74 65 5f 69 6f 5f 65   if( sqlite_io_e
3210: 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 29 20 5c  rror_pending ) \
3220: 0a 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  .     if( sqlite
3230: 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e  _io_error_pendin
3240: 67 2d 2d 20 3d 3d 20 31 20 29 7b 20 6c 6f 63 61  g-- == 1 ){ loca
3250: 6c 5f 69 6f 65 72 72 28 29 3b 20 72 65 74 75 72  l_ioerr(); retur
3260: 6e 20 41 3b 20 7d 0a 73 74 61 74 69 63 20 76 6f  n A; }.static vo
3270: 69 64 20 6c 6f 63 61 6c 5f 69 6f 65 72 72 28 29  id local_ioerr()
3280: 7b 0a 20 20 73 71 6c 69 74 65 5f 69 6f 5f 65 72  {.  sqlite_io_er
3290: 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 30 3b  ror_pending = 0;
32a0: 20 20 2f 2a 20 52 65 61 6c 6c 79 20 6a 75 73 74    /* Really just
32b0: 20 61 20 70 6c 61 63 65 20 74 6f 20 73 65 74 20   a place to set 
32c0: 61 20 62 72 65 61 6b 70 6f 69 6e 74 20 2a 2f 0a  a breakpoint */.
32d0: 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  }.#else.#define 
32e0: 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
32f0: 41 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  A).#endif../*.**
3300: 20 57 68 65 6e 20 74 65 73 74 69 6e 67 2c 20 6b   When testing, k
3310: 65 65 70 20 61 20 63 6f 75 6e 74 20 6f 66 20 74  eep a count of t
3320: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 70 65  he number of ope
3330: 6e 20 66 69 6c 65 73 2e 0a 2a 2f 0a 23 69 66 64  n files..*/.#ifd
3340: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69  ef SQLITE_TEST.i
3350: 6e 74 20 73 71 6c 69 74 65 5f 6f 70 65 6e 5f 66  nt sqlite_open_f
3360: 69 6c 65 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23  ile_count = 0;.#
3370: 64 65 66 69 6e 65 20 4f 70 65 6e 43 6f 75 6e 74  define OpenCount
3380: 65 72 28 58 29 20 20 73 71 6c 69 74 65 5f 6f 70  er(X)  sqlite_op
3390: 65 6e 5f 66 69 6c 65 5f 63 6f 75 6e 74 2b 3d 28  en_file_count+=(
33a0: 58 29 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65  X).#else.#define
33b0: 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 58 29 0a   OpenCounter(X).
33c0: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44  #endif.../*.** D
33d0: 65 6c 65 74 65 20 74 68 65 20 6e 61 6d 65 64 20  elete the named 
33e0: 66 69 6c 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  file.*/.int sqli
33f0: 74 65 4f 73 44 65 6c 65 74 65 28 63 6f 6e 73 74  teOsDelete(const
3400: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
3410: 29 7b 0a 23 69 66 20 4f 53 5f 55 4e 49 58 0a 20  ){.#if OS_UNIX. 
3420: 20 75 6e 6c 69 6e 6b 28 7a 46 69 6c 65 6e 61 6d   unlink(zFilenam
3430: 65 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f  e);.#endif.#if O
3440: 53 5f 57 49 4e 0a 20 20 44 65 6c 65 74 65 46 69  S_WIN.  DeleteFi
3450: 6c 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 23  le(zFilename);.#
3460: 65 6e 64 69 66 0a 23 69 66 20 4f 53 5f 4d 41 43  endif.#if OS_MAC
3470: 0a 20 20 75 6e 6c 69 6e 6b 28 7a 46 69 6c 65 6e  .  unlink(zFilen
3480: 61 6d 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72  ame);.#endif.  r
3490: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
34a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
34b0: 20 54 52 55 45 20 69 66 20 74 68 65 20 6e 61 6d   TRUE if the nam
34c0: 65 64 20 66 69 6c 65 20 65 78 69 73 74 73 2e 0a  ed file exists..
34d0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 4f 73 46  */.int sqliteOsF
34e0: 69 6c 65 45 78 69 73 74 73 28 63 6f 6e 73 74 20  ileExists(const 
34f0: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29  char *zFilename)
3500: 7b 0a 23 69 66 20 4f 53 5f 55 4e 49 58 0a 20 20  {.#if OS_UNIX.  
3510: 72 65 74 75 72 6e 20 61 63 63 65 73 73 28 7a 46  return access(zF
3520: 69 6c 65 6e 61 6d 65 2c 20 30 29 3d 3d 30 3b 0a  ilename, 0)==0;.
3530: 23 65 6e 64 69 66 0a 23 69 66 20 4f 53 5f 57 49  #endif.#if OS_WI
3540: 4e 0a 20 20 72 65 74 75 72 6e 20 47 65 74 46 69  N.  return GetFi
3550: 6c 65 41 74 74 72 69 62 75 74 65 73 28 7a 46 69  leAttributes(zFi
3560: 6c 65 6e 61 6d 65 29 20 21 3d 20 30 78 66 66 66  lename) != 0xfff
3570: 66 66 66 66 66 3b 0a 23 65 6e 64 69 66 0a 23 69  fffff;.#endif.#i
3580: 66 20 4f 53 5f 4d 41 43 0a 20 20 72 65 74 75 72  f OS_MAC.  retur
3590: 6e 20 61 63 63 65 73 73 28 7a 46 69 6c 65 6e 61  n access(zFilena
35a0: 6d 65 2c 20 30 29 3d 3d 30 3b 0a 23 65 6e 64 69  me, 0)==0;.#endi
35b0: 66 0a 7d 0a 0a 0a 23 69 66 20 30 20 2f 2a 20 4e  f.}...#if 0 /* N
35c0: 4f 54 20 55 53 45 44 20 2a 2f 0a 2f 2a 0a 2a 2a  OT USED */./*.**
35d0: 20 43 68 61 6e 67 65 20 74 68 65 20 6e 61 6d 65   Change the name
35e0: 20 6f 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20   of an existing 
35f0: 66 69 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  file..*/.int sql
3600: 69 74 65 4f 73 46 69 6c 65 52 65 6e 61 6d 65 28  iteOsFileRename(
3610: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 6c 64  const char *zOld
3620: 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  Name, const char
3630: 20 2a 7a 4e 65 77 4e 61 6d 65 29 7b 0a 23 69 66   *zNewName){.#if
3640: 20 4f 53 5f 55 4e 49 58 0a 20 20 69 66 28 20 6c   OS_UNIX.  if( l
3650: 69 6e 6b 28 7a 4f 6c 64 4e 61 6d 65 2c 20 7a 4e  ink(zOldName, zN
3660: 65 77 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 72  ewName) ){.    r
3670: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
3680: 4f 52 3b 0a 20 20 7d 0a 20 20 75 6e 6c 69 6e 6b  OR;.  }.  unlink
3690: 28 7a 4f 6c 64 4e 61 6d 65 29 3b 0a 20 20 72 65  (zOldName);.  re
36a0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
36b0: 23 65 6e 64 69 66 0a 23 69 66 20 4f 53 5f 57 49  #endif.#if OS_WI
36c0: 4e 0a 20 20 69 66 28 20 21 4d 6f 76 65 46 69 6c  N.  if( !MoveFil
36d0: 65 28 7a 4f 6c 64 4e 61 6d 65 2c 20 7a 4e 65 77  e(zOldName, zNew
36e0: 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 72 65 74  Name) ){.    ret
36f0: 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
3700: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
3710: 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66  QLITE_OK;.#endif
3720: 0a 23 69 66 20 4f 53 5f 4d 41 43 0a 20 20 2f 2a  .#if OS_MAC.  /*
3730: 2a 2a 2a 20 46 49 58 20 4d 45 20 2a 2a 2a 2f 0a  *** FIX ME ***/.
3740: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
3750: 45 52 52 4f 52 3b 0a 23 65 6e 64 69 66 0a 7d 0a  ERROR;.#endif.}.
3760: 23 65 6e 64 69 66 20 2f 2a 20 4e 4f 54 20 55 53  #endif /* NOT US
3770: 45 44 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 74 74  ED */../*.** Att
3780: 65 6d 70 74 20 74 6f 20 6f 70 65 6e 20 61 20 66  empt to open a f
3790: 69 6c 65 20 66 6f 72 20 62 6f 74 68 20 72 65 61  ile for both rea
37a0: 64 69 6e 67 20 61 6e 64 20 77 72 69 74 69 6e 67  ding and writing
37b0: 2e 20 20 49 66 20 74 68 61 74 0a 2a 2a 20 66 61  .  If that.** fa
37c0: 69 6c 73 2c 20 74 72 79 20 6f 70 65 6e 69 6e 67  ils, try opening
37d0: 20 69 74 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 20   it read-only.  
37e0: 49 66 20 74 68 65 20 66 69 6c 65 20 64 6f 65 73  If the file does
37f0: 20 6e 6f 74 20 65 78 69 73 74 2c 0a 2a 2a 20 74   not exist,.** t
3800: 72 79 20 74 6f 20 63 72 65 61 74 65 20 69 74 2e  ry to create it.
3810: 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73  .**.** On succes
3820: 73 2c 20 61 20 68 61 6e 64 6c 65 20 66 6f 72 20  s, a handle for 
3830: 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20 69 73  the open file is
3840: 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 69 64 0a   written to *id.
3850: 2a 2a 20 61 6e 64 20 2a 70 52 65 61 64 6f 6e 6c  ** and *pReadonl
3860: 79 20 69 73 20 73 65 74 20 74 6f 20 30 20 69 66  y is set to 0 if
3870: 20 74 68 65 20 66 69 6c 65 20 77 61 73 20 6f 70   the file was op
3880: 65 6e 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67  ened for reading
3890: 20 61 6e 64 0a 2a 2a 20 77 72 69 74 69 6e 67 20   and.** writing 
38a0: 6f 72 20 31 20 69 66 20 74 68 65 20 66 69 6c 65  or 1 if the file
38b0: 20 77 61 73 20 6f 70 65 6e 65 64 20 72 65 61 64   was opened read
38c0: 2d 6f 6e 6c 79 2e 20 20 54 68 65 20 66 75 6e 63  -only.  The func
38d0: 74 69 6f 6e 20 72 65 74 75 72 6e 73 0a 2a 2a 20  tion returns.** 
38e0: 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a  SQLITE_OK..**.**
38f0: 20 4f 6e 20 66 61 69 6c 75 72 65 2c 20 74 68 65   On failure, the
3900: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
3910: 73 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  s SQLITE_CANTOPE
3920: 4e 20 61 6e 64 20 6c 65 61 76 65 73 0a 2a 2a 20  N and leaves.** 
3930: 2a 69 64 20 61 6e 64 20 2a 70 52 65 61 64 6f 6e  *id and *pReadon
3940: 6c 79 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f  ly unchanged..*/
3950: 0a 69 6e 74 20 73 71 6c 69 74 65 4f 73 4f 70 65  .int sqliteOsOpe
3960: 6e 52 65 61 64 57 72 69 74 65 28 0a 20 20 63 6f  nReadWrite(.  co
3970: 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
3980: 61 6d 65 2c 0a 20 20 4f 73 46 69 6c 65 20 2a 69  ame,.  OsFile *i
3990: 64 2c 0a 20 20 69 6e 74 20 2a 70 52 65 61 64 6f  d,.  int *pReado
39a0: 6e 6c 79 0a 29 7b 0a 23 69 66 20 4f 53 5f 55 4e  nly.){.#if OS_UN
39b0: 49 58 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  IX.  int rc;.  i
39c0: 64 2d 3e 64 69 72 66 64 20 3d 20 2d 31 3b 0a 20  d->dirfd = -1;. 
39d0: 20 69 64 2d 3e 66 64 20 3d 20 6f 70 65 6e 28 7a   id->fd = open(z
39e0: 46 69 6c 65 6e 61 6d 65 2c 20 4f 5f 52 44 57 52  Filename, O_RDWR
39f0: 7c 4f 5f 43 52 45 41 54 7c 4f 5f 4c 41 52 47 45  |O_CREAT|O_LARGE
3a00: 46 49 4c 45 7c 4f 5f 42 49 4e 41 52 59 2c 20 30  FILE|O_BINARY, 0
3a10: 36 34 34 29 3b 0a 20 20 69 66 28 20 69 64 2d 3e  644);.  if( id->
3a20: 66 64 3c 30 20 29 7b 0a 23 69 66 64 65 66 20 45  fd<0 ){.#ifdef E
3a30: 49 53 44 49 52 0a 20 20 20 20 69 66 28 20 65 72  ISDIR.    if( er
3a40: 72 6e 6f 3d 3d 45 49 53 44 49 52 20 29 7b 0a 20  rno==EISDIR ){. 
3a50: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
3a60: 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 20  TE_CANTOPEN;.   
3a70: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 64   }.#endif.    id
3a80: 2d 3e 66 64 20 3d 20 6f 70 65 6e 28 7a 46 69 6c  ->fd = open(zFil
3a90: 65 6e 61 6d 65 2c 20 4f 5f 52 44 4f 4e 4c 59 7c  ename, O_RDONLY|
3aa0: 4f 5f 4c 41 52 47 45 46 49 4c 45 7c 4f 5f 42 49  O_LARGEFILE|O_BI
3ab0: 4e 41 52 59 29 3b 0a 20 20 20 20 69 66 28 20 69  NARY);.    if( i
3ac0: 64 2d 3e 66 64 3c 30 20 29 7b 0a 20 20 20 20 20  d->fd<0 ){.     
3ad0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
3ae0: 41 4e 54 4f 50 45 4e 3b 20 0a 20 20 20 20 7d 0a  ANTOPEN; .    }.
3af0: 20 20 20 20 2a 70 52 65 61 64 6f 6e 6c 79 20 3d      *pReadonly =
3b00: 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
3b10: 20 2a 70 52 65 61 64 6f 6e 6c 79 20 3d 20 30 3b   *pReadonly = 0;
3b20: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 4f 73 45  .  }.  sqliteOsE
3b30: 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 72  nterMutex();.  r
3b40: 63 20 3d 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f  c = findLockInfo
3b50: 28 69 64 2d 3e 66 64 2c 20 26 69 64 2d 3e 70 4c  (id->fd, &id->pL
3b60: 6f 63 6b 2c 20 26 69 64 2d 3e 70 4f 70 65 6e 29  ock, &id->pOpen)
3b70: 3b 0a 20 20 73 71 6c 69 74 65 4f 73 4c 65 61 76  ;.  sqliteOsLeav
3b80: 65 4d 75 74 65 78 28 29 3b 0a 20 20 69 66 28 20  eMutex();.  if( 
3b90: 72 63 20 29 7b 0a 20 20 20 20 63 6c 6f 73 65 28  rc ){.    close(
3ba0: 69 64 2d 3e 66 64 29 3b 0a 20 20 20 20 72 65 74  id->fd);.    ret
3bb0: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
3bc0: 3b 0a 20 20 7d 0a 20 20 69 64 2d 3e 6c 6f 63 6b  ;.  }.  id->lock
3bd0: 65 64 20 3d 20 30 3b 0a 20 20 54 52 41 43 45 33  ed = 0;.  TRACE3
3be0: 28 22 4f 50 45 4e 20 20 20 20 25 2d 33 64 20 25  ("OPEN    %-3d %
3bf0: 73 5c 6e 22 2c 20 69 64 2d 3e 66 64 2c 20 7a 46  s\n", id->fd, zF
3c00: 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 4f 70 65 6e  ilename);.  Open
3c10: 43 6f 75 6e 74 65 72 28 2b 31 29 3b 0a 20 20 72  Counter(+1);.  r
3c20: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
3c30: 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f 53 5f 57  .#endif.#if OS_W
3c40: 49 4e 0a 20 20 48 41 4e 44 4c 45 20 68 20 3d 20  IN.  HANDLE h = 
3c50: 43 72 65 61 74 65 46 69 6c 65 28 7a 46 69 6c 65  CreateFile(zFile
3c60: 6e 61 6d 65 2c 0a 20 20 20 20 20 47 45 4e 45 52  name,.     GENER
3c70: 49 43 5f 52 45 41 44 20 7c 20 47 45 4e 45 52 49  IC_READ | GENERI
3c80: 43 5f 57 52 49 54 45 2c 0a 20 20 20 20 20 46 49  C_WRITE,.     FI
3c90: 4c 45 5f 53 48 41 52 45 5f 52 45 41 44 20 7c 20  LE_SHARE_READ | 
3ca0: 46 49 4c 45 5f 53 48 41 52 45 5f 57 52 49 54 45  FILE_SHARE_WRITE
3cb0: 2c 0a 20 20 20 20 20 4e 55 4c 4c 2c 0a 20 20 20  ,.     NULL,.   
3cc0: 20 20 4f 50 45 4e 5f 41 4c 57 41 59 53 2c 0a 20    OPEN_ALWAYS,. 
3cd0: 20 20 20 20 46 49 4c 45 5f 41 54 54 52 49 42 55      FILE_ATTRIBU
3ce0: 54 45 5f 4e 4f 52 4d 41 4c 20 7c 20 46 49 4c 45  TE_NORMAL | FILE
3cf0: 5f 46 4c 41 47 5f 52 41 4e 44 4f 4d 5f 41 43 43  _FLAG_RANDOM_ACC
3d00: 45 53 53 2c 0a 20 20 20 20 20 4e 55 4c 4c 0a 20  ESS,.     NULL. 
3d10: 20 29 3b 0a 20 20 69 66 28 20 68 3d 3d 49 4e 56   );.  if( h==INV
3d20: 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
3d30: 45 20 29 7b 0a 20 20 20 20 68 20 3d 20 43 72 65  E ){.    h = Cre
3d40: 61 74 65 46 69 6c 65 28 7a 46 69 6c 65 6e 61 6d  ateFile(zFilenam
3d50: 65 2c 0a 20 20 20 20 20 20 20 47 45 4e 45 52 49  e,.       GENERI
3d60: 43 5f 52 45 41 44 2c 0a 20 20 20 20 20 20 20 46  C_READ,.       F
3d70: 49 4c 45 5f 53 48 41 52 45 5f 52 45 41 44 2c 0a  ILE_SHARE_READ,.
3d80: 20 20 20 20 20 20 20 4e 55 4c 4c 2c 0a 20 20 20         NULL,.   
3d90: 20 20 20 20 4f 50 45 4e 5f 41 4c 57 41 59 53 2c      OPEN_ALWAYS,
3da0: 0a 20 20 20 20 20 20 20 46 49 4c 45 5f 41 54 54  .       FILE_ATT
3db0: 52 49 42 55 54 45 5f 4e 4f 52 4d 41 4c 20 7c 20  RIBUTE_NORMAL | 
3dc0: 46 49 4c 45 5f 46 4c 41 47 5f 52 41 4e 44 4f 4d  FILE_FLAG_RANDOM
3dd0: 5f 41 43 43 45 53 53 2c 0a 20 20 20 20 20 20 20  _ACCESS,.       
3de0: 4e 55 4c 4c 0a 20 20 20 20 29 3b 0a 20 20 20 20  NULL.    );.    
3df0: 69 66 28 20 68 3d 3d 49 4e 56 41 4c 49 44 5f 48  if( h==INVALID_H
3e00: 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 7b 0a 20  ANDLE_VALUE ){. 
3e10: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
3e20: 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 20  TE_CANTOPEN;.   
3e30: 20 7d 0a 20 20 20 20 2a 70 52 65 61 64 6f 6e 6c   }.    *pReadonl
3e40: 79 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  y = 1;.  }else{.
3e50: 20 20 20 20 2a 70 52 65 61 64 6f 6e 6c 79 20 3d      *pReadonly =
3e60: 20 30 3b 0a 20 20 7d 0a 20 20 69 64 2d 3e 68 20   0;.  }.  id->h 
3e70: 3d 20 68 3b 0a 20 20 69 64 2d 3e 6c 6f 63 6b 65  = h;.  id->locke
3e80: 64 20 3d 20 30 3b 0a 20 20 4f 70 65 6e 43 6f 75  d = 0;.  OpenCou
3e90: 6e 74 65 72 28 2b 31 29 3b 0a 20 20 72 65 74 75  nter(+1);.  retu
3ea0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65  rn SQLITE_OK;.#e
3eb0: 6e 64 69 66 0a 23 69 66 20 4f 53 5f 4d 41 43 0a  ndif.#if OS_MAC.
3ec0: 20 20 46 53 53 70 65 63 20 66 73 53 70 65 63 3b    FSSpec fsSpec;
3ed0: 0a 23 20 69 66 64 65 66 20 5f 4c 41 52 47 45 5f  .# ifdef _LARGE_
3ee0: 46 49 4c 45 0a 20 20 48 46 53 55 6e 69 53 74 72  FILE.  HFSUniStr
3ef0: 32 35 35 20 64 66 4e 61 6d 65 3b 0a 20 20 46 53  255 dfName;.  FS
3f00: 52 65 66 20 66 73 52 65 66 3b 0a 20 20 69 66 28  Ref fsRef;.  if(
3f10: 20 5f 5f 70 61 74 68 32 66 73 73 28 7a 46 69 6c   __path2fss(zFil
3f20: 65 6e 61 6d 65 2c 20 26 66 73 53 70 65 63 29 20  ename, &fsSpec) 
3f30: 21 3d 20 6e 6f 45 72 72 20 29 7b 0a 20 20 20 20  != noErr ){.    
3f40: 69 66 28 20 48 43 72 65 61 74 65 28 66 73 53 70  if( HCreate(fsSp
3f50: 65 63 2e 76 52 65 66 4e 75 6d 2c 20 66 73 53 70  ec.vRefNum, fsSp
3f60: 65 63 2e 70 61 72 49 44 2c 20 66 73 53 70 65 63  ec.parID, fsSpec
3f70: 2e 6e 61 6d 65 2c 20 27 53 51 4c 49 27 2c 20 63  .name, 'SQLI', c
3f80: 44 6f 63 75 6d 65 6e 74 46 69 6c 65 29 20 21 3d  DocumentFile) !=
3f90: 20 6e 6f 45 72 72 20 29 0a 20 20 20 20 20 20 72   noErr ).      r
3fa0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e  eturn SQLITE_CAN
3fb0: 54 4f 50 45 4e 3b 0a 20 20 7d 0a 20 20 69 66 28  TOPEN;.  }.  if(
3fc0: 20 46 53 70 4d 61 6b 65 46 53 52 65 66 28 26 66   FSpMakeFSRef(&f
3fd0: 73 53 70 65 63 2c 20 26 66 73 52 65 66 29 20 21  sSpec, &fsRef) !
3fe0: 3d 20 6e 6f 45 72 72 20 29 0a 20 20 20 20 72 65  = noErr ).    re
3ff0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54  turn SQLITE_CANT
4000: 4f 50 45 4e 3b 0a 20 20 46 53 47 65 74 44 61 74  OPEN;.  FSGetDat
4010: 61 46 6f 72 6b 4e 61 6d 65 28 26 64 66 4e 61 6d  aForkName(&dfNam
4020: 65 29 3b 0a 20 20 69 66 28 20 46 53 4f 70 65 6e  e);.  if( FSOpen
4030: 46 6f 72 6b 28 26 66 73 52 65 66 2c 20 64 66 4e  Fork(&fsRef, dfN
4040: 61 6d 65 2e 6c 65 6e 67 74 68 2c 20 64 66 4e 61  ame.length, dfNa
4050: 6d 65 2e 75 6e 69 63 6f 64 65 2c 0a 20 20 20 20  me.unicode,.    
4060: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 73 52               fsR
4070: 64 57 72 53 68 50 65 72 6d 2c 20 26 28 69 64 2d  dWrShPerm, &(id-
4080: 3e 72 65 66 4e 75 6d 29 29 20 21 3d 20 6e 6f 45  >refNum)) != noE
4090: 72 72 20 29 7b 0a 20 20 20 20 69 66 28 20 46 53  rr ){.    if( FS
40a0: 4f 70 65 6e 46 6f 72 6b 28 26 66 73 52 65 66 2c  OpenFork(&fsRef,
40b0: 20 64 66 4e 61 6d 65 2e 6c 65 6e 67 74 68 2c 20   dfName.length, 
40c0: 64 66 4e 61 6d 65 2e 75 6e 69 63 6f 64 65 2c 0a  dfName.unicode,.
40d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
40e0: 20 20 20 66 73 52 64 57 72 50 65 72 6d 2c 20 26     fsRdWrPerm, &
40f0: 28 69 64 2d 3e 72 65 66 4e 75 6d 29 29 20 21 3d  (id->refNum)) !=
4100: 20 6e 6f 45 72 72 20 29 7b 0a 20 20 20 20 20 20   noErr ){.      
4110: 69 66 20 28 46 53 4f 70 65 6e 46 6f 72 6b 28 26  if (FSOpenFork(&
4120: 66 73 52 65 66 2c 20 64 66 4e 61 6d 65 2e 6c 65  fsRef, dfName.le
4130: 6e 67 74 68 2c 20 64 66 4e 61 6d 65 2e 75 6e 69  ngth, dfName.uni
4140: 63 6f 64 65 2c 0a 20 20 20 20 20 20 20 20 20 20  code,.          
4150: 20 20 20 20 20 20 20 20 20 66 73 52 64 50 65 72           fsRdPer
4160: 6d 2c 20 26 28 69 64 2d 3e 72 65 66 4e 75 6d 29  m, &(id->refNum)
4170: 29 20 21 3d 20 6e 6f 45 72 72 20 29 0a 20 20 20  ) != noErr ).   
4180: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
4190: 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 20  TE_CANTOPEN;.   
41a0: 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20 20 20     else.        
41b0: 2a 70 52 65 61 64 6f 6e 6c 79 20 3d 20 31 3b 0a  *pReadonly = 1;.
41c0: 20 20 20 20 7d 20 65 6c 73 65 0a 20 20 20 20 20      } else.     
41d0: 20 2a 70 52 65 61 64 6f 6e 6c 79 20 3d 20 30 3b   *pReadonly = 0;
41e0: 0a 20 20 7d 20 65 6c 73 65 0a 20 20 20 20 2a 70  .  } else.    *p
41f0: 52 65 61 64 6f 6e 6c 79 20 3d 20 30 3b 0a 23 20  Readonly = 0;.# 
4200: 65 6c 73 65 0a 20 20 5f 5f 70 61 74 68 32 66 73  else.  __path2fs
4210: 73 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 26 66 73  s(zFilename, &fs
4220: 53 70 65 63 29 3b 0a 20 20 69 66 28 20 21 73 71  Spec);.  if( !sq
4230: 6c 69 74 65 4f 73 46 69 6c 65 45 78 69 73 74 73  liteOsFileExists
4240: 28 7a 46 69 6c 65 6e 61 6d 65 29 20 29 7b 0a 20  (zFilename) ){. 
4250: 20 20 20 69 66 28 20 48 43 72 65 61 74 65 28 66     if( HCreate(f
4260: 73 53 70 65 63 2e 76 52 65 66 4e 75 6d 2c 20 66  sSpec.vRefNum, f
4270: 73 53 70 65 63 2e 70 61 72 49 44 2c 20 66 73 53  sSpec.parID, fsS
4280: 70 65 63 2e 6e 61 6d 65 2c 20 27 53 51 4c 49 27  pec.name, 'SQLI'
4290: 2c 20 63 44 6f 63 75 6d 65 6e 74 46 69 6c 65 29  , cDocumentFile)
42a0: 20 21 3d 20 6e 6f 45 72 72 20 29 0a 20 20 20 20   != noErr ).    
42b0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
42c0: 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 7d 0a 20 20  CANTOPEN;.  }.  
42d0: 69 66 28 20 48 4f 70 65 6e 44 46 28 66 73 53 70  if( HOpenDF(fsSp
42e0: 65 63 2e 76 52 65 66 4e 75 6d 2c 20 66 73 53 70  ec.vRefNum, fsSp
42f0: 65 63 2e 70 61 72 49 44 2c 20 66 73 53 70 65 63  ec.parID, fsSpec
4300: 2e 6e 61 6d 65 2c 20 66 73 52 64 57 72 53 68 50  .name, fsRdWrShP
4310: 65 72 6d 2c 20 26 28 69 64 2d 3e 72 65 66 4e 75  erm, &(id->refNu
4320: 6d 29 29 20 21 3d 20 6e 6f 45 72 72 20 29 7b 0a  m)) != noErr ){.
4330: 20 20 20 20 69 66 28 20 48 4f 70 65 6e 44 46 28      if( HOpenDF(
4340: 66 73 53 70 65 63 2e 76 52 65 66 4e 75 6d 2c 20  fsSpec.vRefNum, 
4350: 66 73 53 70 65 63 2e 70 61 72 49 44 2c 20 66 73  fsSpec.parID, fs
4360: 53 70 65 63 2e 6e 61 6d 65 2c 20 66 73 52 64 57  Spec.name, fsRdW
4370: 72 50 65 72 6d 2c 20 26 28 69 64 2d 3e 72 65 66  rPerm, &(id->ref
4380: 4e 75 6d 29 29 20 21 3d 20 6e 6f 45 72 72 20 29  Num)) != noErr )
4390: 7b 0a 20 20 20 20 20 20 69 66 28 20 48 4f 70 65  {.      if( HOpe
43a0: 6e 44 46 28 66 73 53 70 65 63 2e 76 52 65 66 4e  nDF(fsSpec.vRefN
43b0: 75 6d 2c 20 66 73 53 70 65 63 2e 70 61 72 49 44  um, fsSpec.parID
43c0: 2c 20 66 73 53 70 65 63 2e 6e 61 6d 65 2c 20 66  , fsSpec.name, f
43d0: 73 52 64 50 65 72 6d 2c 20 26 28 69 64 2d 3e 72  sRdPerm, &(id->r
43e0: 65 66 4e 75 6d 29 29 20 21 3d 20 6e 6f 45 72 72  efNum)) != noErr
43f0: 20 29 0a 20 20 20 20 20 20 20 20 72 65 74 75 72   ).        retur
4400: 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  n SQLITE_CANTOPE
4410: 4e 3b 0a 20 20 20 20 20 20 65 6c 73 65 0a 20 20  N;.      else.  
4420: 20 20 20 20 20 20 2a 70 52 65 61 64 6f 6e 6c 79        *pReadonly
4430: 20 3d 20 31 3b 0a 20 20 20 20 7d 20 65 6c 73 65   = 1;.    } else
4440: 0a 20 20 20 20 20 20 2a 70 52 65 61 64 6f 6e 6c  .      *pReadonl
4450: 79 20 3d 20 30 3b 0a 20 20 7d 20 65 6c 73 65 0a  y = 0;.  } else.
4460: 20 20 20 20 2a 70 52 65 61 64 6f 6e 6c 79 20 3d      *pReadonly =
4470: 20 30 3b 0a 23 20 65 6e 64 69 66 0a 20 20 69 66   0;.# endif.  if
4480: 28 20 48 4f 70 65 6e 52 46 28 66 73 53 70 65 63  ( HOpenRF(fsSpec
4490: 2e 76 52 65 66 4e 75 6d 2c 20 66 73 53 70 65 63  .vRefNum, fsSpec
44a0: 2e 70 61 72 49 44 2c 20 66 73 53 70 65 63 2e 6e  .parID, fsSpec.n
44b0: 61 6d 65 2c 20 66 73 52 64 57 72 53 68 50 65 72  ame, fsRdWrShPer
44c0: 6d 2c 20 26 28 69 64 2d 3e 72 65 66 4e 75 6d 52  m, &(id->refNumR
44d0: 46 29 29 20 21 3d 20 6e 6f 45 72 72 29 7b 0a 20  F)) != noErr){. 
44e0: 20 20 20 69 64 2d 3e 72 65 66 4e 75 6d 52 46 20     id->refNumRF 
44f0: 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 69 64 2d 3e  = -1;.  }.  id->
4500: 6c 6f 63 6b 65 64 20 3d 20 30 3b 0a 20 20 69 64  locked = 0;.  id
4510: 2d 3e 64 65 6c 4f 6e 43 6c 6f 73 65 20 3d 20 30  ->delOnClose = 0
4520: 3b 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28  ;.  OpenCounter(
4530: 2b 31 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  +1);.  return SQ
4540: 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a  LITE_OK;.#endif.
4550: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70  }.../*.** Attemp
4560: 74 20 74 6f 20 6f 70 65 6e 20 61 20 6e 65 77 20  t to open a new 
4570: 66 69 6c 65 20 66 6f 72 20 65 78 63 6c 75 73 69  file for exclusi
4580: 76 65 20 61 63 63 65 73 73 20 62 79 20 74 68 69  ve access by thi
4590: 73 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 20 54 68  s process..** Th
45a0: 65 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 6f  e file will be o
45b0: 70 65 6e 65 64 20 66 6f 72 20 62 6f 74 68 20 72  pened for both r
45c0: 65 61 64 69 6e 67 20 61 6e 64 20 77 72 69 74 69  eading and writi
45d0: 6e 67 2e 20 20 54 6f 20 61 76 6f 69 64 0a 2a 2a  ng.  To avoid.**
45e0: 20 61 20 70 6f 74 65 6e 74 69 61 6c 20 73 65 63   a potential sec
45f0: 75 72 69 74 79 20 70 72 6f 62 6c 65 6d 2c 20 77  urity problem, w
4600: 65 20 64 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 74  e do not allow t
4610: 68 65 20 66 69 6c 65 20 74 6f 20 68 61 76 65 0a  he file to have.
4620: 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 65 78  ** previously ex
4630: 69 73 74 65 64 2e 20 20 4e 6f 72 20 64 6f 20 77  isted.  Nor do w
4640: 65 20 61 6c 6c 6f 77 20 74 68 65 20 66 69 6c 65  e allow the file
4650: 20 74 6f 20 62 65 20 61 20 73 79 6d 62 6f 6c 69   to be a symboli
4660: 63 0a 2a 2a 20 6c 69 6e 6b 2e 0a 2a 2a 0a 2a 2a  c.** link..**.**
4670: 20 49 66 20 64 65 6c 46 6c 61 67 20 69 73 20 74   If delFlag is t
4680: 72 75 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 61  rue, then make a
4690: 72 72 61 6e 67 65 6d 65 6e 74 73 20 74 6f 20 61  rrangements to a
46a0: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c  utomatically del
46b0: 65 74 65 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20  ete.** the file 
46c0: 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65  when it is close
46d0: 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63  d..**.** On succ
46e0: 65 73 73 2c 20 77 72 69 74 65 20 74 68 65 20 66  ess, write the f
46f0: 69 6c 65 20 68 61 6e 64 6c 65 20 69 6e 74 6f 20  ile handle into 
4700: 2a 69 64 20 61 6e 64 20 72 65 74 75 72 6e 20 53  *id and return S
4710: 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20  QLITE_OK..**.** 
4720: 4f 6e 20 66 61 69 6c 75 72 65 2c 20 72 65 74 75  On failure, retu
4730: 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  rn SQLITE_CANTOP
4740: 45 4e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  EN..*/.int sqlit
4750: 65 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69 76 65  eOsOpenExclusive
4760: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69  (const char *zFi
4770: 6c 65 6e 61 6d 65 2c 20 4f 73 46 69 6c 65 20 2a  lename, OsFile *
4780: 69 64 2c 20 69 6e 74 20 64 65 6c 46 6c 61 67 29  id, int delFlag)
4790: 7b 0a 23 69 66 20 4f 53 5f 55 4e 49 58 0a 20 20  {.#if OS_UNIX.  
47a0: 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 61 63  int rc;.  if( ac
47b0: 63 65 73 73 28 7a 46 69 6c 65 6e 61 6d 65 2c 20  cess(zFilename, 
47c0: 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  0)==0 ){.    ret
47d0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  urn SQLITE_CANTO
47e0: 50 45 4e 3b 0a 20 20 7d 0a 20 20 69 64 2d 3e 64  PEN;.  }.  id->d
47f0: 69 72 66 64 20 3d 20 2d 31 3b 0a 20 20 69 64 2d  irfd = -1;.  id-
4800: 3e 66 64 20 3d 20 6f 70 65 6e 28 7a 46 69 6c 65  >fd = open(zFile
4810: 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20  name,.          
4820: 20 20 20 20 20 20 4f 5f 52 44 57 52 7c 4f 5f 43        O_RDWR|O_C
4830: 52 45 41 54 7c 4f 5f 45 58 43 4c 7c 4f 5f 4e 4f  REAT|O_EXCL|O_NO
4840: 46 4f 4c 4c 4f 57 7c 4f 5f 4c 41 52 47 45 46 49  FOLLOW|O_LARGEFI
4850: 4c 45 7c 4f 5f 42 49 4e 41 52 59 2c 20 30 36 30  LE|O_BINARY, 060
4860: 30 29 3b 0a 20 20 69 66 28 20 69 64 2d 3e 66 64  0);.  if( id->fd
4870: 3c 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  <0 ){.    return
4880: 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
4890: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 4f 73  ;.  }.  sqliteOs
48a0: 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
48b0: 72 63 20 3d 20 66 69 6e 64 4c 6f 63 6b 49 6e 66  rc = findLockInf
48c0: 6f 28 69 64 2d 3e 66 64 2c 20 26 69 64 2d 3e 70  o(id->fd, &id->p
48d0: 4c 6f 63 6b 2c 20 26 69 64 2d 3e 70 4f 70 65 6e  Lock, &id->pOpen
48e0: 29 3b 0a 20 20 73 71 6c 69 74 65 4f 73 4c 65 61  );.  sqliteOsLea
48f0: 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 69 66 28  veMutex();.  if(
4900: 20 72 63 20 29 7b 0a 20 20 20 20 63 6c 6f 73 65   rc ){.    close
4910: 28 69 64 2d 3e 66 64 29 3b 0a 20 20 20 20 75 6e  (id->fd);.    un
4920: 6c 69 6e 6b 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  link(zFilename);
4930: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
4940: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
4950: 69 64 2d 3e 6c 6f 63 6b 65 64 20 3d 20 30 3b 0a  id->locked = 0;.
4960: 20 20 69 66 28 20 64 65 6c 46 6c 61 67 20 29 7b    if( delFlag ){
4970: 0a 20 20 20 20 75 6e 6c 69 6e 6b 28 7a 46 69 6c  .    unlink(zFil
4980: 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 54 52  ename);.  }.  TR
4990: 41 43 45 33 28 22 4f 50 45 4e 2d 45 58 20 25 2d  ACE3("OPEN-EX %-
49a0: 33 64 20 25 73 5c 6e 22 2c 20 69 64 2d 3e 66 64  3d %s\n", id->fd
49b0: 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  , zFilename);.  
49c0: 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2b 31 29 3b  OpenCounter(+1);
49d0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
49e0: 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  _OK;.#endif.#if 
49f0: 4f 53 5f 57 49 4e 0a 20 20 48 41 4e 44 4c 45 20  OS_WIN.  HANDLE 
4a00: 68 3b 0a 20 20 69 6e 74 20 66 69 6c 65 66 6c 61  h;.  int filefla
4a10: 67 73 3b 0a 20 20 69 66 28 20 64 65 6c 46 6c 61  gs;.  if( delFla
4a20: 67 20 29 7b 0a 20 20 20 20 66 69 6c 65 66 6c 61  g ){.    filefla
4a30: 67 73 20 3d 20 46 49 4c 45 5f 41 54 54 52 49 42  gs = FILE_ATTRIB
4a40: 55 54 45 5f 54 45 4d 50 4f 52 41 52 59 20 7c 20  UTE_TEMPORARY | 
4a50: 46 49 4c 45 5f 46 4c 41 47 5f 52 41 4e 44 4f 4d  FILE_FLAG_RANDOM
4a60: 5f 41 43 43 45 53 53 20 0a 20 20 20 20 20 20 20  _ACCESS .       
4a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
4a80: 46 49 4c 45 5f 46 4c 41 47 5f 44 45 4c 45 54 45  FILE_FLAG_DELETE
4a90: 5f 4f 4e 5f 43 4c 4f 53 45 3b 0a 20 20 7d 65 6c  _ON_CLOSE;.  }el
4aa0: 73 65 7b 0a 20 20 20 20 66 69 6c 65 66 6c 61 67  se{.    fileflag
4ab0: 73 20 3d 20 46 49 4c 45 5f 46 4c 41 47 5f 52 41  s = FILE_FLAG_RA
4ac0: 4e 44 4f 4d 5f 41 43 43 45 53 53 3b 0a 20 20 7d  NDOM_ACCESS;.  }
4ad0: 0a 20 20 68 20 3d 20 43 72 65 61 74 65 46 69 6c  .  h = CreateFil
4ae0: 65 28 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20  e(zFilename,.   
4af0: 20 20 47 45 4e 45 52 49 43 5f 52 45 41 44 20 7c    GENERIC_READ |
4b00: 20 47 45 4e 45 52 49 43 5f 57 52 49 54 45 2c 0a   GENERIC_WRITE,.
4b10: 20 20 20 20 20 30 2c 0a 20 20 20 20 20 4e 55 4c       0,.     NUL
4b20: 4c 2c 0a 20 20 20 20 20 43 52 45 41 54 45 5f 41  L,.     CREATE_A
4b30: 4c 57 41 59 53 2c 0a 20 20 20 20 20 66 69 6c 65  LWAYS,.     file
4b40: 66 6c 61 67 73 2c 0a 20 20 20 20 20 4e 55 4c 4c  flags,.     NULL
4b50: 0a 20 20 29 3b 0a 20 20 69 66 28 20 68 3d 3d 49  .  );.  if( h==I
4b60: 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41  NVALID_HANDLE_VA
4b70: 4c 55 45 20 29 7b 0a 20 20 20 20 72 65 74 75 72  LUE ){.    retur
4b80: 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  n SQLITE_CANTOPE
4b90: 4e 3b 0a 20 20 7d 0a 20 20 69 64 2d 3e 68 20 3d  N;.  }.  id->h =
4ba0: 20 68 3b 0a 20 20 69 64 2d 3e 6c 6f 63 6b 65 64   h;.  id->locked
4bb0: 20 3d 20 30 3b 0a 20 20 4f 70 65 6e 43 6f 75 6e   = 0;.  OpenCoun
4bc0: 74 65 72 28 2b 31 29 3b 0a 20 20 72 65 74 75 72  ter(+1);.  retur
4bd0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e  n SQLITE_OK;.#en
4be0: 64 69 66 0a 23 69 66 20 4f 53 5f 4d 41 43 0a 20  dif.#if OS_MAC. 
4bf0: 20 46 53 53 70 65 63 20 66 73 53 70 65 63 3b 0a   FSSpec fsSpec;.
4c00: 23 20 69 66 64 65 66 20 5f 4c 41 52 47 45 5f 46  # ifdef _LARGE_F
4c10: 49 4c 45 0a 20 20 48 46 53 55 6e 69 53 74 72 32  ILE.  HFSUniStr2
4c20: 35 35 20 64 66 4e 61 6d 65 3b 0a 20 20 46 53 52  55 dfName;.  FSR
4c30: 65 66 20 66 73 52 65 66 3b 0a 20 20 5f 5f 70 61  ef fsRef;.  __pa
4c40: 74 68 32 66 73 73 28 7a 46 69 6c 65 6e 61 6d 65  th2fss(zFilename
4c50: 2c 20 26 66 73 53 70 65 63 29 3b 0a 20 20 69 66  , &fsSpec);.  if
4c60: 28 20 48 43 72 65 61 74 65 28 66 73 53 70 65 63  ( HCreate(fsSpec
4c70: 2e 76 52 65 66 4e 75 6d 2c 20 66 73 53 70 65 63  .vRefNum, fsSpec
4c80: 2e 70 61 72 49 44 2c 20 66 73 53 70 65 63 2e 6e  .parID, fsSpec.n
4c90: 61 6d 65 2c 20 27 53 51 4c 49 27 2c 20 63 44 6f  ame, 'SQLI', cDo
4ca0: 63 75 6d 65 6e 74 46 69 6c 65 29 20 21 3d 20 6e  cumentFile) != n
4cb0: 6f 45 72 72 20 29 0a 20 20 20 20 72 65 74 75 72  oErr ).    retur
4cc0: 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  n SQLITE_CANTOPE
4cd0: 4e 3b 0a 20 20 69 66 28 20 46 53 70 4d 61 6b 65  N;.  if( FSpMake
4ce0: 46 53 52 65 66 28 26 66 73 53 70 65 63 2c 20 26  FSRef(&fsSpec, &
4cf0: 66 73 52 65 66 29 20 21 3d 20 6e 6f 45 72 72 20  fsRef) != noErr 
4d00: 29 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ).    return SQL
4d10: 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20  ITE_CANTOPEN;.  
4d20: 46 53 47 65 74 44 61 74 61 46 6f 72 6b 4e 61 6d  FSGetDataForkNam
4d30: 65 28 26 64 66 4e 61 6d 65 29 3b 0a 20 20 69 66  e(&dfName);.  if
4d40: 28 20 46 53 4f 70 65 6e 46 6f 72 6b 28 26 66 73  ( FSOpenFork(&fs
4d50: 52 65 66 2c 20 64 66 4e 61 6d 65 2e 6c 65 6e 67  Ref, dfName.leng
4d60: 74 68 2c 20 64 66 4e 61 6d 65 2e 75 6e 69 63 6f  th, dfName.unico
4d70: 64 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  de,.            
4d80: 20 20 20 20 20 66 73 52 64 57 72 50 65 72 6d 2c       fsRdWrPerm,
4d90: 20 26 28 69 64 2d 3e 72 65 66 4e 75 6d 29 29 20   &(id->refNum)) 
4da0: 21 3d 20 6e 6f 45 72 72 20 29 0a 20 20 20 20 72  != noErr ).    r
4db0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e  eturn SQLITE_CAN
4dc0: 54 4f 50 45 4e 3b 0a 23 20 65 6c 73 65 0a 20 20  TOPEN;.# else.  
4dd0: 5f 5f 70 61 74 68 32 66 73 73 28 7a 46 69 6c 65  __path2fss(zFile
4de0: 6e 61 6d 65 2c 20 26 66 73 53 70 65 63 29 3b 0a  name, &fsSpec);.
4df0: 20 20 69 66 28 20 48 43 72 65 61 74 65 28 66 73    if( HCreate(fs
4e00: 53 70 65 63 2e 76 52 65 66 4e 75 6d 2c 20 66 73  Spec.vRefNum, fs
4e10: 53 70 65 63 2e 70 61 72 49 44 2c 20 66 73 53 70  Spec.parID, fsSp
4e20: 65 63 2e 6e 61 6d 65 2c 20 27 53 51 4c 49 27 2c  ec.name, 'SQLI',
4e30: 20 63 44 6f 63 75 6d 65 6e 74 46 69 6c 65 29 20   cDocumentFile) 
4e40: 21 3d 20 6e 6f 45 72 72 20 29 0a 20 20 20 20 72  != noErr ).    r
4e50: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e  eturn SQLITE_CAN
4e60: 54 4f 50 45 4e 3b 0a 20 20 69 66 28 20 48 4f 70  TOPEN;.  if( HOp
4e70: 65 6e 44 46 28 66 73 53 70 65 63 2e 76 52 65 66  enDF(fsSpec.vRef
4e80: 4e 75 6d 2c 20 66 73 53 70 65 63 2e 70 61 72 49  Num, fsSpec.parI
4e90: 44 2c 20 66 73 53 70 65 63 2e 6e 61 6d 65 2c 20  D, fsSpec.name, 
4ea0: 66 73 52 64 57 72 50 65 72 6d 2c 20 26 28 69 64  fsRdWrPerm, &(id
4eb0: 2d 3e 72 65 66 4e 75 6d 29 29 20 21 3d 20 6e 6f  ->refNum)) != no
4ec0: 45 72 72 20 29 0a 20 20 20 20 72 65 74 75 72 6e  Err ).    return
4ed0: 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
4ee0: 3b 0a 23 20 65 6e 64 69 66 0a 20 20 69 64 2d 3e  ;.# endif.  id->
4ef0: 72 65 66 4e 75 6d 52 46 20 3d 20 2d 31 3b 0a 20  refNumRF = -1;. 
4f00: 20 69 64 2d 3e 6c 6f 63 6b 65 64 20 3d 20 30 3b   id->locked = 0;
4f10: 0a 20 20 69 64 2d 3e 64 65 6c 4f 6e 43 6c 6f 73  .  id->delOnClos
4f20: 65 20 3d 20 64 65 6c 46 6c 61 67 3b 0a 20 20 69  e = delFlag;.  i
4f30: 66 20 28 64 65 6c 46 6c 61 67 29 0a 20 20 20 20  f (delFlag).    
4f40: 69 64 2d 3e 70 61 74 68 54 6f 44 65 6c 20 3d 20  id->pathToDel = 
4f50: 73 71 6c 69 74 65 4f 73 46 75 6c 6c 50 61 74 68  sqliteOsFullPath
4f60: 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  name(zFilename);
4f70: 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2b  .  OpenCounter(+
4f80: 31 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  1);.  return SQL
4f90: 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 7d  ITE_OK;.#endif.}
4fa0: 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20  ../*.** Attempt 
4fb0: 74 6f 20 6f 70 65 6e 20 61 20 6e 65 77 20 66 69  to open a new fi
4fc0: 6c 65 20 66 6f 72 20 72 65 61 64 2d 6f 6e 6c 79  le for read-only
4fd0: 20 61 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 4f   access..**.** O
4fe0: 6e 20 73 75 63 63 65 73 73 2c 20 77 72 69 74 65  n success, write
4ff0: 20 74 68 65 20 66 69 6c 65 20 68 61 6e 64 6c 65   the file handle
5000: 20 69 6e 74 6f 20 2a 69 64 20 61 6e 64 20 72 65   into *id and re
5010: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  turn SQLITE_OK..
5020: 2a 2a 0a 2a 2a 20 4f 6e 20 66 61 69 6c 75 72 65  **.** On failure
5030: 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
5040: 43 41 4e 54 4f 50 45 4e 2e 0a 2a 2f 0a 69 6e 74  CANTOPEN..*/.int
5050: 20 73 71 6c 69 74 65 4f 73 4f 70 65 6e 52 65 61   sqliteOsOpenRea
5060: 64 4f 6e 6c 79 28 63 6f 6e 73 74 20 63 68 61 72  dOnly(const char
5070: 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 4f 73 46   *zFilename, OsF
5080: 69 6c 65 20 2a 69 64 29 7b 0a 23 69 66 20 4f 53  ile *id){.#if OS
5090: 5f 55 4e 49 58 0a 20 20 69 6e 74 20 72 63 3b 0a  _UNIX.  int rc;.
50a0: 20 20 69 64 2d 3e 64 69 72 66 64 20 3d 20 2d 31    id->dirfd = -1
50b0: 3b 0a 20 20 69 64 2d 3e 66 64 20 3d 20 6f 70 65  ;.  id->fd = ope
50c0: 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 4f 5f 52  n(zFilename, O_R
50d0: 44 4f 4e 4c 59 7c 4f 5f 4c 41 52 47 45 46 49 4c  DONLY|O_LARGEFIL
50e0: 45 7c 4f 5f 42 49 4e 41 52 59 29 3b 0a 20 20 69  E|O_BINARY);.  i
50f0: 66 28 20 69 64 2d 3e 66 64 3c 30 20 29 7b 0a 20  f( id->fd<0 ){. 
5100: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
5110: 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 7d 0a 20  _CANTOPEN;.  }. 
5120: 20 73 71 6c 69 74 65 4f 73 45 6e 74 65 72 4d 75   sqliteOsEnterMu
5130: 74 65 78 28 29 3b 0a 20 20 72 63 20 3d 20 66 69  tex();.  rc = fi
5140: 6e 64 4c 6f 63 6b 49 6e 66 6f 28 69 64 2d 3e 66  ndLockInfo(id->f
5150: 64 2c 20 26 69 64 2d 3e 70 4c 6f 63 6b 2c 20 26  d, &id->pLock, &
5160: 69 64 2d 3e 70 4f 70 65 6e 29 3b 0a 20 20 73 71  id->pOpen);.  sq
5170: 6c 69 74 65 4f 73 4c 65 61 76 65 4d 75 74 65 78  liteOsLeaveMutex
5180: 28 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  ();.  if( rc ){.
5190: 20 20 20 20 63 6c 6f 73 65 28 69 64 2d 3e 66 64      close(id->fd
51a0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
51b0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
51c0: 20 20 69 64 2d 3e 6c 6f 63 6b 65 64 20 3d 20 30    id->locked = 0
51d0: 3b 0a 20 20 54 52 41 43 45 33 28 22 4f 50 45 4e  ;.  TRACE3("OPEN
51e0: 2d 52 4f 20 25 2d 33 64 20 25 73 5c 6e 22 2c 20  -RO %-3d %s\n", 
51f0: 69 64 2d 3e 66 64 2c 20 7a 46 69 6c 65 6e 61 6d  id->fd, zFilenam
5200: 65 29 3b 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65  e);.  OpenCounte
5210: 72 28 2b 31 29 3b 0a 20 20 72 65 74 75 72 6e 20  r(+1);.  return 
5220: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69  SQLITE_OK;.#endi
5230: 66 0a 23 69 66 20 4f 53 5f 57 49 4e 0a 20 20 48  f.#if OS_WIN.  H
5240: 41 4e 44 4c 45 20 68 20 3d 20 43 72 65 61 74 65  ANDLE h = Create
5250: 46 69 6c 65 28 7a 46 69 6c 65 6e 61 6d 65 2c 0a  File(zFilename,.
5260: 20 20 20 20 20 47 45 4e 45 52 49 43 5f 52 45 41       GENERIC_REA
5270: 44 2c 0a 20 20 20 20 20 30 2c 0a 20 20 20 20 20  D,.     0,.     
5280: 4e 55 4c 4c 2c 0a 20 20 20 20 20 4f 50 45 4e 5f  NULL,.     OPEN_
5290: 45 58 49 53 54 49 4e 47 2c 0a 20 20 20 20 20 46  EXISTING,.     F
52a0: 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 4e 4f  ILE_ATTRIBUTE_NO
52b0: 52 4d 41 4c 20 7c 20 46 49 4c 45 5f 46 4c 41 47  RMAL | FILE_FLAG
52c0: 5f 52 41 4e 44 4f 4d 5f 41 43 43 45 53 53 2c 0a  _RANDOM_ACCESS,.
52d0: 20 20 20 20 20 4e 55 4c 4c 0a 20 20 29 3b 0a 20       NULL.  );. 
52e0: 20 69 66 28 20 68 3d 3d 49 4e 56 41 4c 49 44 5f   if( h==INVALID_
52f0: 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 7b 0a  HANDLE_VALUE ){.
5300: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
5310: 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 7d 0a  E_CANTOPEN;.  }.
5320: 20 20 69 64 2d 3e 68 20 3d 20 68 3b 0a 20 20 69    id->h = h;.  i
5330: 64 2d 3e 6c 6f 63 6b 65 64 20 3d 20 30 3b 0a 20  d->locked = 0;. 
5340: 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2b 31 29   OpenCounter(+1)
5350: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
5360: 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 23 69 66  E_OK;.#endif.#if
5370: 20 4f 53 5f 4d 41 43 0a 20 20 46 53 53 70 65 63   OS_MAC.  FSSpec
5380: 20 66 73 53 70 65 63 3b 0a 23 20 69 66 64 65 66   fsSpec;.# ifdef
5390: 20 5f 4c 41 52 47 45 5f 46 49 4c 45 0a 20 20 48   _LARGE_FILE.  H
53a0: 46 53 55 6e 69 53 74 72 32 35 35 20 64 66 4e 61  FSUniStr255 dfNa
53b0: 6d 65 3b 0a 20 20 46 53 52 65 66 20 66 73 52 65  me;.  FSRef fsRe
53c0: 66 3b 0a 20 20 69 66 28 20 5f 5f 70 61 74 68 32  f;.  if( __path2
53d0: 66 73 73 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 26  fss(zFilename, &
53e0: 66 73 53 70 65 63 29 20 21 3d 20 6e 6f 45 72 72  fsSpec) != noErr
53f0: 20 29 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51   ).    return SQ
5400: 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20  LITE_CANTOPEN;. 
5410: 20 69 66 28 20 46 53 70 4d 61 6b 65 46 53 52 65   if( FSpMakeFSRe
5420: 66 28 26 66 73 53 70 65 63 2c 20 26 66 73 52 65  f(&fsSpec, &fsRe
5430: 66 29 20 21 3d 20 6e 6f 45 72 72 20 29 0a 20 20  f) != noErr ).  
5440: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
5450: 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 46 53 47 65  CANTOPEN;.  FSGe
5460: 74 44 61 74 61 46 6f 72 6b 4e 61 6d 65 28 26 64  tDataForkName(&d
5470: 66 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 46 53  fName);.  if( FS
5480: 4f 70 65 6e 46 6f 72 6b 28 26 66 73 52 65 66 2c  OpenFork(&fsRef,
5490: 20 64 66 4e 61 6d 65 2e 6c 65 6e 67 74 68 2c 20   dfName.length, 
54a0: 64 66 4e 61 6d 65 2e 75 6e 69 63 6f 64 65 2c 0a  dfName.unicode,.
54b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
54c0: 20 66 73 52 64 50 65 72 6d 2c 20 26 28 69 64 2d   fsRdPerm, &(id-
54d0: 3e 72 65 66 4e 75 6d 29 29 20 21 3d 20 6e 6f 45  >refNum)) != noE
54e0: 72 72 20 29 0a 20 20 20 20 72 65 74 75 72 6e 20  rr ).    return 
54f0: 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b  SQLITE_CANTOPEN;
5500: 0a 23 20 65 6c 73 65 0a 20 20 5f 5f 70 61 74 68  .# else.  __path
5510: 32 66 73 73 28 7a 46 69 6c 65 6e 61 6d 65 2c 20  2fss(zFilename, 
5520: 26 66 73 53 70 65 63 29 3b 0a 20 20 69 66 28 20  &fsSpec);.  if( 
5530: 48 4f 70 65 6e 44 46 28 66 73 53 70 65 63 2e 76  HOpenDF(fsSpec.v
5540: 52 65 66 4e 75 6d 2c 20 66 73 53 70 65 63 2e 70  RefNum, fsSpec.p
5550: 61 72 49 44 2c 20 66 73 53 70 65 63 2e 6e 61 6d  arID, fsSpec.nam
5560: 65 2c 20 66 73 52 64 50 65 72 6d 2c 20 26 28 69  e, fsRdPerm, &(i
5570: 64 2d 3e 72 65 66 4e 75 6d 29 29 20 21 3d 20 6e  d->refNum)) != n
5580: 6f 45 72 72 20 29 0a 20 20 20 20 72 65 74 75 72  oErr ).    retur
5590: 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  n SQLITE_CANTOPE
55a0: 4e 3b 0a 23 20 65 6e 64 69 66 0a 20 20 69 66 28  N;.# endif.  if(
55b0: 20 48 4f 70 65 6e 52 46 28 66 73 53 70 65 63 2e   HOpenRF(fsSpec.
55c0: 76 52 65 66 4e 75 6d 2c 20 66 73 53 70 65 63 2e  vRefNum, fsSpec.
55d0: 70 61 72 49 44 2c 20 66 73 53 70 65 63 2e 6e 61  parID, fsSpec.na
55e0: 6d 65 2c 20 66 73 52 64 57 72 53 68 50 65 72 6d  me, fsRdWrShPerm
55f0: 2c 20 26 28 69 64 2d 3e 72 65 66 4e 75 6d 52 46  , &(id->refNumRF
5600: 29 29 20 21 3d 20 6e 6f 45 72 72 29 7b 0a 20 20  )) != noErr){.  
5610: 20 20 69 64 2d 3e 72 65 66 4e 75 6d 52 46 20 3d    id->refNumRF =
5620: 20 2d 31 3b 0a 20 20 7d 0a 20 20 69 64 2d 3e 6c   -1;.  }.  id->l
5630: 6f 63 6b 65 64 20 3d 20 30 3b 0a 20 20 69 64 2d  ocked = 0;.  id-
5640: 3e 64 65 6c 4f 6e 43 6c 6f 73 65 20 3d 20 30 3b  >delOnClose = 0;
5650: 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2b  .  OpenCounter(+
5660: 31 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  1);.  return SQL
5670: 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 7d  ITE_OK;.#endif.}
5680: 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20  ../*.** Attempt 
5690: 74 6f 20 6f 70 65 6e 20 61 20 66 69 6c 65 20 64  to open a file d
56a0: 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 74 68  escriptor for th
56b0: 65 20 64 69 72 65 63 74 6f 72 79 20 74 68 61 74  e directory that
56c0: 20 63 6f 6e 74 61 69 6e 73 20 61 0a 2a 2a 20 66   contains a.** f
56d0: 69 6c 65 2e 20 20 54 68 69 73 20 66 69 6c 65 20  ile.  This file 
56e0: 64 65 73 63 72 69 70 74 6f 72 20 63 61 6e 20 62  descriptor can b
56f0: 65 20 75 73 65 64 20 74 6f 20 66 73 79 6e 63 28  e used to fsync(
5700: 29 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 0a  ) the directory.
5710: 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6d  ** in order to m
5720: 61 6b 65 20 73 75 72 65 20 74 68 65 20 63 72 65  ake sure the cre
5730: 61 74 69 6f 6e 20 6f 66 20 61 20 6e 65 77 20 66  ation of a new f
5740: 69 6c 65 20 69 73 20 61 63 74 75 61 6c 6c 79 20  ile is actually 
5750: 77 72 69 74 74 65 6e 0a 2a 2a 20 74 6f 20 64 69  written.** to di
5760: 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  sk..**.** This r
5770: 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 6d  outine is only m
5780: 65 61 6e 69 6e 67 66 75 6c 20 66 6f 72 20 55 6e  eaningful for Un
5790: 69 78 2e 20 20 49 74 20 69 73 20 61 20 6e 6f 2d  ix.  It is a no-
57a0: 6f 70 20 75 6e 64 65 72 0a 2a 2a 20 77 69 6e 64  op under.** wind
57b0: 6f 77 73 20 73 69 6e 63 65 20 77 69 6e 64 6f 77  ows since window
57c0: 73 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f  s does not suppo
57d0: 72 74 20 68 61 72 64 20 6c 69 6e 6b 73 2e 0a 2a  rt hard links..*
57e0: 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c  *.** On success,
57f0: 20 61 20 68 61 6e 64 6c 65 20 66 6f 72 20 61 20   a handle for a 
5800: 70 72 65 76 69 6f 75 73 6c 79 20 6f 70 65 6e 20  previously open 
5810: 66 69 6c 65 20 69 73 20 61 74 20 2a 69 64 20 69  file is at *id i
5820: 73 0a 2a 2a 20 75 70 64 61 74 65 64 20 77 69 74  s.** updated wit
5830: 68 20 74 68 65 20 6e 65 77 20 64 69 72 65 63 74  h the new direct
5840: 6f 72 79 20 66 69 6c 65 20 64 65 73 63 72 69 70  ory file descrip
5850: 74 6f 72 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  tor and SQLITE_O
5860: 4b 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64  K is.** returned
5870: 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 66 61 69 6c 75  ..**.** On failu
5880: 72 65 2c 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  re, the function
5890: 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
58a0: 43 41 4e 54 4f 50 45 4e 20 61 6e 64 20 6c 65 61  CANTOPEN and lea
58b0: 76 65 73 0a 2a 2a 20 2a 69 64 20 75 6e 63 68 61  ves.** *id uncha
58c0: 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  nged..*/.int sql
58d0: 69 74 65 4f 73 4f 70 65 6e 44 69 72 65 63 74 6f  iteOsOpenDirecto
58e0: 72 79 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ry(.  const char
58f0: 20 2a 7a 44 69 72 6e 61 6d 65 2c 0a 20 20 4f 73   *zDirname,.  Os
5900: 46 69 6c 65 20 2a 69 64 0a 29 7b 0a 23 69 66 20  File *id.){.#if 
5910: 4f 53 5f 55 4e 49 58 0a 20 20 69 66 28 20 69 64  OS_UNIX.  if( id
5920: 2d 3e 66 64 3c 30 20 29 7b 0a 20 20 20 20 2f 2a  ->fd<0 ){.    /*
5930: 20 44 6f 20 6e 6f 74 20 6f 70 65 6e 20 74 68 65   Do not open the
5940: 20 64 69 72 65 63 74 6f 72 79 20 69 66 20 74 68   directory if th
5950: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
5960: 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 6c 72 65  file is not alre
5970: 61 64 79 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 2e  ady.    ** open.
5980: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
5990: 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a  QLITE_CANTOPEN;.
59a0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 69 64    }.  assert( id
59b0: 2d 3e 64 69 72 66 64 3c 30 20 29 3b 0a 20 20 69  ->dirfd<0 );.  i
59c0: 64 2d 3e 64 69 72 66 64 20 3d 20 6f 70 65 6e 28  d->dirfd = open(
59d0: 7a 44 69 72 6e 61 6d 65 2c 20 4f 5f 52 44 4f 4e  zDirname, O_RDON
59e0: 4c 59 7c 4f 5f 42 49 4e 41 52 59 2c 20 30 36 34  LY|O_BINARY, 064
59f0: 34 29 3b 0a 20 20 69 66 28 20 69 64 2d 3e 64 69  4);.  if( id->di
5a00: 72 66 64 3c 30 20 29 7b 0a 20 20 20 20 72 65 74  rfd<0 ){.    ret
5a10: 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  urn SQLITE_CANTO
5a20: 50 45 4e 3b 20 0a 20 20 7d 0a 20 20 54 52 41 43  PEN; .  }.  TRAC
5a30: 45 33 28 22 4f 50 45 4e 44 49 52 20 25 2d 33 64  E3("OPENDIR %-3d
5a40: 20 25 73 5c 6e 22 2c 20 69 64 2d 3e 64 69 72 66   %s\n", id->dirf
5a50: 64 2c 20 7a 44 69 72 6e 61 6d 65 29 3b 0a 23 65  d, zDirname);.#e
5a60: 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51  ndif.  return SQ
5a70: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
5a80: 2a 20 49 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * If the followi
5a90: 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62  ng global variab
5aa0: 6c 65 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 73  le points to a s
5ab0: 74 72 69 6e 67 20 77 68 69 63 68 20 69 73 20 74  tring which is t
5ac0: 68 65 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20 61 20  he.** name of a 
5ad0: 64 69 72 65 63 74 6f 72 79 2c 20 74 68 65 6e 20  directory, then 
5ae0: 74 68 61 74 20 64 69 72 65 63 74 6f 72 79 20 77  that directory w
5af0: 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20 73  ill be used to s
5b00: 74 6f 72 65 0a 2a 2a 20 74 65 6d 70 6f 72 61 72  tore.** temporar
5b10: 79 20 66 69 6c 65 73 2e 0a 2a 2f 0a 63 6f 6e 73  y files..*/.cons
5b20: 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 5f 74  t char *sqlite_t
5b30: 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20 3d 20  emp_directory = 
5b40: 30 3b 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  0;../*.** Create
5b50: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
5b60: 65 20 6e 61 6d 65 20 69 6e 20 7a 42 75 66 2e 20  e name in zBuf. 
5b70: 20 7a 42 75 66 20 6d 75 73 74 20 62 65 20 62 69   zBuf must be bi
5b80: 67 20 65 6e 6f 75 67 68 20 74 6f 0a 2a 2a 20 68  g enough to.** h
5b90: 6f 6c 64 20 61 74 20 6c 65 61 73 74 20 53 51 4c  old at least SQL
5ba0: 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a  ITE_TEMPNAME_SIZ
5bb0: 45 20 63 68 61 72 61 63 74 65 72 73 2e 0a 2a 2f  E characters..*/
5bc0: 0a 69 6e 74 20 73 71 6c 69 74 65 4f 73 54 65 6d  .int sqliteOsTem
5bd0: 70 46 69 6c 65 4e 61 6d 65 28 63 68 61 72 20 2a  pFileName(char *
5be0: 7a 42 75 66 29 7b 0a 23 69 66 20 4f 53 5f 55 4e  zBuf){.#if OS_UN
5bf0: 49 58 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  IX.  static cons
5c00: 74 20 63 68 61 72 20 2a 61 7a 44 69 72 73 5b 5d  t char *azDirs[]
5c10: 20 3d 20 7b 0a 20 20 20 20 20 30 2c 0a 20 20 20   = {.     0,.   
5c20: 20 20 22 2f 76 61 72 2f 74 6d 70 22 2c 0a 20 20    "/var/tmp",.  
5c30: 20 20 20 22 2f 75 73 72 2f 74 6d 70 22 2c 0a 20     "/usr/tmp",. 
5c40: 20 20 20 20 22 2f 74 6d 70 22 2c 0a 20 20 20 20      "/tmp",.    
5c50: 20 22 2e 22 2c 0a 20 20 7d 3b 0a 20 20 73 74 61   ".",.  };.  sta
5c60: 74 69 63 20 75 6e 73 69 67 6e 65 64 20 63 68 61  tic unsigned cha
5c70: 72 20 7a 43 68 61 72 73 5b 5d 20 3d 0a 20 20 20  r zChars[] =.   
5c80: 20 22 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e   "abcdefghijklmn
5c90: 6f 70 71 72 73 74 75 76 77 78 79 7a 22 0a 20 20  opqrstuvwxyz".  
5ca0: 20 20 22 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d    "ABCDEFGHIJKLM
5cb0: 4e 4f 50 51 52 53 54 55 56 57 58 59 5a 22 0a 20  NOPQRSTUVWXYZ". 
5cc0: 20 20 20 22 30 31 32 33 34 35 36 37 38 39 22 3b     "0123456789";
5cd0: 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 73  .  int i, j;.  s
5ce0: 74 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a  truct stat buf;.
5cf0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
5d00: 69 72 20 3d 20 22 2e 22 3b 0a 20 20 61 7a 44 69  ir = ".";.  azDi
5d10: 72 73 5b 30 5d 20 3d 20 73 71 6c 69 74 65 5f 74  rs[0] = sqlite_t
5d20: 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 3b 0a 20  emp_directory;. 
5d30: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
5d40: 6f 66 28 61 7a 44 69 72 73 29 2f 73 69 7a 65 6f  of(azDirs)/sizeo
5d50: 66 28 61 7a 44 69 72 73 5b 30 5d 29 3b 20 69 2b  f(azDirs[0]); i+
5d60: 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 7a 44 69  +){.    if( azDi
5d70: 72 73 5b 69 5d 3d 3d 30 20 29 20 63 6f 6e 74 69  rs[i]==0 ) conti
5d80: 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 73 74 61  nue;.    if( sta
5d90: 74 28 61 7a 44 69 72 73 5b 69 5d 2c 20 26 62 75  t(azDirs[i], &bu
5da0: 66 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  f) ) continue;. 
5db0: 20 20 20 69 66 28 20 21 53 5f 49 53 44 49 52 28     if( !S_ISDIR(
5dc0: 62 75 66 2e 73 74 5f 6d 6f 64 65 29 20 29 20 63  buf.st_mode) ) c
5dd0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
5de0: 20 61 63 63 65 73 73 28 61 7a 44 69 72 73 5b 69   access(azDirs[i
5df0: 5d 2c 20 30 37 29 20 29 20 63 6f 6e 74 69 6e 75  ], 07) ) continu
5e00: 65 3b 0a 20 20 20 20 7a 44 69 72 20 3d 20 61 7a  e;.    zDir = az
5e10: 44 69 72 73 5b 69 5d 3b 0a 20 20 20 20 62 72 65  Dirs[i];.    bre
5e20: 61 6b 3b 0a 20 20 7d 0a 20 20 64 6f 7b 0a 20 20  ak;.  }.  do{.  
5e30: 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 20    sprintf(zBuf, 
5e40: 22 25 73 2f 22 54 45 4d 50 5f 46 49 4c 45 5f 50  "%s/"TEMP_FILE_P
5e50: 52 45 46 49 58 2c 20 7a 44 69 72 29 3b 0a 20 20  REFIX, zDir);.  
5e60: 20 20 6a 20 3d 20 73 74 72 6c 65 6e 28 7a 42 75    j = strlen(zBu
5e70: 66 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 52 61  f);.    sqliteRa
5e80: 6e 64 6f 6d 6e 65 73 73 28 31 35 2c 20 26 7a 42  ndomness(15, &zB
5e90: 75 66 5b 6a 5d 29 3b 0a 20 20 20 20 66 6f 72 28  uf[j]);.    for(
5ea0: 69 3d 30 3b 20 69 3c 31 35 3b 20 69 2b 2b 2c 20  i=0; i<15; i++, 
5eb0: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 7a 42 75 66  j++){.      zBuf
5ec0: 5b 6a 5d 20 3d 20 28 63 68 61 72 29 7a 43 68 61  [j] = (char)zCha
5ed0: 72 73 5b 20 28 28 75 6e 73 69 67 6e 65 64 20 63  rs[ ((unsigned c
5ee0: 68 61 72 29 7a 42 75 66 5b 6a 5d 29 25 28 73 69  har)zBuf[j])%(si
5ef0: 7a 65 6f 66 28 7a 43 68 61 72 73 29 2d 31 29 20  zeof(zChars)-1) 
5f00: 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 42 75  ];.    }.    zBu
5f10: 66 5b 6a 5d 20 3d 20 30 3b 0a 20 20 7d 77 68 69  f[j] = 0;.  }whi
5f20: 6c 65 28 20 61 63 63 65 73 73 28 7a 42 75 66 2c  le( access(zBuf,
5f30: 30 29 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a  0)==0 );.#endif.
5f40: 23 69 66 20 4f 53 5f 57 49 4e 0a 20 20 73 74 61  #if OS_WIN.  sta
5f50: 74 69 63 20 63 68 61 72 20 7a 43 68 61 72 73 5b  tic char zChars[
5f60: 5d 20 3d 0a 20 20 20 20 22 61 62 63 64 65 66 67  ] =.    "abcdefg
5f70: 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77  hijklmnopqrstuvw
5f80: 78 79 7a 22 0a 20 20 20 20 22 41 42 43 44 45 46  xyz".    "ABCDEF
5f90: 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56  GHIJKLMNOPQRSTUV
5fa0: 57 58 59 5a 22 0a 20 20 20 20 22 30 31 32 33 34  WXYZ".    "01234
5fb0: 35 36 37 38 39 22 3b 0a 20 20 69 6e 74 20 69 2c  56789";.  int i,
5fc0: 20 6a 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   j;.  const char
5fd0: 20 2a 7a 44 69 72 3b 0a 20 20 63 68 61 72 20 7a   *zDir;.  char z
5fe0: 54 65 6d 70 50 61 74 68 5b 53 51 4c 49 54 45 5f  TempPath[SQLITE_
5ff0: 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 5d 3b 0a  TEMPNAME_SIZE];.
6000: 20 20 69 66 28 20 73 71 6c 69 74 65 5f 74 65 6d    if( sqlite_tem
6010: 70 5f 64 69 72 65 63 74 6f 72 79 3d 3d 30 20 29  p_directory==0 )
6020: 7b 0a 20 20 20 20 47 65 74 54 65 6d 70 50 61 74  {.    GetTempPat
6030: 68 28 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d  h(SQLITE_TEMPNAM
6040: 45 5f 53 49 5a 45 2d 33 30 2c 20 7a 54 65 6d 70  E_SIZE-30, zTemp
6050: 50 61 74 68 29 3b 0a 20 20 20 20 66 6f 72 28 69  Path);.    for(i
6060: 3d 73 74 72 6c 65 6e 28 7a 54 65 6d 70 50 61 74  =strlen(zTempPat
6070: 68 29 3b 20 69 3e 30 20 26 26 20 7a 54 65 6d 70  h); i>0 && zTemp
6080: 50 61 74 68 5b 69 2d 31 5d 3d 3d 27 5c 5c 27 3b  Path[i-1]=='\\';
6090: 20 69 2d 2d 29 7b 7d 0a 20 20 20 20 7a 54 65 6d   i--){}.    zTem
60a0: 70 50 61 74 68 5b 69 5d 20 3d 20 30 3b 0a 20 20  pPath[i] = 0;.  
60b0: 20 20 7a 44 69 72 20 3d 20 7a 54 65 6d 70 50 61    zDir = zTempPa
60c0: 74 68 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  th;.  }else{.   
60d0: 20 7a 44 69 72 20 3d 20 73 71 6c 69 74 65 5f 74   zDir = sqlite_t
60e0: 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 3b 0a 20  emp_directory;. 
60f0: 20 7d 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20   }.  for(;;){.  
6100: 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 20    sprintf(zBuf, 
6110: 22 25 73 5c 5c 22 54 45 4d 50 5f 46 49 4c 45 5f  "%s\\"TEMP_FILE_
6120: 50 52 45 46 49 58 2c 20 7a 44 69 72 29 3b 0a 20  PREFIX, zDir);. 
6130: 20 20 20 6a 20 3d 20 73 74 72 6c 65 6e 28 7a 42     j = strlen(zB
6140: 75 66 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 52  uf);.    sqliteR
6150: 61 6e 64 6f 6d 6e 65 73 73 28 31 35 2c 20 26 7a  andomness(15, &z
6160: 42 75 66 5b 6a 5d 29 3b 0a 20 20 20 20 66 6f 72  Buf[j]);.    for
6170: 28 69 3d 30 3b 20 69 3c 31 35 3b 20 69 2b 2b 2c  (i=0; i<15; i++,
6180: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 7a 42 75   j++){.      zBu
6190: 66 5b 6a 5d 20 3d 20 28 63 68 61 72 29 7a 43 68  f[j] = (char)zCh
61a0: 61 72 73 5b 20 28 28 75 6e 73 69 67 6e 65 64 20  ars[ ((unsigned 
61b0: 63 68 61 72 29 7a 42 75 66 5b 6a 5d 29 25 28 73  char)zBuf[j])%(s
61c0: 69 7a 65 6f 66 28 7a 43 68 61 72 73 29 2d 31 29  izeof(zChars)-1)
61d0: 20 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 42   ];.    }.    zB
61e0: 75 66 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 69  uf[j] = 0;.    i
61f0: 66 28 20 21 73 71 6c 69 74 65 4f 73 46 69 6c 65  f( !sqliteOsFile
6200: 45 78 69 73 74 73 28 7a 42 75 66 29 20 29 20 62  Exists(zBuf) ) b
6210: 72 65 61 6b 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  reak;.  }.#endif
6220: 0a 23 69 66 20 4f 53 5f 4d 41 43 0a 20 20 73 74  .#if OS_MAC.  st
6230: 61 74 69 63 20 63 68 61 72 20 7a 43 68 61 72 73  atic char zChars
6240: 5b 5d 20 3d 0a 20 20 20 20 22 61 62 63 64 65 66  [] =.    "abcdef
6250: 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76  ghijklmnopqrstuv
6260: 77 78 79 7a 22 0a 20 20 20 20 22 41 42 43 44 45  wxyz".    "ABCDE
6270: 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55  FGHIJKLMNOPQRSTU
6280: 56 57 58 59 5a 22 0a 20 20 20 20 22 30 31 32 33  VWXYZ".    "0123
6290: 34 35 36 37 38 39 22 3b 0a 20 20 69 6e 74 20 69  456789";.  int i
62a0: 2c 20 6a 3b 0a 20 20 63 68 61 72 20 2a 7a 44 69  , j;.  char *zDi
62b0: 72 3b 0a 20 20 63 68 61 72 20 7a 54 65 6d 70 50  r;.  char zTempP
62c0: 61 74 68 5b 53 51 4c 49 54 45 5f 54 45 4d 50 4e  ath[SQLITE_TEMPN
62d0: 41 4d 45 5f 53 49 5a 45 5d 3b 0a 20 20 63 68 61  AME_SIZE];.  cha
62e0: 72 20 7a 64 69 72 4e 61 6d 65 5b 33 32 5d 3b 0a  r zdirName[32];.
62f0: 20 20 43 49 6e 66 6f 50 42 52 65 63 20 69 6e 66    CInfoPBRec inf
6300: 6f 52 65 63 3b 0a 20 20 53 74 72 33 31 20 64 69  oRec;.  Str31 di
6310: 72 4e 61 6d 65 3b 0a 20 20 6d 65 6d 73 65 74 28  rName;.  memset(
6320: 26 69 6e 66 6f 52 65 63 2c 20 30 2c 20 73 69 7a  &infoRec, 0, siz
6330: 65 6f 66 28 69 6e 66 6f 52 65 63 29 29 3b 0a 20  eof(infoRec));. 
6340: 20 6d 65 6d 73 65 74 28 7a 54 65 6d 70 50 61 74   memset(zTempPat
6350: 68 2c 20 30 2c 20 53 51 4c 49 54 45 5f 54 45 4d  h, 0, SQLITE_TEM
6360: 50 4e 41 4d 45 5f 53 49 5a 45 29 3b 0a 20 20 69  PNAME_SIZE);.  i
6370: 66 28 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f 64  f( sqlite_temp_d
6380: 69 72 65 63 74 6f 72 79 21 3d 30 20 29 7b 0a 20  irectory!=0 ){. 
6390: 20 20 20 7a 44 69 72 20 3d 20 73 71 6c 69 74 65     zDir = sqlite
63a0: 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 3b  _temp_directory;
63b0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 46 69 6e  .  }else if( Fin
63c0: 64 46 6f 6c 64 65 72 28 6b 4f 6e 53 79 73 74 65  dFolder(kOnSyste
63d0: 6d 44 69 73 6b 2c 20 6b 54 65 6d 70 6f 72 61 72  mDisk, kTemporar
63e0: 79 46 6f 6c 64 65 72 54 79 70 65 2c 20 20 6b 43  yFolderType,  kC
63f0: 72 65 61 74 65 46 6f 6c 64 65 72 2c 0a 20 20 20  reateFolder,.   
6400: 20 20 20 20 26 28 69 6e 66 6f 52 65 63 2e 64 69      &(infoRec.di
6410: 72 49 6e 66 6f 2e 69 6f 56 52 65 66 4e 75 6d 29  rInfo.ioVRefNum)
6420: 2c 20 26 28 69 6e 66 6f 52 65 63 2e 64 69 72 49  , &(infoRec.dirI
6430: 6e 66 6f 2e 69 6f 44 72 50 61 72 49 44 29 29 20  nfo.ioDrParID)) 
6440: 3d 3d 20 6e 6f 45 72 72 20 29 7b 0a 20 20 20 20  == noErr ){.    
6450: 69 6e 66 6f 52 65 63 2e 64 69 72 49 6e 66 6f 2e  infoRec.dirInfo.
6460: 69 6f 4e 61 6d 65 50 74 72 20 3d 20 64 69 72 4e  ioNamePtr = dirN
6470: 61 6d 65 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20  ame;.    do{.   
6480: 20 20 20 69 6e 66 6f 52 65 63 2e 64 69 72 49 6e     infoRec.dirIn
6490: 66 6f 2e 69 6f 46 44 69 72 49 6e 64 65 78 20 3d  fo.ioFDirIndex =
64a0: 20 2d 31 3b 0a 20 20 20 20 20 20 69 6e 66 6f 52   -1;.      infoR
64b0: 65 63 2e 64 69 72 49 6e 66 6f 2e 69 6f 44 72 44  ec.dirInfo.ioDrD
64c0: 69 72 49 44 20 3d 20 69 6e 66 6f 52 65 63 2e 64  irID = infoRec.d
64d0: 69 72 49 6e 66 6f 2e 69 6f 44 72 50 61 72 49 44  irInfo.ioDrParID
64e0: 3b 0a 20 20 20 20 20 20 69 66 28 20 50 42 47 65  ;.      if( PBGe
64f0: 74 43 61 74 49 6e 66 6f 53 79 6e 63 28 26 69 6e  tCatInfoSync(&in
6500: 66 6f 52 65 63 29 20 3d 3d 20 6e 6f 45 72 72 20  foRec) == noErr 
6510: 29 7b 0a 20 20 20 20 20 20 20 20 43 6f 70 79 50  ){.        CopyP
6520: 61 73 63 61 6c 53 74 72 69 6e 67 54 6f 43 28 64  ascalStringToC(d
6530: 69 72 4e 61 6d 65 2c 20 7a 64 69 72 4e 61 6d 65  irName, zdirName
6540: 29 3b 0a 20 20 20 20 20 20 20 20 69 20 3d 20 73  );.        i = s
6550: 74 72 6c 65 6e 28 7a 64 69 72 4e 61 6d 65 29 3b  trlen(zdirName);
6560: 0a 20 20 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65  .        memmove
6570: 28 26 28 7a 54 65 6d 70 50 61 74 68 5b 69 2b 31  (&(zTempPath[i+1
6580: 5d 29 2c 20 7a 54 65 6d 70 50 61 74 68 2c 20 73  ]), zTempPath, s
6590: 74 72 6c 65 6e 28 7a 54 65 6d 70 50 61 74 68 29  trlen(zTempPath)
65a0: 29 3b 0a 20 20 20 20 20 20 20 20 73 74 72 63 70  );.        strcp
65b0: 79 28 7a 54 65 6d 70 50 61 74 68 2c 20 7a 64 69  y(zTempPath, zdi
65c0: 72 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  rName);.        
65d0: 7a 54 65 6d 70 50 61 74 68 5b 69 5d 20 3d 20 27  zTempPath[i] = '
65e0: 3a 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  :';.      }else{
65f0: 0a 20 20 20 20 20 20 20 20 2a 7a 54 65 6d 70 50  .        *zTempP
6600: 61 74 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ath = 0;.       
6610: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
6620: 20 20 20 20 7d 20 77 68 69 6c 65 28 20 69 6e 66      } while( inf
6630: 6f 52 65 63 2e 64 69 72 49 6e 66 6f 2e 69 6f 44  oRec.dirInfo.ioD
6640: 72 44 69 72 49 44 20 21 3d 20 66 73 52 74 44 69  rDirID != fsRtDi
6650: 72 49 44 20 29 3b 0a 20 20 20 20 7a 44 69 72 20  rID );.    zDir 
6660: 3d 20 7a 54 65 6d 70 50 61 74 68 3b 0a 20 20 7d  = zTempPath;.  }
6670: 0a 20 20 69 66 28 20 7a 44 69 72 5b 30 5d 3d 3d  .  if( zDir[0]==
6680: 30 20 29 7b 0a 20 20 20 20 67 65 74 63 77 64 28  0 ){.    getcwd(
6690: 7a 54 65 6d 70 50 61 74 68 2c 20 53 51 4c 49 54  zTempPath, SQLIT
66a0: 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 2d  E_TEMPNAME_SIZE-
66b0: 32 34 29 3b 0a 20 20 20 20 7a 44 69 72 20 3d 20  24);.    zDir = 
66c0: 7a 54 65 6d 70 50 61 74 68 3b 0a 20 20 7d 0a 20  zTempPath;.  }. 
66d0: 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 73 70   for(;;){.    sp
66e0: 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 25 73 22  rintf(zBuf, "%s"
66f0: 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49 58  TEMP_FILE_PREFIX
6700: 2c 20 7a 44 69 72 29 3b 0a 20 20 20 20 6a 20 3d  , zDir);.    j =
6710: 20 73 74 72 6c 65 6e 28 7a 42 75 66 29 3b 0a 20   strlen(zBuf);. 
6720: 20 20 20 73 71 6c 69 74 65 52 61 6e 64 6f 6d 6e     sqliteRandomn
6730: 65 73 73 28 31 35 2c 20 26 7a 42 75 66 5b 6a 5d  ess(15, &zBuf[j]
6740: 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
6750: 69 3c 31 35 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b  i<15; i++, j++){
6760: 0a 20 20 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d  .      zBuf[j] =
6770: 20 28 63 68 61 72 29 7a 43 68 61 72 73 5b 20 28   (char)zChars[ (
6780: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 7a  (unsigned char)z
6790: 42 75 66 5b 6a 5d 29 25 28 73 69 7a 65 6f 66 28  Buf[j])%(sizeof(
67a0: 7a 43 68 61 72 73 29 2d 31 29 20 5d 3b 0a 20 20  zChars)-1) ];.  
67b0: 20 20 7d 0a 20 20 20 20 7a 42 75 66 5b 6a 5d 20    }.    zBuf[j] 
67c0: 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 21 73 71  = 0;.    if( !sq
67d0: 6c 69 74 65 4f 73 46 69 6c 65 45 78 69 73 74 73  liteOsFileExists
67e0: 28 7a 42 75 66 29 20 29 20 62 72 65 61 6b 3b 0a  (zBuf) ) break;.
67f0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74    }.#endif.  ret
6800: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 0a  urn SQLITE_OK; .
6810: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
6820: 20 66 69 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71   file..*/.int sq
6830: 6c 69 74 65 4f 73 43 6c 6f 73 65 28 4f 73 46 69  liteOsClose(OsFi
6840: 6c 65 20 2a 69 64 29 7b 0a 23 69 66 20 4f 53 5f  le *id){.#if OS_
6850: 55 4e 49 58 0a 20 20 73 71 6c 69 74 65 4f 73 55  UNIX.  sqliteOsU
6860: 6e 6c 6f 63 6b 28 69 64 29 3b 0a 20 20 69 66 28  nlock(id);.  if(
6870: 20 69 64 2d 3e 64 69 72 66 64 3e 3d 30 20 29 20   id->dirfd>=0 ) 
6880: 63 6c 6f 73 65 28 69 64 2d 3e 64 69 72 66 64 29  close(id->dirfd)
6890: 3b 0a 20 20 69 64 2d 3e 64 69 72 66 64 20 3d 20  ;.  id->dirfd = 
68a0: 2d 31 3b 0a 20 20 73 71 6c 69 74 65 4f 73 45 6e  -1;.  sqliteOsEn
68b0: 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 69 66  terMutex();.  if
68c0: 28 20 69 64 2d 3e 70 4f 70 65 6e 2d 3e 6e 4c 6f  ( id->pOpen->nLo
68d0: 63 6b 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  ck ){.    /* If 
68e0: 74 68 65 72 65 20 61 72 65 20 6f 75 74 73 74 61  there are outsta
68f0: 6e 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 64 6f 20  nding locks, do 
6900: 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 63 6c 6f  not actually clo
6910: 73 65 20 74 68 65 20 66 69 6c 65 20 6a 75 73 74  se the file just
6920: 0a 20 20 20 20 2a 2a 20 79 65 74 20 62 65 63 61  .    ** yet beca
6930: 75 73 65 20 74 68 61 74 20 77 6f 75 6c 64 20 63  use that would c
6940: 6c 65 61 72 20 74 68 6f 73 65 20 6c 6f 63 6b 73  lear those locks
6950: 2e 20 20 49 6e 73 74 65 61 64 2c 20 61 64 64 20  .  Instead, add 
6960: 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20  the file.    ** 
6970: 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 70 4f  descriptor to pO
6980: 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 2e 20 20  pen->aPending.  
6990: 49 74 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d  It will be autom
69a0: 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64 20  atically closed 
69b0: 77 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20  when.    ** the 
69c0: 6c 61 73 74 20 6c 6f 63 6b 20 69 73 20 63 6c 65  last lock is cle
69d0: 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ared..    */.   
69e0: 20 69 6e 74 20 2a 61 4e 65 77 3b 0a 20 20 20 20   int *aNew;.    
69f0: 73 74 72 75 63 74 20 6f 70 65 6e 43 6e 74 20 2a  struct openCnt *
6a00: 70 4f 70 65 6e 20 3d 20 69 64 2d 3e 70 4f 70 65  pOpen = id->pOpe
6a10: 6e 3b 0a 20 20 20 20 70 4f 70 65 6e 2d 3e 6e 50  n;.    pOpen->nP
6a20: 65 6e 64 69 6e 67 2b 2b 3b 0a 20 20 20 20 61 4e  ending++;.    aN
6a30: 65 77 20 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c  ew = sqliteReall
6a40: 6f 63 28 20 70 4f 70 65 6e 2d 3e 61 50 65 6e 64  oc( pOpen->aPend
6a50: 69 6e 67 2c 20 70 4f 70 65 6e 2d 3e 6e 50 65 6e  ing, pOpen->nPen
6a60: 64 69 6e 67 2a 73 69 7a 65 6f 66 28 69 6e 74 29  ding*sizeof(int)
6a70: 20 29 3b 0a 20 20 20 20 69 66 28 20 61 4e 65 77   );.    if( aNew
6a80: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
6a90: 49 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  If a malloc fail
6aa0: 73 2c 20 6a 75 73 74 20 6c 65 61 6b 20 74 68 65  s, just leak the
6ab0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
6ac0: 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   */.    }else{. 
6ad0: 20 20 20 20 20 70 4f 70 65 6e 2d 3e 61 50 65 6e       pOpen->aPen
6ae0: 64 69 6e 67 20 3d 20 61 4e 65 77 3b 0a 20 20 20  ding = aNew;.   
6af0: 20 20 20 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69     pOpen->aPendi
6b00: 6e 67 5b 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69  ng[pOpen->nPendi
6b10: 6e 67 2d 31 5d 20 3d 20 69 64 2d 3e 66 64 3b 0a  ng-1] = id->fd;.
6b20: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
6b30: 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20     /* There are 
6b40: 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c  no outstanding l
6b50: 6f 63 6b 73 20 73 6f 20 77 65 20 63 61 6e 20 63  ocks so we can c
6b60: 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20 69 6d  lose the file im
6b70: 6d 65 64 69 61 74 65 6c 79 20 2a 2f 0a 20 20 20  mediately */.   
6b80: 20 63 6c 6f 73 65 28 69 64 2d 3e 66 64 29 3b 0a   close(id->fd);.
6b90: 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 4c 6f 63    }.  releaseLoc
6ba0: 6b 49 6e 66 6f 28 69 64 2d 3e 70 4c 6f 63 6b 29  kInfo(id->pLock)
6bb0: 3b 0a 20 20 72 65 6c 65 61 73 65 4f 70 65 6e 43  ;.  releaseOpenC
6bc0: 6e 74 28 69 64 2d 3e 70 4f 70 65 6e 29 3b 0a 20  nt(id->pOpen);. 
6bd0: 20 73 71 6c 69 74 65 4f 73 4c 65 61 76 65 4d 75   sqliteOsLeaveMu
6be0: 74 65 78 28 29 3b 0a 20 20 54 52 41 43 45 32 28  tex();.  TRACE2(
6bf0: 22 43 4c 4f 53 45 20 20 20 25 2d 33 64 5c 6e 22  "CLOSE   %-3d\n"
6c00: 2c 20 69 64 2d 3e 66 64 29 3b 0a 20 20 4f 70 65  , id->fd);.  Ope
6c10: 6e 43 6f 75 6e 74 65 72 28 2d 31 29 3b 0a 20 20  nCounter(-1);.  
6c20: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
6c30: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f 53 5f  ;.#endif.#if OS_
6c40: 57 49 4e 0a 20 20 43 6c 6f 73 65 48 61 6e 64 6c  WIN.  CloseHandl
6c50: 65 28 69 64 2d 3e 68 29 3b 0a 20 20 4f 70 65 6e  e(id->h);.  Open
6c60: 43 6f 75 6e 74 65 72 28 2d 31 29 3b 0a 20 20 72  Counter(-1);.  r
6c70: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
6c80: 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f 53 5f 4d  .#endif.#if OS_M
6c90: 41 43 0a 20 20 69 66 28 20 69 64 2d 3e 72 65 66  AC.  if( id->ref
6ca0: 4e 75 6d 52 46 21 3d 2d 31 20 29 0a 20 20 20 20  NumRF!=-1 ).    
6cb0: 46 53 43 6c 6f 73 65 28 69 64 2d 3e 72 65 66 4e  FSClose(id->refN
6cc0: 75 6d 52 46 29 3b 0a 23 20 69 66 64 65 66 20 5f  umRF);.# ifdef _
6cd0: 4c 41 52 47 45 5f 46 49 4c 45 0a 20 20 46 53 43  LARGE_FILE.  FSC
6ce0: 6c 6f 73 65 46 6f 72 6b 28 69 64 2d 3e 72 65 66  loseFork(id->ref
6cf0: 4e 75 6d 29 3b 0a 23 20 65 6c 73 65 0a 20 20 46  Num);.# else.  F
6d00: 53 43 6c 6f 73 65 28 69 64 2d 3e 72 65 66 4e 75  SClose(id->refNu
6d10: 6d 29 3b 0a 23 20 65 6e 64 69 66 0a 20 20 69 66  m);.# endif.  if
6d20: 28 20 69 64 2d 3e 64 65 6c 4f 6e 43 6c 6f 73 65  ( id->delOnClose
6d30: 20 29 7b 0a 20 20 20 20 75 6e 6c 69 6e 6b 28 69   ){.    unlink(i
6d40: 64 2d 3e 70 61 74 68 54 6f 44 65 6c 29 3b 0a 20  d->pathToDel);. 
6d50: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 69 64     sqliteFree(id
6d60: 2d 3e 70 61 74 68 54 6f 44 65 6c 29 3b 0a 20 20  ->pathToDel);.  
6d70: 7d 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28  }.  OpenCounter(
6d80: 2d 31 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  -1);.  return SQ
6d90: 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a  LITE_OK;.#endif.
6da0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 64 61  }../*.** Read da
6db0: 74 61 20 66 72 6f 6d 20 61 20 66 69 6c 65 20 69  ta from a file i
6dc0: 6e 74 6f 20 61 20 62 75 66 66 65 72 2e 20 20 52  nto a buffer.  R
6dd0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
6de0: 69 66 20 61 6c 6c 0a 2a 2a 20 62 79 74 65 73 20  if all.** bytes 
6df0: 77 65 72 65 20 72 65 61 64 20 73 75 63 63 65 73  were read succes
6e00: 73 66 75 6c 6c 79 20 61 6e 64 20 53 51 4c 49 54  sfully and SQLIT
6e10: 45 5f 49 4f 45 52 52 20 69 66 20 61 6e 79 74 68  E_IOERR if anyth
6e20: 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e  ing goes.** wron
6e30: 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  g..*/.int sqlite
6e40: 4f 73 52 65 61 64 28 4f 73 46 69 6c 65 20 2a 69  OsRead(OsFile *i
6e50: 64 2c 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 69  d, void *pBuf, i
6e60: 6e 74 20 61 6d 74 29 7b 0a 23 69 66 20 4f 53 5f  nt amt){.#if OS_
6e70: 55 4e 49 58 0a 20 20 69 6e 74 20 67 6f 74 3b 0a  UNIX.  int got;.
6e80: 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
6e90: 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 3b  r(SQLITE_IOERR);
6ea0: 0a 20 20 54 49 4d 45 52 5f 53 54 41 52 54 3b 0a  .  TIMER_START;.
6eb0: 20 20 67 6f 74 20 3d 20 72 65 61 64 28 69 64 2d    got = read(id-
6ec0: 3e 66 64 2c 20 70 42 75 66 2c 20 61 6d 74 29 3b  >fd, pBuf, amt);
6ed0: 0a 20 20 54 49 4d 45 52 5f 45 4e 44 3b 0a 20 20  .  TIMER_END;.  
6ee0: 54 52 41 43 45 34 28 22 52 45 41 44 20 20 20 20  TRACE4("READ    
6ef0: 25 2d 33 64 20 25 37 64 20 25 64 5c 6e 22 2c 20  %-3d %7d %d\n", 
6f00: 69 64 2d 3e 66 64 2c 20 6c 61 73 74 5f 70 61 67  id->fd, last_pag
6f10: 65 2c 20 65 6c 61 70 73 65 29 3b 0a 20 20 53 45  e, elapse);.  SE
6f20: 45 4b 28 30 29 3b 0a 20 20 2f 2a 20 69 66 28 20  EK(0);.  /* if( 
6f30: 67 6f 74 3c 30 20 29 20 67 6f 74 20 3d 20 30 3b  got<0 ) got = 0;
6f40: 20 2a 2f 0a 20 20 69 66 28 20 67 6f 74 3d 3d 61   */.  if( got==a
6f50: 6d 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  mt ){.    return
6f60: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
6f70: 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
6f80: 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20  SQLITE_IOERR;.  
6f90: 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f 53 5f  }.#endif.#if OS_
6fa0: 57 49 4e 0a 20 20 44 57 4f 52 44 20 67 6f 74 3b  WIN.  DWORD got;
6fb0: 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
6fc0: 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 29  or(SQLITE_IOERR)
6fd0: 3b 0a 20 20 54 52 41 43 45 32 28 22 52 45 41 44  ;.  TRACE2("READ
6fe0: 20 25 64 5c 6e 22 2c 20 6c 61 73 74 5f 70 61 67   %d\n", last_pag
6ff0: 65 29 3b 0a 20 20 69 66 28 20 21 52 65 61 64 46  e);.  if( !ReadF
7000: 69 6c 65 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c  ile(id->h, pBuf,
7010: 20 61 6d 74 2c 20 26 67 6f 74 2c 20 30 29 20 29   amt, &got, 0) )
7020: 7b 0a 20 20 20 20 67 6f 74 20 3d 20 30 3b 0a 20  {.    got = 0;. 
7030: 20 7d 0a 20 20 69 66 28 20 67 6f 74 3d 3d 28 44   }.  if( got==(D
7040: 57 4f 52 44 29 61 6d 74 20 29 7b 0a 20 20 20 20  WORD)amt ){.    
7050: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
7060: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
7070: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
7080: 52 52 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23  RR;.  }.#endif.#
7090: 69 66 20 4f 53 5f 4d 41 43 0a 20 20 69 6e 74 20  if OS_MAC.  int 
70a0: 67 6f 74 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49  got;.  SimulateI
70b0: 4f 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  OError(SQLITE_IO
70c0: 45 52 52 29 3b 0a 20 20 54 52 41 43 45 32 28 22  ERR);.  TRACE2("
70d0: 52 45 41 44 20 25 64 5c 6e 22 2c 20 6c 61 73 74  READ %d\n", last
70e0: 5f 70 61 67 65 29 3b 0a 23 20 69 66 64 65 66 20  _page);.# ifdef 
70f0: 5f 4c 41 52 47 45 5f 46 49 4c 45 0a 20 20 46 53  _LARGE_FILE.  FS
7100: 52 65 61 64 46 6f 72 6b 28 69 64 2d 3e 72 65 66  ReadFork(id->ref
7110: 4e 75 6d 2c 20 66 73 41 74 4d 61 72 6b 2c 20 30  Num, fsAtMark, 0
7120: 2c 20 28 42 79 74 65 43 6f 75 6e 74 29 61 6d 74  , (ByteCount)amt
7130: 2c 20 70 42 75 66 2c 20 28 42 79 74 65 43 6f 75  , pBuf, (ByteCou
7140: 6e 74 2a 29 26 67 6f 74 29 3b 0a 23 20 65 6c 73  nt*)&got);.# els
7150: 65 0a 20 20 67 6f 74 20 3d 20 61 6d 74 3b 0a 20  e.  got = amt;. 
7160: 20 46 53 52 65 61 64 28 69 64 2d 3e 72 65 66 4e   FSRead(id->refN
7170: 75 6d 2c 20 26 67 6f 74 2c 20 70 42 75 66 29 3b  um, &got, pBuf);
7180: 0a 23 20 65 6e 64 69 66 0a 20 20 69 66 28 20 67  .# endif.  if( g
7190: 6f 74 3d 3d 61 6d 74 20 29 7b 0a 20 20 20 20 72  ot==amt ){.    r
71a0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
71b0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
71c0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
71d0: 52 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a  R;.  }.#endif.}.
71e0: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 64 61 74  ./*.** Write dat
71f0: 61 20 66 72 6f 6d 20 61 20 62 75 66 66 65 72 20  a from a buffer 
7200: 69 6e 74 6f 20 61 20 66 69 6c 65 2e 20 20 52 65  into a file.  Re
7210: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
7220: 6e 20 73 75 63 63 65 73 73 0a 2a 2a 20 6f 72 20  n success.** or 
7230: 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72  some other error
7240: 20 63 6f 64 65 20 6f 6e 20 66 61 69 6c 75 72 65   code on failure
7250: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 4f  ..*/.int sqliteO
7260: 73 57 72 69 74 65 28 4f 73 46 69 6c 65 20 2a 69  sWrite(OsFile *i
7270: 64 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  d, const void *p
7280: 42 75 66 2c 20 69 6e 74 20 61 6d 74 29 7b 0a 23  Buf, int amt){.#
7290: 69 66 20 4f 53 5f 55 4e 49 58 0a 20 20 69 6e 74  if OS_UNIX.  int
72a0: 20 77 72 6f 74 65 20 3d 20 30 3b 0a 20 20 53 69   wrote = 0;.  Si
72b0: 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 53 51  mulateIOError(SQ
72c0: 4c 49 54 45 5f 49 4f 45 52 52 29 3b 0a 20 20 54  LITE_IOERR);.  T
72d0: 49 4d 45 52 5f 53 54 41 52 54 3b 0a 20 20 77 68  IMER_START;.  wh
72e0: 69 6c 65 28 20 61 6d 74 3e 30 20 26 26 20 28 77  ile( amt>0 && (w
72f0: 72 6f 74 65 20 3d 20 77 72 69 74 65 28 69 64 2d  rote = write(id-
7300: 3e 66 64 2c 20 70 42 75 66 2c 20 61 6d 74 29 29  >fd, pBuf, amt))
7310: 3e 30 20 29 7b 0a 20 20 20 20 61 6d 74 20 2d 3d  >0 ){.    amt -=
7320: 20 77 72 6f 74 65 3b 0a 20 20 20 20 70 42 75 66   wrote;.    pBuf
7330: 20 3d 20 26 28 28 63 68 61 72 2a 29 70 42 75 66   = &((char*)pBuf
7340: 29 5b 77 72 6f 74 65 5d 3b 0a 20 20 7d 0a 20 20  )[wrote];.  }.  
7350: 54 49 4d 45 52 5f 45 4e 44 3b 0a 20 20 54 52 41  TIMER_END;.  TRA
7360: 43 45 34 28 22 57 52 49 54 45 20 20 20 25 2d 33  CE4("WRITE   %-3
7370: 64 20 25 37 64 20 25 64 5c 6e 22 2c 20 69 64 2d  d %7d %d\n", id-
7380: 3e 66 64 2c 20 6c 61 73 74 5f 70 61 67 65 2c 20  >fd, last_page, 
7390: 65 6c 61 70 73 65 29 3b 0a 20 20 53 45 45 4b 28  elapse);.  SEEK(
73a0: 30 29 3b 0a 20 20 69 66 28 20 61 6d 74 3e 30 20  0);.  if( amt>0 
73b0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
73c0: 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 7d 0a 20  LITE_FULL;.  }. 
73d0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
73e0: 4b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f 53  K;.#endif.#if OS
73f0: 5f 57 49 4e 0a 20 20 69 6e 74 20 72 63 3b 0a 20  _WIN.  int rc;. 
7400: 20 44 57 4f 52 44 20 77 72 6f 74 65 3b 0a 20 20   DWORD wrote;.  
7410: 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
7420: 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 3b 0a 20  SQLITE_IOERR);. 
7430: 20 54 52 41 43 45 32 28 22 57 52 49 54 45 20 25   TRACE2("WRITE %
7440: 64 5c 6e 22 2c 20 6c 61 73 74 5f 70 61 67 65 29  d\n", last_page)
7450: 3b 0a 20 20 77 68 69 6c 65 28 20 61 6d 74 3e 30  ;.  while( amt>0
7460: 20 26 26 20 28 72 63 20 3d 20 57 72 69 74 65 46   && (rc = WriteF
7470: 69 6c 65 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c  ile(id->h, pBuf,
7480: 20 61 6d 74 2c 20 26 77 72 6f 74 65 2c 20 30 29   amt, &wrote, 0)
7490: 29 21 3d 30 20 26 26 20 77 72 6f 74 65 3e 30 20  )!=0 && wrote>0 
74a0: 29 7b 0a 20 20 20 20 61 6d 74 20 2d 3d 20 77 72  ){.    amt -= wr
74b0: 6f 74 65 3b 0a 20 20 20 20 70 42 75 66 20 3d 20  ote;.    pBuf = 
74c0: 26 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b 77  &((char*)pBuf)[w
74d0: 72 6f 74 65 5d 3b 0a 20 20 7d 0a 20 20 69 66 28  rote];.  }.  if(
74e0: 20 21 72 63 20 7c 7c 20 61 6d 74 3e 28 69 6e 74   !rc || amt>(int
74f0: 29 77 72 6f 74 65 20 29 7b 0a 20 20 20 20 72 65  )wrote ){.    re
7500: 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c  turn SQLITE_FULL
7510: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
7520: 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66  QLITE_OK;.#endif
7530: 0a 23 69 66 20 4f 53 5f 4d 41 43 0a 20 20 4f 53  .#if OS_MAC.  OS
7540: 45 72 72 20 6f 73 65 72 72 3b 0a 20 20 69 6e 74  Err oserr;.  int
7550: 20 77 72 6f 74 65 20 3d 20 30 3b 0a 20 20 53 69   wrote = 0;.  Si
7560: 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 53 51  mulateIOError(SQ
7570: 4c 49 54 45 5f 49 4f 45 52 52 29 3b 0a 20 20 54  LITE_IOERR);.  T
7580: 52 41 43 45 32 28 22 57 52 49 54 45 20 25 64 5c  RACE2("WRITE %d\
7590: 6e 22 2c 20 6c 61 73 74 5f 70 61 67 65 29 3b 0a  n", last_page);.
75a0: 20 20 77 68 69 6c 65 28 20 61 6d 74 3e 30 20 29    while( amt>0 )
75b0: 7b 0a 23 20 69 66 64 65 66 20 5f 4c 41 52 47 45  {.# ifdef _LARGE
75c0: 5f 46 49 4c 45 0a 20 20 20 20 6f 73 65 72 72 20  _FILE.    oserr 
75d0: 3d 20 46 53 57 72 69 74 65 46 6f 72 6b 28 69 64  = FSWriteFork(id
75e0: 2d 3e 72 65 66 4e 75 6d 2c 20 66 73 41 74 4d 61  ->refNum, fsAtMa
75f0: 72 6b 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  rk, 0,.         
7600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
7610: 42 79 74 65 43 6f 75 6e 74 29 61 6d 74 2c 20 70  ByteCount)amt, p
7620: 42 75 66 2c 20 28 42 79 74 65 43 6f 75 6e 74 2a  Buf, (ByteCount*
7630: 29 26 77 72 6f 74 65 29 3b 0a 23 20 65 6c 73 65  )&wrote);.# else
7640: 0a 20 20 20 20 77 72 6f 74 65 20 3d 20 61 6d 74  .    wrote = amt
7650: 3b 0a 20 20 20 20 6f 73 65 72 72 20 3d 20 46 53  ;.    oserr = FS
7660: 57 72 69 74 65 28 69 64 2d 3e 72 65 66 4e 75 6d  Write(id->refNum
7670: 2c 20 26 77 72 6f 74 65 2c 20 70 42 75 66 29 3b  , &wrote, pBuf);
7680: 0a 23 20 65 6e 64 69 66 0a 20 20 20 20 69 66 28  .# endif.    if(
7690: 20 77 72 6f 74 65 20 3d 3d 20 30 20 7c 7c 20 6f   wrote == 0 || o
76a0: 73 65 72 72 20 21 3d 20 6e 6f 45 72 72 29 0a 20  serr != noErr). 
76b0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
76c0: 61 6d 74 20 2d 3d 20 77 72 6f 74 65 3b 0a 20 20  amt -= wrote;.  
76d0: 20 20 70 42 75 66 20 3d 20 26 28 28 63 68 61 72    pBuf = &((char
76e0: 2a 29 70 42 75 66 29 5b 77 72 6f 74 65 5d 3b 0a  *)pBuf)[wrote];.
76f0: 20 20 7d 0a 20 20 69 66 28 20 6f 73 65 72 72 20    }.  if( oserr 
7700: 21 3d 20 6e 6f 45 72 72 20 7c 7c 20 61 6d 74 3e  != noErr || amt>
7710: 77 72 6f 74 65 20 29 7b 0a 20 20 20 20 72 65 74  wrote ){.    ret
7720: 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b  urn SQLITE_FULL;
7730: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
7740: 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a  LITE_OK;.#endif.
7750: 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  }../*.** Move th
7760: 65 20 72 65 61 64 2f 77 72 69 74 65 20 70 6f 69  e read/write poi
7770: 6e 74 65 72 20 69 6e 20 61 20 66 69 6c 65 2e 0a  nter in a file..
7780: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 4f 73 53  */.int sqliteOsS
7790: 65 65 6b 28 4f 73 46 69 6c 65 20 2a 69 64 2c 20  eek(OsFile *id, 
77a0: 6f 66 66 5f 74 20 6f 66 66 73 65 74 29 7b 0a 20  off_t offset){. 
77b0: 20 53 45 45 4b 28 6f 66 66 73 65 74 2f 31 30 32   SEEK(offset/102
77c0: 34 20 2b 20 31 29 3b 0a 23 69 66 20 4f 53 5f 55  4 + 1);.#if OS_U
77d0: 4e 49 58 0a 20 20 6c 73 65 65 6b 28 69 64 2d 3e  NIX.  lseek(id->
77e0: 66 64 2c 20 6f 66 66 73 65 74 2c 20 53 45 45 4b  fd, offset, SEEK
77f0: 5f 53 45 54 29 3b 0a 20 20 72 65 74 75 72 6e 20  _SET);.  return 
7800: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69  SQLITE_OK;.#endi
7810: 66 0a 23 69 66 20 4f 53 5f 57 49 4e 0a 20 20 7b  f.#if OS_WIN.  {
7820: 0a 20 20 20 20 4c 4f 4e 47 20 75 70 70 65 72 42  .    LONG upperB
7830: 69 74 73 20 3d 20 6f 66 66 73 65 74 3e 3e 33 32  its = offset>>32
7840: 3b 0a 20 20 20 20 4c 4f 4e 47 20 6c 6f 77 65 72  ;.    LONG lower
7850: 42 69 74 73 20 3d 20 6f 66 66 73 65 74 20 26 20  Bits = offset & 
7860: 30 78 66 66 66 66 66 66 66 66 3b 0a 20 20 20 20  0xffffffff;.    
7870: 44 57 4f 52 44 20 72 63 3b 0a 20 20 20 20 72 63  DWORD rc;.    rc
7880: 20 3d 20 53 65 74 46 69 6c 65 50 6f 69 6e 74 65   = SetFilePointe
7890: 72 28 69 64 2d 3e 68 2c 20 6c 6f 77 65 72 42 69  r(id->h, lowerBi
78a0: 74 73 2c 20 26 75 70 70 65 72 42 69 74 73 2c 20  ts, &upperBits, 
78b0: 46 49 4c 45 5f 42 45 47 49 4e 29 3b 0a 20 20 20  FILE_BEGIN);.   
78c0: 20 2f 2a 20 54 52 41 43 45 33 28 22 53 45 45 4b   /* TRACE3("SEEK
78d0: 20 72 63 3d 30 78 25 78 20 75 70 70 65 72 3d 30   rc=0x%x upper=0
78e0: 78 25 78 5c 6e 22 2c 20 72 63 2c 20 75 70 70 65  x%x\n", rc, uppe
78f0: 72 42 69 74 73 29 3b 20 2a 2f 0a 20 20 7d 0a 20  rBits); */.  }. 
7900: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
7910: 4b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f 53  K;.#endif.#if OS
7920: 5f 4d 41 43 0a 20 20 7b 0a 20 20 20 20 6f 66 66  _MAC.  {.    off
7930: 5f 74 20 63 75 72 53 69 7a 65 3b 0a 20 20 20 20  _t curSize;.    
7940: 69 66 28 20 73 71 6c 69 74 65 4f 73 46 69 6c 65  if( sqliteOsFile
7950: 53 69 7a 65 28 69 64 2c 20 26 63 75 72 53 69 7a  Size(id, &curSiz
7960: 65 29 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 20  e) != SQLITE_OK 
7970: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
7980: 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20  SQLITE_IOERR;.  
7990: 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 66 66 73    }.    if( offs
79a0: 65 74 20 3e 3d 20 63 75 72 53 69 7a 65 20 29 7b  et >= curSize ){
79b0: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
79c0: 65 4f 73 54 72 75 6e 63 61 74 65 28 69 64 2c 20  eOsTruncate(id, 
79d0: 6f 66 66 73 65 74 2b 31 29 20 21 3d 20 53 51 4c  offset+1) != SQL
79e0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
79f0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
7a00: 49 4f 45 52 52 3b 0a 20 20 20 20 20 20 7d 0a 20  IOERR;.      }. 
7a10: 20 20 20 7d 0a 23 20 69 66 64 65 66 20 5f 4c 41     }.# ifdef _LA
7a20: 52 47 45 5f 46 49 4c 45 0a 20 20 20 20 69 66 28  RGE_FILE.    if(
7a30: 20 46 53 53 65 74 46 6f 72 6b 50 6f 73 69 74 69   FSSetForkPositi
7a40: 6f 6e 28 69 64 2d 3e 72 65 66 4e 75 6d 2c 20 66  on(id->refNum, f
7a50: 73 46 72 6f 6d 53 74 61 72 74 2c 20 6f 66 66 73  sFromStart, offs
7a60: 65 74 29 20 21 3d 20 6e 6f 45 72 72 20 29 7b 0a  et) != noErr ){.
7a70: 23 20 65 6c 73 65 0a 20 20 20 20 69 66 28 20 53  # else.    if( S
7a80: 65 74 46 50 6f 73 28 69 64 2d 3e 72 65 66 4e 75  etFPos(id->refNu
7a90: 6d 2c 20 66 73 46 72 6f 6d 53 74 61 72 74 2c 20  m, fsFromStart, 
7aa0: 6f 66 66 73 65 74 29 20 21 3d 20 6e 6f 45 72 72  offset) != noErr
7ab0: 20 29 7b 0a 23 20 65 6e 64 69 66 0a 20 20 20 20   ){.# endif.    
7ac0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
7ad0: 49 4f 45 52 52 3b 0a 20 20 20 20 7d 65 6c 73 65  IOERR;.    }else
7ae0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
7af0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
7b00: 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a    }.#endif.}../*
7b10: 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 6c  .** Make sure al
7b20: 6c 20 77 72 69 74 65 73 20 74 6f 20 61 20 70 61  l writes to a pa
7b30: 72 74 69 63 75 6c 61 72 20 66 69 6c 65 20 61 72  rticular file ar
7b40: 65 20 63 6f 6d 6d 69 74 74 65 64 20 74 6f 20 64  e committed to d
7b50: 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 55 6e 64 65 72  isk..**.** Under
7b60: 20 55 6e 69 78 2c 20 61 6c 73 6f 20 6d 61 6b 65   Unix, also make
7b70: 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20 64   sure that the d
7b80: 69 72 65 63 74 6f 72 79 20 65 6e 74 72 79 20 66  irectory entry f
7b90: 6f 72 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 68  or the file.** h
7ba0: 61 73 20 62 65 65 6e 20 63 72 65 61 74 65 64 20  as been created 
7bb0: 62 79 20 66 73 79 6e 63 2d 69 6e 67 20 74 68 65  by fsync-ing the
7bc0: 20 64 69 72 65 63 74 6f 72 79 20 74 68 61 74 20   directory that 
7bd0: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 66 69 6c  contains the fil
7be0: 65 2e 0a 2a 2a 20 49 66 20 77 65 20 64 6f 20 6e  e..** If we do n
7bf0: 6f 74 20 64 6f 20 74 68 69 73 20 61 6e 64 20 77  ot do this and w
7c00: 65 20 65 6e 63 6f 75 6e 74 65 72 20 61 20 70 6f  e encounter a po
7c10: 77 65 72 20 66 61 69 6c 75 72 65 2c 20 74 68 65  wer failure, the
7c20: 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20 65 6e   directory.** en
7c30: 74 72 79 20 66 6f 72 20 74 68 65 20 6a 6f 75 72  try for the jour
7c40: 6e 61 6c 20 6d 69 67 68 74 20 6e 6f 74 20 65 78  nal might not ex
7c50: 69 73 74 20 61 66 74 65 72 20 77 65 20 72 65 62  ist after we reb
7c60: 6f 6f 74 2e 20 20 54 68 65 20 6e 65 78 74 0a 2a  oot.  The next.*
7c70: 2a 20 53 51 4c 69 74 65 20 74 6f 20 61 63 63 65  * SQLite to acce
7c80: 73 73 20 74 68 65 20 66 69 6c 65 20 77 69 6c 6c  ss the file will
7c90: 20 6e 6f 74 20 6b 6e 6f 77 20 74 68 61 74 20 74   not know that t
7ca0: 68 65 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74  he journal exist
7cb0: 73 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 74 68  s (because.** th
7cc0: 65 20 64 69 72 65 63 74 6f 72 79 20 65 6e 74 72  e directory entr
7cd0: 79 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61  y for the journa
7ce0: 6c 20 77 61 73 20 6e 65 76 65 72 20 63 72 65 61  l was never crea
7cf0: 74 65 64 29 20 61 6e 64 20 74 68 65 20 74 72 61  ted) and the tra
7d00: 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 77 69 6c 6c  nsaction.** will
7d10: 20 6e 6f 74 20 72 6f 6c 6c 20 62 61 63 6b 20 2d   not roll back -
7d20: 20 70 6f 73 73 69 62 6c 79 20 6c 65 61 64 69 6e   possibly leadin
7d30: 67 20 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f  g to database co
7d40: 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74  rruption..*/.int
7d50: 20 73 71 6c 69 74 65 4f 73 53 79 6e 63 28 4f 73   sqliteOsSync(Os
7d60: 46 69 6c 65 20 2a 69 64 29 7b 0a 23 69 66 20 4f  File *id){.#if O
7d70: 53 5f 55 4e 49 58 0a 20 20 53 69 6d 75 6c 61 74  S_UNIX.  Simulat
7d80: 65 49 4f 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  eIOError(SQLITE_
7d90: 49 4f 45 52 52 29 3b 0a 20 20 54 52 41 43 45 32  IOERR);.  TRACE2
7da0: 28 22 53 59 4e 43 20 20 20 20 25 2d 33 64 5c 6e  ("SYNC    %-3d\n
7db0: 22 2c 20 69 64 2d 3e 66 64 29 3b 0a 20 20 69 66  ", id->fd);.  if
7dc0: 28 20 66 73 79 6e 63 28 69 64 2d 3e 66 64 29 20  ( fsync(id->fd) 
7dd0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
7de0: 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 7d 65  LITE_IOERR;.  }e
7df0: 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 69 64 2d  lse{.    if( id-
7e00: 3e 64 69 72 66 64 3e 3d 30 20 29 7b 0a 20 20 20  >dirfd>=0 ){.   
7e10: 20 20 20 54 52 41 43 45 32 28 22 44 49 52 53 59     TRACE2("DIRSY
7e20: 4e 43 20 25 2d 33 64 5c 6e 22 2c 20 69 64 2d 3e  NC %-3d\n", id->
7e30: 64 69 72 66 64 29 3b 0a 20 20 20 20 20 20 66 73  dirfd);.      fs
7e40: 79 6e 63 28 69 64 2d 3e 64 69 72 66 64 29 3b 0a  ync(id->dirfd);.
7e50: 20 20 20 20 20 20 63 6c 6f 73 65 28 69 64 2d 3e        close(id->
7e60: 64 69 72 66 64 29 3b 20 20 2f 2a 20 4f 6e 6c 79  dirfd);  /* Only
7e70: 20 6e 65 65 64 20 74 6f 20 73 79 6e 63 20 6f 6e   need to sync on
7e80: 63 65 2c 20 73 6f 20 63 6c 6f 73 65 20 74 68 65  ce, so close the
7e90: 20 64 69 72 65 63 74 6f 72 79 20 2a 2f 0a 20 20   directory */.  
7ea0: 20 20 20 20 69 64 2d 3e 64 69 72 66 64 20 3d 20      id->dirfd = 
7eb0: 2d 31 3b 20 20 20 20 2f 2a 20 77 68 65 6e 20 77  -1;    /* when w
7ec0: 65 20 61 72 65 20 64 6f 6e 65 2e 20 2a 2f 0a 20  e are done. */. 
7ed0: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
7ee0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 23  SQLITE_OK;.  }.#
7ef0: 65 6e 64 69 66 0a 23 69 66 20 4f 53 5f 57 49 4e  endif.#if OS_WIN
7f00: 0a 20 20 69 66 28 20 46 6c 75 73 68 46 69 6c 65  .  if( FlushFile
7f10: 42 75 66 66 65 72 73 28 69 64 2d 3e 68 29 20 29  Buffers(id->h) )
7f20: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
7f30: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b  ITE_OK;.  }else{
7f40: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
7f50: 54 45 5f 49 4f 45 52 52 3b 0a 20 20 7d 0a 23 65  TE_IOERR;.  }.#e
7f60: 6e 64 69 66 0a 23 69 66 20 4f 53 5f 4d 41 43 0a  ndif.#if OS_MAC.
7f70: 23 20 69 66 64 65 66 20 5f 4c 41 52 47 45 5f 46  # ifdef _LARGE_F
7f80: 49 4c 45 0a 20 20 69 66 28 20 46 53 46 6c 75 73  ILE.  if( FSFlus
7f90: 68 46 6f 72 6b 28 69 64 2d 3e 72 65 66 4e 75 6d  hFork(id->refNum
7fa0: 29 20 21 3d 20 6e 6f 45 72 72 20 29 7b 0a 23 20  ) != noErr ){.# 
7fb0: 65 6c 73 65 0a 20 20 50 61 72 61 6d 42 6c 6f 63  else.  ParamBloc
7fc0: 6b 52 65 63 20 70 61 72 61 6d 73 3b 0a 20 20 6d  kRec params;.  m
7fd0: 65 6d 73 65 74 28 26 70 61 72 61 6d 73 2c 20 30  emset(&params, 0
7fe0: 2c 20 73 69 7a 65 6f 66 28 50 61 72 61 6d 42 6c  , sizeof(ParamBl
7ff0: 6f 63 6b 52 65 63 29 29 3b 0a 20 20 70 61 72 61  ockRec));.  para
8000: 6d 73 2e 69 6f 50 61 72 61 6d 2e 69 6f 52 65 66  ms.ioParam.ioRef
8010: 4e 75 6d 20 3d 20 69 64 2d 3e 72 65 66 4e 75 6d  Num = id->refNum
8020: 3b 0a 20 20 69 66 28 20 50 42 46 6c 75 73 68 46  ;.  if( PBFlushF
8030: 69 6c 65 53 79 6e 63 28 26 70 61 72 61 6d 73 29  ileSync(&params)
8040: 20 21 3d 20 6e 6f 45 72 72 20 29 7b 0a 23 20 65   != noErr ){.# e
8050: 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20  ndif.    return 
8060: 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20  SQLITE_IOERR;.  
8070: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
8080: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
8090: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
80a0: 20 54 72 75 6e 63 61 74 65 20 61 6e 20 6f 70 65   Truncate an ope
80b0: 6e 20 66 69 6c 65 20 74 6f 20 61 20 73 70 65 63  n file to a spec
80c0: 69 66 69 65 64 20 73 69 7a 65 0a 2a 2f 0a 69 6e  ified size.*/.in
80d0: 74 20 73 71 6c 69 74 65 4f 73 54 72 75 6e 63 61  t sqliteOsTrunca
80e0: 74 65 28 4f 73 46 69 6c 65 20 2a 69 64 2c 20 6f  te(OsFile *id, o
80f0: 66 66 5f 74 20 6e 42 79 74 65 29 7b 0a 20 20 53  ff_t nByte){.  S
8100: 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 53  imulateIOError(S
8110: 51 4c 49 54 45 5f 49 4f 45 52 52 29 3b 0a 23 69  QLITE_IOERR);.#i
8120: 66 20 4f 53 5f 55 4e 49 58 0a 20 20 72 65 74 75  f OS_UNIX.  retu
8130: 72 6e 20 66 74 72 75 6e 63 61 74 65 28 69 64 2d  rn ftruncate(id-
8140: 3e 66 64 2c 20 6e 42 79 74 65 29 3d 3d 30 20 3f  >fd, nByte)==0 ?
8150: 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c   SQLITE_OK : SQL
8160: 49 54 45 5f 49 4f 45 52 52 3b 0a 23 65 6e 64 69  ITE_IOERR;.#endi
8170: 66 0a 23 69 66 20 4f 53 5f 57 49 4e 0a 20 20 7b  f.#if OS_WIN.  {
8180: 0a 20 20 20 20 4c 4f 4e 47 20 75 70 70 65 72 42  .    LONG upperB
8190: 69 74 73 20 3d 20 6e 42 79 74 65 3e 3e 33 32 3b  its = nByte>>32;
81a0: 0a 20 20 20 20 53 65 74 46 69 6c 65 50 6f 69 6e  .    SetFilePoin
81b0: 74 65 72 28 69 64 2d 3e 68 2c 20 6e 42 79 74 65  ter(id->h, nByte
81c0: 2c 20 26 75 70 70 65 72 42 69 74 73 2c 20 46 49  , &upperBits, FI
81d0: 4c 45 5f 42 45 47 49 4e 29 3b 0a 20 20 20 20 53  LE_BEGIN);.    S
81e0: 65 74 45 6e 64 4f 66 46 69 6c 65 28 69 64 2d 3e  etEndOfFile(id->
81f0: 68 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  h);.  }.  return
8200: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64   SQLITE_OK;.#end
8210: 69 66 0a 23 69 66 20 4f 53 5f 4d 41 43 0a 23 20  if.#if OS_MAC.# 
8220: 69 66 64 65 66 20 5f 4c 41 52 47 45 5f 46 49 4c  ifdef _LARGE_FIL
8230: 45 0a 20 20 69 66 28 20 46 53 53 65 74 46 6f 72  E.  if( FSSetFor
8240: 6b 53 69 7a 65 28 69 64 2d 3e 72 65 66 4e 75 6d  kSize(id->refNum
8250: 2c 20 66 73 46 72 6f 6d 53 74 61 72 74 2c 20 6e  , fsFromStart, n
8260: 42 79 74 65 29 20 21 3d 20 6e 6f 45 72 72 29 7b  Byte) != noErr){
8270: 0a 23 20 65 6c 73 65 0a 20 20 69 66 28 20 53 65  .# else.  if( Se
8280: 74 45 4f 46 28 69 64 2d 3e 72 65 66 4e 75 6d 2c  tEOF(id->refNum,
8290: 20 6e 42 79 74 65 29 20 21 3d 20 6e 6f 45 72 72   nByte) != noErr
82a0: 20 29 7b 0a 23 20 65 6e 64 69 66 0a 20 20 20 20   ){.# endif.    
82b0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
82c0: 45 52 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ERR;.  }else{.  
82d0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
82e0: 4f 4b 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d  OK;.  }.#endif.}
82f0: 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e  ../*.** Determin
8300: 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69  e the current si
8310: 7a 65 20 6f 66 20 61 20 66 69 6c 65 20 69 6e 20  ze of a file in 
8320: 62 79 74 65 73 0a 2a 2f 0a 69 6e 74 20 73 71 6c  bytes.*/.int sql
8330: 69 74 65 4f 73 46 69 6c 65 53 69 7a 65 28 4f 73  iteOsFileSize(Os
8340: 46 69 6c 65 20 2a 69 64 2c 20 6f 66 66 5f 74 20  File *id, off_t 
8350: 2a 70 53 69 7a 65 29 7b 0a 23 69 66 20 4f 53 5f  *pSize){.#if OS_
8360: 55 4e 49 58 0a 20 20 73 74 72 75 63 74 20 73 74  UNIX.  struct st
8370: 61 74 20 62 75 66 3b 0a 20 20 53 69 6d 75 6c 61  at buf;.  Simula
8380: 74 65 49 4f 45 72 72 6f 72 28 53 51 4c 49 54 45  teIOError(SQLITE
8390: 5f 49 4f 45 52 52 29 3b 0a 20 20 69 66 28 20 66  _IOERR);.  if( f
83a0: 73 74 61 74 28 69 64 2d 3e 66 64 2c 20 26 62 75  stat(id->fd, &bu
83b0: 66 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  f)!=0 ){.    ret
83c0: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
83d0: 3b 0a 20 20 7d 0a 20 20 2a 70 53 69 7a 65 20 3d  ;.  }.  *pSize =
83e0: 20 62 75 66 2e 73 74 5f 73 69 7a 65 3b 0a 20 20   buf.st_size;.  
83f0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
8400: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f 53 5f  ;.#endif.#if OS_
8410: 57 49 4e 0a 20 20 44 57 4f 52 44 20 75 70 70 65  WIN.  DWORD uppe
8420: 72 42 69 74 73 2c 20 6c 6f 77 65 72 42 69 74 73  rBits, lowerBits
8430: 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
8440: 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
8450: 29 3b 0a 20 20 6c 6f 77 65 72 42 69 74 73 20 3d  );.  lowerBits =
8460: 20 47 65 74 46 69 6c 65 53 69 7a 65 28 69 64 2d   GetFileSize(id-
8470: 3e 68 2c 20 26 75 70 70 65 72 42 69 74 73 29 3b  >h, &upperBits);
8480: 0a 20 20 2a 70 53 69 7a 65 20 3d 20 28 28 28 6f  .  *pSize = (((o
8490: 66 66 5f 74 29 75 70 70 65 72 42 69 74 73 29 3c  ff_t)upperBits)<
84a0: 3c 33 32 29 20 2b 20 6c 6f 77 65 72 42 69 74 73  <32) + lowerBits
84b0: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
84c0: 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 23 69 66  E_OK;.#endif.#if
84d0: 20 4f 53 5f 4d 41 43 0a 23 20 69 66 64 65 66 20   OS_MAC.# ifdef 
84e0: 5f 4c 41 52 47 45 5f 46 49 4c 45 0a 20 20 69 66  _LARGE_FILE.  if
84f0: 28 20 46 53 47 65 74 46 6f 72 6b 53 69 7a 65 28  ( FSGetForkSize(
8500: 69 64 2d 3e 72 65 66 4e 75 6d 2c 20 70 53 69 7a  id->refNum, pSiz
8510: 65 29 20 21 3d 20 6e 6f 45 72 72 29 7b 0a 23 20  e) != noErr){.# 
8520: 65 6c 73 65 0a 20 20 69 66 28 20 47 65 74 45 4f  else.  if( GetEO
8530: 46 28 69 64 2d 3e 72 65 66 4e 75 6d 2c 20 70 53  F(id->refNum, pS
8540: 69 7a 65 29 20 21 3d 20 6e 6f 45 72 72 20 29 7b  ize) != noErr ){
8550: 0a 23 20 65 6e 64 69 66 0a 20 20 20 20 72 65 74  .# endif.    ret
8560: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
8570: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
8580: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
8590: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23  .  }.#endif.}..#
85a0: 69 66 20 4f 53 5f 57 49 4e 0a 2f 2a 0a 2a 2a 20  if OS_WIN./*.** 
85b0: 52 65 74 75 72 6e 20 74 72 75 65 20 28 6e 6f 6e  Return true (non
85c0: 2d 7a 65 72 6f 29 20 69 66 20 77 65 20 61 72 65  -zero) if we are
85d0: 20 72 75 6e 6e 69 6e 67 20 75 6e 64 65 72 20 57   running under W
85e0: 69 6e 4e 54 2c 20 57 69 6e 32 4b 20 6f 72 20 57  inNT, Win2K or W
85f0: 69 6e 58 50 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  inXP..** Return 
8600: 66 61 6c 73 65 20 28 7a 65 72 6f 29 20 66 6f 72  false (zero) for
8610: 20 57 69 6e 39 35 2c 20 57 69 6e 39 38 2c 20 6f   Win95, Win98, o
8620: 72 20 57 69 6e 4d 45 2e 0a 2a 2a 0a 2a 2a 20 48  r WinME..**.** H
8630: 65 72 65 20 69 73 20 61 6e 20 69 6e 74 65 72 65  ere is an intere
8640: 73 74 69 6e 67 20 6f 62 73 65 72 76 61 74 69 6f  sting observatio
8650: 6e 3a 20 20 57 69 6e 39 35 2c 20 57 69 6e 39 38  n:  Win95, Win98
8660: 2c 20 61 6e 64 20 57 69 6e 4d 45 20 6c 61 63 6b  , and WinME lack
8670: 0a 2a 2a 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65  .** the LockFile
8680: 45 78 28 29 20 41 50 49 2e 20 20 42 75 74 20 77  Ex() API.  But w
8690: 65 20 63 61 6e 20 73 74 69 6c 6c 20 73 74 61 74  e can still stat
86a0: 69 63 61 6c 6c 79 20 6c 69 6e 6b 20 61 67 61 69  ically link agai
86b0: 6e 73 74 20 74 68 61 74 0a 2a 2a 20 41 50 49 20  nst that.** API 
86c0: 61 73 20 6c 6f 6e 67 20 61 73 20 77 65 20 64 6f  as long as we do
86d0: 6e 27 74 20 63 61 6c 6c 20 69 74 20 77 69 6e 20  n't call it win 
86e0: 72 75 6e 6e 69 6e 67 20 57 69 6e 39 35 2f 39 38  running Win95/98
86f0: 2f 4d 45 2e 20 20 41 20 63 61 6c 6c 20 74 6f 0a  /ME.  A call to.
8700: 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
8710: 69 73 20 75 73 65 64 20 74 6f 20 64 65 74 65 72  is used to deter
8720: 6d 69 6e 65 20 69 66 20 74 68 65 20 68 6f 73 74  mine if the host
8730: 20 69 73 20 57 69 6e 39 35 2f 39 38 2f 4d 45 20   is Win95/98/ME 
8740: 6f 72 0a 2a 2a 20 57 69 6e 4e 54 2f 32 4b 2f 58  or.** WinNT/2K/X
8750: 50 20 73 6f 20 74 68 61 74 20 77 65 20 77 69 6c  P so that we wil
8760: 6c 20 6b 6e 6f 77 20 77 68 65 74 68 65 72 20 6f  l know whether o
8770: 72 20 6e 6f 74 20 77 65 20 63 61 6e 20 73 61 66  r not we can saf
8780: 65 6c 79 20 63 61 6c 6c 0a 2a 2a 20 74 68 65 20  ely call.** the 
8790: 4c 6f 63 6b 46 69 6c 65 45 78 28 29 20 41 50 49  LockFileEx() API
87a0: 2e 0a 2a 2f 0a 69 6e 74 20 69 73 4e 54 28 76 6f  ..*/.int isNT(vo
87b0: 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20 69 6e  id){.  static in
87c0: 74 20 6f 73 54 79 70 65 20 3d 20 30 3b 20 20 20  t osType = 0;   
87d0: 2f 2a 20 30 3d 75 6e 6b 6e 6f 77 6e 20 31 3d 77  /* 0=unknown 1=w
87e0: 69 6e 39 35 20 32 3d 77 69 6e 4e 54 20 2a 2f 0a  in95 2=winNT */.
87f0: 20 20 69 66 28 20 6f 73 54 79 70 65 3d 3d 30 20    if( osType==0 
8800: 29 7b 0a 20 20 20 20 4f 53 56 45 52 53 49 4f 4e  ){.    OSVERSION
8810: 49 4e 46 4f 20 73 49 6e 66 6f 3b 0a 20 20 20 20  INFO sInfo;.    
8820: 73 49 6e 66 6f 2e 64 77 4f 53 56 65 72 73 69 6f  sInfo.dwOSVersio
8830: 6e 49 6e 66 6f 53 69 7a 65 20 3d 20 73 69 7a 65  nInfoSize = size
8840: 6f 66 28 73 49 6e 66 6f 29 3b 0a 20 20 20 20 47  of(sInfo);.    G
8850: 65 74 56 65 72 73 69 6f 6e 45 78 28 26 73 49 6e  etVersionEx(&sIn
8860: 66 6f 29 3b 0a 20 20 20 20 6f 73 54 79 70 65 20  fo);.    osType 
8870: 3d 20 73 49 6e 66 6f 2e 64 77 50 6c 61 74 66 6f  = sInfo.dwPlatfo
8880: 72 6d 49 64 3d 3d 56 45 52 5f 50 4c 41 54 46 4f  rmId==VER_PLATFO
8890: 52 4d 5f 57 49 4e 33 32 5f 4e 54 20 3f 20 32 20  RM_WIN32_NT ? 2 
88a0: 3a 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  : 1;.  }.  retur
88b0: 6e 20 6f 73 54 79 70 65 3d 3d 32 3b 0a 7d 0a 23  n osType==2;.}.#
88c0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 69 6e  endif../*.** Win
88d0: 64 6f 77 73 20 66 69 6c 65 20 6c 6f 63 6b 69 6e  dows file lockin
88e0: 67 20 6e 6f 74 65 73 3a 20 20 5b 73 69 6d 69 6c  g notes:  [simil
88f0: 61 72 20 69 73 73 75 65 73 20 61 70 70 6c 79 20  ar issues apply 
8900: 74 6f 20 4d 61 63 4f 53 5d 0a 2a 2a 0a 2a 2a 20  to MacOS].**.** 
8910: 57 65 20 63 61 6e 6e 6f 74 20 75 73 65 20 4c 6f  We cannot use Lo
8920: 63 6b 46 69 6c 65 45 78 28 29 20 6f 72 20 55 6e  ckFileEx() or Un
8930: 6c 6f 63 6b 46 69 6c 65 45 78 28 29 20 6f 6e 20  lockFileEx() on 
8940: 57 69 6e 39 35 2f 39 38 2f 4d 45 20 62 65 63 61  Win95/98/ME beca
8950: 75 73 65 0a 2a 2a 20 74 68 6f 73 65 20 66 75 6e  use.** those fun
8960: 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20 61  ctions are not a
8970: 76 61 69 6c 61 62 6c 65 2e 20 20 53 6f 20 77 65  vailable.  So we
8980: 20 75 73 65 20 6f 6e 6c 79 20 4c 6f 63 6b 46 69   use only LockFi
8990: 6c 65 28 29 20 61 6e 64 0a 2a 2a 20 55 6e 6c 6f  le() and.** Unlo
89a0: 63 6b 46 69 6c 65 28 29 2e 0a 2a 2a 0a 2a 2a 20  ckFile()..**.** 
89b0: 4c 6f 63 6b 46 69 6c 65 28 29 20 70 72 65 76 65  LockFile() preve
89c0: 6e 74 73 20 6e 6f 74 20 6a 75 73 74 20 77 72 69  nts not just wri
89d0: 74 69 6e 67 20 62 75 74 20 61 6c 73 6f 20 72 65  ting but also re
89e0: 61 64 69 6e 67 20 62 79 20 6f 74 68 65 72 20 70  ading by other p
89f0: 72 6f 63 65 73 73 65 73 2e 0a 2a 2a 20 28 54 68  rocesses..** (Th
8a00: 69 73 20 69 73 20 61 20 64 65 73 69 67 6e 20 65  is is a design e
8a10: 72 72 6f 72 20 6f 6e 20 74 68 65 20 70 61 72 74  rror on the part
8a20: 20 6f 66 20 57 69 6e 64 6f 77 73 2c 20 62 75 74   of Windows, but
8a30: 20 74 68 65 72 65 20 69 73 20 6e 6f 74 68 69 6e   there is nothin
8a40: 67 0a 2a 2a 20 77 65 20 63 61 6e 20 64 6f 20 61  g.** we can do a
8a50: 62 6f 75 74 20 74 68 61 74 2e 29 20 20 53 6f 20  bout that.)  So 
8a60: 74 68 65 20 72 65 67 69 6f 6e 20 75 73 65 64 20  the region used 
8a70: 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 69 73 20 61  for locking is a
8a80: 74 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20  t the.** end of 
8a90: 74 68 65 20 66 69 6c 65 20 77 68 65 72 65 20 69  the file where i
8aa0: 74 20 69 73 20 75 6e 6c 69 6b 65 6c 79 20 74 6f  t is unlikely to
8ab0: 20 65 76 65 72 20 69 6e 74 65 72 66 65 72 65 20   ever interfere 
8ac0: 77 69 74 68 20 61 6e 0a 2a 2a 20 61 63 74 75 61  with an.** actua
8ad0: 6c 20 72 65 61 64 20 61 74 74 65 6d 70 74 2e 0a  l read attempt..
8ae0: 2a 2a 0a 2a 2a 20 41 20 64 61 74 61 62 61 73 65  **.** A database
8af0: 20 72 65 61 64 20 6c 6f 63 6b 20 69 73 20 6f 62   read lock is ob
8b00: 74 61 69 6e 65 64 20 62 79 20 6c 6f 63 6b 69 6e  tained by lockin
8b10: 67 20 61 20 73 69 6e 67 6c 65 20 72 61 6e 64 6f  g a single rando
8b20: 6d 6c 79 2d 63 68 6f 73 65 6e 20 0a 2a 2a 20 62  mly-chosen .** b
8b30: 79 74 65 20 6f 75 74 20 6f 66 20 61 20 73 70 65  yte out of a spe
8b40: 63 69 66 69 63 20 72 61 6e 67 65 20 6f 66 20 62  cific range of b
8b50: 79 74 65 73 2e 20 54 68 65 20 6c 6f 63 6b 20 62  ytes. The lock b
8b60: 79 74 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20  yte is obtained 
8b70: 61 74 20 0a 2a 2a 20 72 61 6e 64 6f 6d 20 73 6f  at .** random so
8b80: 20 74 77 6f 20 73 65 70 61 72 61 74 65 20 72 65   two separate re
8b90: 61 64 65 72 73 20 63 61 6e 20 70 72 6f 62 61 62  aders can probab
8ba0: 6c 79 20 61 63 63 65 73 73 20 74 68 65 20 66 69  ly access the fi
8bb0: 6c 65 20 61 74 20 74 68 65 20 0a 2a 2a 20 73 61  le at the .** sa
8bc0: 6d 65 20 74 69 6d 65 2c 20 75 6e 6c 65 73 73 20  me time, unless 
8bd0: 74 68 65 79 20 61 72 65 20 75 6e 6c 75 63 6b 79  they are unlucky
8be0: 20 61 6e 64 20 63 68 6f 6f 73 65 20 74 68 65 20   and choose the 
8bf0: 73 61 6d 65 20 6c 6f 63 6b 20 62 79 74 65 2e 0a  same lock byte..
8c00: 2a 2a 20 41 20 64 61 74 61 62 61 73 65 20 77 72  ** A database wr
8c10: 69 74 65 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61  ite lock is obta
8c20: 69 6e 65 64 20 62 79 20 6c 6f 63 6b 69 6e 67 20  ined by locking 
8c30: 61 6c 6c 20 62 79 74 65 73 20 69 6e 20 74 68 65  all bytes in the
8c40: 20 72 61 6e 67 65 2e 0a 2a 2a 20 54 68 65 72 65   range..** There
8c50: 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 6f 6e 65   can only be one
8c60: 20 77 72 69 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 41   writer..**.** A
8c70: 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65   lock is obtaine
8c80: 64 20 6f 6e 20 74 68 65 20 66 69 72 73 74 20 62  d on the first b
8c90: 79 74 65 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20  yte of the lock 
8ca0: 72 61 6e 67 65 20 62 65 66 6f 72 65 20 61 63 71  range before acq
8cb0: 75 69 72 69 6e 67 0a 2a 2a 20 65 69 74 68 65 72  uiring.** either
8cc0: 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f 72 20   a read lock or 
8cd0: 61 20 77 72 69 74 65 20 6c 6f 63 6b 2e 20 20 54  a write lock.  T
8ce0: 68 69 73 20 70 72 65 76 65 6e 74 73 20 74 77 6f  his prevents two
8cf0: 20 70 72 6f 63 65 73 73 65 73 20 66 72 6f 6d 0a   processes from.
8d00: 2a 2a 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f  ** attempting to
8d10: 20 67 65 74 20 61 20 6c 6f 63 6b 20 61 74 20 61   get a lock at a
8d20: 20 73 61 6d 65 20 74 69 6d 65 2e 20 20 54 68 65   same time.  The
8d30: 20 73 65 6d 61 6e 74 69 63 73 20 6f 66 20 0a 2a   semantics of .*
8d40: 2a 20 73 71 6c 69 74 65 4f 73 52 65 61 64 4c 6f  * sqliteOsReadLo
8d50: 63 6b 28 29 20 72 65 71 75 69 72 65 20 74 68 61  ck() require tha
8d60: 74 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6c  t if there is al
8d70: 72 65 61 64 79 20 61 20 77 72 69 74 65 20 6c 6f  ready a write lo
8d80: 63 6b 2c 20 74 68 61 74 0a 2a 2a 20 6c 6f 63 6b  ck, that.** lock
8d90: 20 69 73 20 63 6f 6e 76 65 72 74 65 64 20 69 6e   is converted in
8da0: 74 6f 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 61  to a read lock a
8db0: 74 6f 6d 69 63 61 6c 6c 79 2e 20 20 54 68 65 20  tomically.  The 
8dc0: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 72 73  lock on the firs
8dd0: 74 0a 2a 2a 20 62 79 74 65 20 61 6c 6c 6f 77 73  t.** byte allows
8de0: 20 75 73 20 74 6f 20 64 72 6f 70 20 74 68 65 20   us to drop the 
8df0: 6f 6c 64 20 77 72 69 74 65 20 6c 6f 63 6b 20 61  old write lock a
8e00: 6e 64 20 67 65 74 20 74 68 65 20 72 65 61 64 20  nd get the read 
8e10: 6c 6f 63 6b 20 77 69 74 68 6f 75 74 0a 2a 2a 20  lock without.** 
8e20: 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  another process 
8e30: 6a 75 6d 70 69 6e 67 20 69 6e 74 6f 20 74 68 65  jumping into the
8e40: 20 6d 69 64 64 6c 65 20 61 6e 64 20 6d 65 73 73   middle and mess
8e50: 69 6e 67 20 75 73 20 75 70 2e 20 20 54 68 65 20  ing us up.  The 
8e60: 73 61 6d 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  same.** argument
8e70: 20 61 70 70 6c 69 65 73 20 74 6f 20 73 71 6c 69   applies to sqli
8e80: 74 65 4f 73 57 72 69 74 65 4c 6f 63 6b 28 29 2e  teOsWriteLock().
8e90: 0a 2a 2a 0a 2a 2a 20 4f 6e 20 57 69 6e 4e 54 2f  .**.** On WinNT/
8ea0: 32 4b 2f 58 50 20 73 79 73 74 65 6d 73 2c 20 4c  2K/XP systems, L
8eb0: 6f 63 6b 46 69 6c 65 45 78 28 29 20 61 6e 64 20  ockFileEx() and 
8ec0: 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 28 29 20 61  UnlockFileEx() a
8ed0: 72 65 20 61 76 61 69 6c 61 62 6c 65 2c 0a 2a 2a  re available,.**
8ee0: 20 77 68 69 63 68 20 6d 65 61 6e 73 20 77 65 20   which means we 
8ef0: 63 61 6e 20 75 73 65 20 72 65 61 64 65 72 2f 77  can use reader/w
8f00: 72 69 74 65 72 20 6c 6f 63 6b 73 2e 20 20 57 68  riter locks.  Wh
8f10: 65 6e 20 72 65 61 64 65 72 20 77 72 69 74 65 72  en reader writer
8f20: 20 6c 6f 63 6b 73 0a 2a 2a 20 61 72 65 20 75 73   locks.** are us
8f30: 65 64 2c 20 74 68 65 20 6c 6f 63 6b 20 69 73 20  ed, the lock is 
8f40: 70 6c 61 63 65 64 20 6f 6e 20 74 68 65 20 73 61  placed on the sa
8f50: 6d 65 20 72 61 6e 67 65 20 6f 66 20 62 79 74 65  me range of byte
8f60: 73 20 74 68 61 74 20 69 73 20 75 73 65 64 0a 2a  s that is used.*
8f70: 2a 20 66 6f 72 20 70 72 6f 62 61 62 69 6c 69 73  * for probabilis
8f80: 74 69 63 20 6c 6f 63 6b 69 6e 67 20 69 6e 20 57  tic locking in W
8f90: 69 6e 39 35 2f 39 38 2f 4d 45 2e 20 20 48 65 6e  in95/98/ME.  Hen
8fa0: 63 65 2c 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  ce, the locking 
8fb0: 73 63 68 65 6d 65 0a 2a 2a 20 77 69 6c 6c 20 73  scheme.** will s
8fc0: 75 70 70 6f 72 74 20 74 77 6f 20 6f 72 20 6d 6f  upport two or mo
8fd0: 72 65 20 57 69 6e 39 35 20 72 65 61 64 65 72 73  re Win95 readers
8fe0: 20 6f 72 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20   or two or more 
8ff0: 57 69 6e 4e 54 20 72 65 61 64 65 72 73 2e 0a 2a  WinNT readers..*
9000: 2a 20 42 75 74 20 61 20 73 69 6e 67 6c 65 20 57  * But a single W
9010: 69 6e 39 35 20 72 65 61 64 65 72 20 77 69 6c 6c  in95 reader will
9020: 20 6c 6f 63 6b 20 6f 75 74 20 61 6c 6c 20 57 69   lock out all Wi
9030: 6e 4e 54 20 72 65 61 64 65 72 73 20 61 6e 64 20  nNT readers and 
9040: 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 57 69 6e 4e  a single.** WinN
9050: 54 20 72 65 61 64 65 72 20 77 69 6c 6c 20 6c 6f  T reader will lo
9060: 63 6b 20 6f 75 74 20 61 6c 6c 20 6f 74 68 65 72  ck out all other
9070: 20 57 69 6e 39 35 20 72 65 61 64 65 72 73 2e 0a   Win95 readers..
9080: 2a 2a 0a 2a 2a 20 4e 6f 74 65 3a 20 4f 6e 20 4d  **.** Note: On M
9090: 61 63 4f 53 20 77 65 20 75 73 65 20 74 68 65 20  acOS we use the 
90a0: 72 65 73 6f 75 72 63 65 20 66 6f 72 6b 20 66 6f  resource fork fo
90b0: 72 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a  r locking..**.**
90c0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 23   The following #
90d0: 64 65 66 69 6e 65 73 20 73 70 65 63 69 66 79 20  defines specify 
90e0: 74 68 65 20 72 61 6e 67 65 20 6f 66 20 62 79 74  the range of byt
90f0: 65 73 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b  es used for lock
9100: 69 6e 67 2e 0a 2a 2a 20 4e 5f 4c 4f 43 4b 42 59  ing..** N_LOCKBY
9110: 54 45 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  TE is the number
9120: 20 6f 66 20 62 79 74 65 73 20 61 76 61 69 6c 61   of bytes availa
9130: 62 6c 65 20 66 6f 72 20 64 6f 69 6e 67 20 74 68  ble for doing th
9140: 65 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2a 20 54 68  e locking..** Th
9150: 65 20 66 69 72 73 74 20 62 79 74 65 20 75 73 65  e first byte use
9160: 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6c 6f  d to hold the lo
9170: 63 6b 20 77 68 69 6c 65 20 74 68 65 20 6c 6f 63  ck while the loc
9180: 6b 20 69 73 20 63 68 61 6e 67 69 6e 67 20 64 6f  k is changing do
9190: 65 73 0a 2a 2a 20 6e 6f 74 20 63 6f 75 6e 74 20  es.** not count 
91a0: 74 6f 77 61 72 64 20 74 68 69 73 20 6e 75 6d 62  toward this numb
91b0: 65 72 2e 20 20 46 49 52 53 54 5f 4c 4f 43 4b 42  er.  FIRST_LOCKB
91c0: 59 54 45 20 69 73 20 74 68 65 20 61 64 64 72 65  YTE is the addre
91d0: 73 73 20 6f 66 0a 2a 2a 20 74 68 65 20 66 69 72  ss of.** the fir
91e0: 73 74 20 62 79 74 65 20 69 6e 20 74 68 65 20 72  st byte in the r
91f0: 61 6e 67 65 20 6f 66 20 62 79 74 65 73 20 75 73  ange of bytes us
9200: 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 2e 0a  ed for locking..
9210: 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 5f 4c 4f 43  */.#define N_LOC
9220: 4b 42 59 54 45 20 20 20 20 20 20 20 31 30 32 33  KBYTE       1023
9230: 39 0a 23 69 66 20 4f 53 5f 4d 41 43 0a 23 20 64  9.#if OS_MAC.# d
9240: 65 66 69 6e 65 20 46 49 52 53 54 5f 4c 4f 43 4b  efine FIRST_LOCK
9250: 42 59 54 45 20 20 20 28 30 78 30 30 30 66 66 66  BYTE   (0x000fff
9260: 66 66 20 2d 20 4e 5f 4c 4f 43 4b 42 59 54 45 29  ff - N_LOCKBYTE)
9270: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
9280: 46 49 52 53 54 5f 4c 4f 43 4b 42 59 54 45 20 20  FIRST_LOCKBYTE  
9290: 20 28 30 78 66 66 66 66 66 66 66 66 20 2d 20 4e   (0xffffffff - N
92a0: 5f 4c 4f 43 4b 42 59 54 45 29 0a 23 65 6e 64 69  _LOCKBYTE).#endi
92b0: 66 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  f../*.** Change 
92c0: 74 68 65 20 73 74 61 74 75 73 20 6f 66 20 74 68  the status of th
92d0: 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69  e lock on the fi
92e0: 6c 65 20 22 69 64 22 20 74 6f 20 62 65 20 61 20  le "id" to be a 
92f0: 72 65 61 64 6c 6f 63 6b 2e 0a 2a 2a 20 49 66 20  readlock..** If 
9300: 74 68 65 20 66 69 6c 65 20 77 61 73 20 77 72 69  the file was wri
9310: 74 65 20 6c 6f 63 6b 65 64 2c 20 74 68 65 6e 20  te locked, then 
9320: 74 68 69 73 20 72 65 64 75 63 65 73 20 74 68 65  this reduces the
9330: 20 6c 6f 63 6b 20 74 6f 20 61 20 72 65 61 64 2e   lock to a read.
9340: 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20  .** If the file 
9350: 77 61 73 20 72 65 61 64 20 6c 6f 63 6b 65 64 2c  was read locked,
9360: 20 74 68 65 6e 20 74 68 69 73 20 61 63 71 75 69   then this acqui
9370: 72 65 73 20 61 20 6e 65 77 20 72 65 61 64 20 6c  res a new read l
9380: 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ock..**.** Retur
9390: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
93a0: 75 63 63 65 73 73 20 61 6e 64 20 53 51 4c 49 54  uccess and SQLIT
93b0: 45 5f 42 55 53 59 20 6f 6e 20 66 61 69 6c 75 72  E_BUSY on failur
93c0: 65 2e 20 20 49 66 20 74 68 69 73 0a 2a 2a 20 6c  e.  If this.** l
93d0: 69 62 72 61 72 79 20 77 61 73 20 63 6f 6d 70 69  ibrary was compi
93e0: 6c 65 64 20 77 69 74 68 20 6c 61 72 67 65 20 66  led with large f
93f0: 69 6c 65 20 73 75 70 70 6f 72 74 20 28 4c 46 53  ile support (LFS
9400: 29 20 62 75 74 20 4c 46 53 20 69 73 20 6e 6f 74  ) but LFS is not
9410: 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e  .** available on
9420: 20 74 68 65 20 68 6f 73 74 2c 20 74 68 65 6e 20   the host, then 
9430: 61 6e 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 20  an SQLITE_NOLFS 
9440: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
9450: 69 6e 74 20 73 71 6c 69 74 65 4f 73 52 65 61 64  int sqliteOsRead
9460: 4c 6f 63 6b 28 4f 73 46 69 6c 65 20 2a 69 64 29  Lock(OsFile *id)
9470: 7b 0a 23 69 66 20 4f 53 5f 55 4e 49 58 0a 20 20  {.#if OS_UNIX.  
9480: 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
9490: 4f 73 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  OsEnterMutex();.
94a0: 20 20 69 66 28 20 69 64 2d 3e 70 4c 6f 63 6b 2d    if( id->pLock-
94b0: 3e 63 6e 74 3e 30 20 29 7b 0a 20 20 20 20 69 66  >cnt>0 ){.    if
94c0: 28 20 21 69 64 2d 3e 6c 6f 63 6b 65 64 20 29 7b  ( !id->locked ){
94d0: 0a 20 20 20 20 20 20 69 64 2d 3e 70 4c 6f 63 6b  .      id->pLock
94e0: 2d 3e 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 69  ->cnt++;.      i
94f0: 64 2d 3e 6c 6f 63 6b 65 64 20 3d 20 31 3b 0a 20  d->locked = 1;. 
9500: 20 20 20 20 20 69 64 2d 3e 70 4f 70 65 6e 2d 3e       id->pOpen->
9510: 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 7d 0a 20  nLock++;.    }. 
9520: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
9530: 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69  K;.  }else if( i
9540: 64 2d 3e 6c 6f 63 6b 65 64 20 7c 7c 20 69 64 2d  d->locked || id-
9550: 3e 70 4c 6f 63 6b 2d 3e 63 6e 74 3d 3d 30 20 29  >pLock->cnt==0 )
9560: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 66 6c 6f  {.    struct flo
9570: 63 6b 20 6c 6f 63 6b 3b 0a 20 20 20 20 69 6e 74  ck lock;.    int
9580: 20 73 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74   s;.    lock.l_t
9590: 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20  ype = F_RDLCK;. 
95a0: 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65     lock.l_whence
95b0: 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20   = SEEK_SET;.   
95c0: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
95d0: 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 30 4c 3b  lock.l_len = 0L;
95e0: 0a 20 20 20 20 73 20 3d 20 66 63 6e 74 6c 28 69  .    s = fcntl(i
95f0: 64 2d 3e 66 64 2c 20 46 5f 53 45 54 4c 4b 2c 20  d->fd, F_SETLK, 
9600: 26 6c 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28 20  &lock);.    if( 
9610: 73 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  s!=0 ){.      rc
9620: 20 3d 20 28 65 72 72 6e 6f 3d 3d 45 49 4e 56 41   = (errno==EINVA
9630: 4c 29 20 3f 20 53 51 4c 49 54 45 5f 4e 4f 4c 46  L) ? SQLITE_NOLF
9640: 53 20 3a 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  S : SQLITE_BUSY;
9650: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
9660: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
9670: 3b 0a 20 20 20 20 20 20 69 66 28 20 21 69 64 2d  ;.      if( !id-
9680: 3e 6c 6f 63 6b 65 64 20 29 7b 0a 20 20 20 20 20  >locked ){.     
9690: 20 20 20 69 64 2d 3e 70 4f 70 65 6e 2d 3e 6e 4c     id->pOpen->nL
96a0: 6f 63 6b 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69  ock++;.        i
96b0: 64 2d 3e 6c 6f 63 6b 65 64 20 3d 20 31 3b 0a 20  d->locked = 1;. 
96c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 64 2d       }.      id-
96d0: 3e 70 4c 6f 63 6b 2d 3e 63 6e 74 20 3d 20 31 3b  >pLock->cnt = 1;
96e0: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
96f0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
9700: 42 55 53 59 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  BUSY;.  }.  sqli
9710: 74 65 4f 73 4c 65 61 76 65 4d 75 74 65 78 28 29  teOsLeaveMutex()
9720: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23  ;.  return rc;.#
9730: 65 6e 64 69 66 0a 23 69 66 20 4f 53 5f 57 49 4e  endif.#if OS_WIN
9740: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28  .  int rc;.  if(
9750: 20 69 64 2d 3e 6c 6f 63 6b 65 64 3e 30 20 29 7b   id->locked>0 ){
9760: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
9770: 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _OK;.  }else{.  
9780: 20 20 69 6e 74 20 6c 6b 3b 0a 20 20 20 20 69 6e    int lk;.    in
9790: 74 20 72 65 73 3b 0a 20 20 20 20 69 6e 74 20 63  t res;.    int c
97a0: 6e 74 20 3d 20 31 30 30 3b 0a 20 20 20 20 73 71  nt = 100;.    sq
97b0: 6c 69 74 65 52 61 6e 64 6f 6d 6e 65 73 73 28 73  liteRandomness(s
97c0: 69 7a 65 6f 66 28 6c 6b 29 2c 20 26 6c 6b 29 3b  izeof(lk), &lk);
97d0: 0a 20 20 20 20 6c 6b 20 3d 20 28 6c 6b 20 26 20  .    lk = (lk & 
97e0: 30 78 37 66 66 66 66 66 66 66 29 25 4e 5f 4c 4f  0x7fffffff)%N_LO
97f0: 43 4b 42 59 54 45 20 2b 20 31 3b 0a 20 20 20 20  CKBYTE + 1;.    
9800: 77 68 69 6c 65 28 20 63 6e 74 2d 2d 3e 30 20 26  while( cnt-->0 &
9810: 26 20 28 72 65 73 20 3d 20 4c 6f 63 6b 46 69 6c  & (res = LockFil
9820: 65 28 69 64 2d 3e 68 2c 20 46 49 52 53 54 5f 4c  e(id->h, FIRST_L
9830: 4f 43 4b 42 59 54 45 2c 20 30 2c 20 31 2c 20 30  OCKBYTE, 0, 1, 0
9840: 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 53  ))==0 ){.      S
9850: 6c 65 65 70 28 31 29 3b 0a 20 20 20 20 7d 0a 20  leep(1);.    }. 
9860: 20 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20     if( res ){.  
9870: 20 20 20 20 55 6e 6c 6f 63 6b 46 69 6c 65 28 69      UnlockFile(i
9880: 64 2d 3e 68 2c 20 46 49 52 53 54 5f 4c 4f 43 4b  d->h, FIRST_LOCK
9890: 42 59 54 45 2b 31 2c 20 30 2c 20 4e 5f 4c 4f 43  BYTE+1, 0, N_LOC
98a0: 4b 42 59 54 45 2c 20 30 29 3b 0a 20 20 20 20 20  KBYTE, 0);.     
98b0: 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 20   if( isNT() ){. 
98c0: 20 20 20 20 20 20 20 4f 56 45 52 4c 41 50 50 45         OVERLAPPE
98d0: 44 20 6f 76 6c 70 3b 0a 20 20 20 20 20 20 20 20  D ovlp;.        
98e0: 6f 76 6c 70 2e 4f 66 66 73 65 74 20 3d 20 46 49  ovlp.Offset = FI
98f0: 52 53 54 5f 4c 4f 43 4b 42 59 54 45 2b 31 3b 0a  RST_LOCKBYTE+1;.
9900: 20 20 20 20 20 20 20 20 6f 76 6c 70 2e 4f 66 66          ovlp.Off
9910: 73 65 74 48 69 67 68 20 3d 20 30 3b 0a 20 20 20  setHigh = 0;.   
9920: 20 20 20 20 20 6f 76 6c 70 2e 68 45 76 65 6e 74       ovlp.hEvent
9930: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65   = 0;.        re
9940: 73 20 3d 20 4c 6f 63 6b 46 69 6c 65 45 78 28 69  s = LockFileEx(i
9950: 64 2d 3e 68 2c 20 4c 4f 43 4b 46 49 4c 45 5f 46  d->h, LOCKFILE_F
9960: 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59 2c  AIL_IMMEDIATELY,
9970: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
9980: 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 4e              0, N
9990: 5f 4c 4f 43 4b 42 59 54 45 2c 20 30 2c 20 26 6f  _LOCKBYTE, 0, &o
99a0: 76 6c 70 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  vlp);.      }els
99b0: 65 7b 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d  e{.        res =
99c0: 20 4c 6f 63 6b 46 69 6c 65 28 69 64 2d 3e 68 2c   LockFile(id->h,
99d0: 20 46 49 52 53 54 5f 4c 4f 43 4b 42 59 54 45 2b   FIRST_LOCKBYTE+
99e0: 6c 6b 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20  lk, 0, 1, 0);.  
99f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 55 6e 6c 6f      }.      Unlo
9a00: 63 6b 46 69 6c 65 28 69 64 2d 3e 68 2c 20 46 49  ckFile(id->h, FI
9a10: 52 53 54 5f 4c 4f 43 4b 42 59 54 45 2c 20 30 2c  RST_LOCKBYTE, 0,
9a20: 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20   1, 0);.    }.  
9a30: 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20    if( res ){.   
9a40: 20 20 20 69 64 2d 3e 6c 6f 63 6b 65 64 20 3d 20     id->locked = 
9a50: 6c 6b 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  lk;.      rc = S
9a60: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65  QLITE_OK;.    }e
9a70: 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
9a80: 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
9a90: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
9aa0: 72 63 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f  rc;.#endif.#if O
9ab0: 53 5f 4d 41 43 0a 20 20 69 6e 74 20 72 63 3b 0a  S_MAC.  int rc;.
9ac0: 20 20 69 66 28 20 69 64 2d 3e 6c 6f 63 6b 65 64    if( id->locked
9ad0: 3e 30 20 7c 7c 20 69 64 2d 3e 72 65 66 4e 75 6d  >0 || id->refNum
9ae0: 52 46 20 3d 3d 20 2d 31 20 29 7b 0a 20 20 20 20  RF == -1 ){.    
9af0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
9b00: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
9b10: 20 6c 6b 3b 0a 20 20 20 20 4f 53 45 72 72 20 72   lk;.    OSErr r
9b20: 65 73 3b 0a 20 20 20 20 69 6e 74 20 63 6e 74 20  es;.    int cnt 
9b30: 3d 20 35 3b 0a 20 20 20 20 50 61 72 61 6d 42 6c  = 5;.    ParamBl
9b40: 6f 63 6b 52 65 63 20 70 61 72 61 6d 73 3b 0a 20  ockRec params;. 
9b50: 20 20 20 73 71 6c 69 74 65 52 61 6e 64 6f 6d 6e     sqliteRandomn
9b60: 65 73 73 28 73 69 7a 65 6f 66 28 6c 6b 29 2c 20  ess(sizeof(lk), 
9b70: 26 6c 6b 29 3b 0a 20 20 20 20 6c 6b 20 3d 20 28  &lk);.    lk = (
9b80: 6c 6b 20 26 20 30 78 37 66 66 66 66 66 66 66 29  lk & 0x7fffffff)
9b90: 25 4e 5f 4c 4f 43 4b 42 59 54 45 20 2b 20 31 3b  %N_LOCKBYTE + 1;
9ba0: 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 70 61 72  .    memset(&par
9bb0: 61 6d 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  ams, 0, sizeof(p
9bc0: 61 72 61 6d 73 29 29 3b 0a 20 20 20 20 70 61 72  arams));.    par
9bd0: 61 6d 73 2e 69 6f 50 61 72 61 6d 2e 69 6f 52 65  ams.ioParam.ioRe
9be0: 66 4e 75 6d 20 3d 20 69 64 2d 3e 72 65 66 4e 75  fNum = id->refNu
9bf0: 6d 52 46 3b 0a 20 20 20 20 70 61 72 61 6d 73 2e  mRF;.    params.
9c00: 69 6f 50 61 72 61 6d 2e 69 6f 50 6f 73 4d 6f 64  ioParam.ioPosMod
9c10: 65 20 3d 20 66 73 46 72 6f 6d 53 74 61 72 74 3b  e = fsFromStart;
9c20: 0a 20 20 20 20 70 61 72 61 6d 73 2e 69 6f 50 61  .    params.ioPa
9c30: 72 61 6d 2e 69 6f 50 6f 73 4f 66 66 73 65 74 20  ram.ioPosOffset 
9c40: 3d 20 46 49 52 53 54 5f 4c 4f 43 4b 42 59 54 45  = FIRST_LOCKBYTE
9c50: 3b 0a 20 20 20 20 70 61 72 61 6d 73 2e 69 6f 50  ;.    params.ioP
9c60: 61 72 61 6d 2e 69 6f 52 65 71 43 6f 75 6e 74 20  aram.ioReqCount 
9c70: 3d 20 31 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  = 1;.    while( 
9c80: 63 6e 74 2d 2d 3e 30 20 26 26 20 28 72 65 73 20  cnt-->0 && (res 
9c90: 3d 20 50 42 4c 6f 63 6b 52 61 6e 67 65 53 79 6e  = PBLockRangeSyn
9ca0: 63 28 26 70 61 72 61 6d 73 29 29 21 3d 6e 6f 45  c(&params))!=noE
9cb0: 72 72 20 29 7b 0a 20 20 20 20 20 20 55 49 6e 74  rr ){.      UInt
9cc0: 33 32 20 66 69 6e 61 6c 54 69 63 6b 73 3b 0a 20  32 finalTicks;. 
9cd0: 20 20 20 20 20 44 65 6c 61 79 28 31 2c 20 26 66       Delay(1, &f
9ce0: 69 6e 61 6c 54 69 63 6b 73 29 3b 20 2f 2a 20 31  inalTicks); /* 1
9cf0: 2f 36 30 20 73 65 63 20 2a 2f 0a 20 20 20 20 7d  /60 sec */.    }
9d00: 0a 20 20 20 20 69 66 28 20 72 65 73 20 3d 3d 20  .    if( res == 
9d10: 6e 6f 45 72 72 20 29 7b 0a 20 20 20 20 20 20 70  noErr ){.      p
9d20: 61 72 61 6d 73 2e 69 6f 50 61 72 61 6d 2e 69 6f  arams.ioParam.io
9d30: 50 6f 73 4f 66 66 73 65 74 20 3d 20 46 49 52 53  PosOffset = FIRS
9d40: 54 5f 4c 4f 43 4b 42 59 54 45 2b 31 3b 0a 20 20  T_LOCKBYTE+1;.  
9d50: 20 20 20 20 70 61 72 61 6d 73 2e 69 6f 50 61 72      params.ioPar
9d60: 61 6d 2e 69 6f 52 65 71 43 6f 75 6e 74 20 3d 20  am.ioReqCount = 
9d70: 4e 5f 4c 4f 43 4b 42 59 54 45 3b 0a 20 20 20 20  N_LOCKBYTE;.    
9d80: 20 20 50 42 55 6e 6c 6f 63 6b 52 61 6e 67 65 53    PBUnlockRangeS
9d90: 79 6e 63 28 26 70 61 72 61 6d 73 29 3b 0a 20 20  ync(&params);.  
9da0: 20 20 20 20 70 61 72 61 6d 73 2e 69 6f 50 61 72      params.ioPar
9db0: 61 6d 2e 69 6f 50 6f 73 4f 66 66 73 65 74 20 3d  am.ioPosOffset =
9dc0: 20 46 49 52 53 54 5f 4c 4f 43 4b 42 59 54 45 2b   FIRST_LOCKBYTE+
9dd0: 6c 6b 3b 0a 20 20 20 20 20 20 70 61 72 61 6d 73  lk;.      params
9de0: 2e 69 6f 50 61 72 61 6d 2e 69 6f 52 65 71 43 6f  .ioParam.ioReqCo
9df0: 75 6e 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 72  unt = 1;.      r
9e00: 65 73 20 3d 20 50 42 4c 6f 63 6b 52 61 6e 67 65  es = PBLockRange
9e10: 53 79 6e 63 28 26 70 61 72 61 6d 73 29 3b 0a 20  Sync(&params);. 
9e20: 20 20 20 20 20 70 61 72 61 6d 73 2e 69 6f 50 61       params.ioPa
9e30: 72 61 6d 2e 69 6f 50 6f 73 4f 66 66 73 65 74 20  ram.ioPosOffset 
9e40: 3d 20 46 49 52 53 54 5f 4c 4f 43 4b 42 59 54 45  = FIRST_LOCKBYTE
9e50: 3b 0a 20 20 20 20 20 20 70 61 72 61 6d 73 2e 69  ;.      params.i
9e60: 6f 50 61 72 61 6d 2e 69 6f 52 65 71 43 6f 75 6e  oParam.ioReqCoun
9e70: 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 50 42 55  t = 1;.      PBU
9e80: 6e 6c 6f 63 6b 52 61 6e 67 65 53 79 6e 63 28 26  nlockRangeSync(&
9e90: 70 61 72 61 6d 73 29 3b 0a 20 20 20 20 7d 0a 20  params);.    }. 
9ea0: 20 20 20 69 66 28 20 72 65 73 20 3d 3d 20 6e 6f     if( res == no
9eb0: 45 72 72 20 29 7b 0a 20 20 20 20 20 20 69 64 2d  Err ){.      id-
9ec0: 3e 6c 6f 63 6b 65 64 20 3d 20 6c 6b 3b 0a 20 20  >locked = lk;.  
9ed0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
9ee0: 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  OK;.    }else{. 
9ef0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
9f00: 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20 20 7d  _BUSY;.    }.  }
9f10: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65  .  return rc;.#e
9f20: 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  ndif.}../*.** Ch
9f30: 61 6e 67 65 20 74 68 65 20 6c 6f 63 6b 20 73 74  ange the lock st
9f40: 61 74 75 73 20 74 6f 20 62 65 20 61 6e 20 65 78  atus to be an ex
9f50: 63 6c 75 73 69 76 65 20 6f 72 20 77 72 69 74 65  clusive or write
9f60: 20 6c 6f 63 6b 2e 20 20 52 65 74 75 72 6e 0a 2a   lock.  Return.*
9f70: 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  * SQLITE_OK on s
9f80: 75 63 63 65 73 73 20 61 6e 64 20 53 51 4c 49 54  uccess and SQLIT
9f90: 45 5f 42 55 53 59 20 6f 6e 20 61 20 66 61 69 6c  E_BUSY on a fail
9fa0: 75 72 65 2e 20 20 49 66 20 74 68 69 73 0a 2a 2a  ure.  If this.**
9fb0: 20 6c 69 62 72 61 72 79 20 77 61 73 20 63 6f 6d   library was com
9fc0: 70 69 6c 65 64 20 77 69 74 68 20 6c 61 72 67 65  piled with large
9fd0: 20 66 69 6c 65 20 73 75 70 70 6f 72 74 20 28 4c   file support (L
9fe0: 46 53 29 20 62 75 74 20 4c 46 53 20 69 73 20 6e  FS) but LFS is n
9ff0: 6f 74 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20  ot.** available 
a000: 6f 6e 20 74 68 65 20 68 6f 73 74 2c 20 74 68 65  on the host, the
a010: 6e 20 61 6e 20 53 51 4c 49 54 45 5f 4e 4f 4c 46  n an SQLITE_NOLF
a020: 53 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  S is returned..*
a030: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 4f 73 57 72  /.int sqliteOsWr
a040: 69 74 65 4c 6f 63 6b 28 4f 73 46 69 6c 65 20 2a  iteLock(OsFile *
a050: 69 64 29 7b 0a 23 69 66 20 4f 53 5f 55 4e 49 58  id){.#if OS_UNIX
a060: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
a070: 69 74 65 4f 73 45 6e 74 65 72 4d 75 74 65 78 28  iteOsEnterMutex(
a080: 29 3b 0a 20 20 69 66 28 20 69 64 2d 3e 70 4c 6f  );.  if( id->pLo
a090: 63 6b 2d 3e 63 6e 74 3d 3d 30 20 7c 7c 20 28 69  ck->cnt==0 || (i
a0a0: 64 2d 3e 70 4c 6f 63 6b 2d 3e 63 6e 74 3d 3d 31  d->pLock->cnt==1
a0b0: 20 26 26 20 69 64 2d 3e 6c 6f 63 6b 65 64 3d 3d   && id->locked==
a0c0: 31 29 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  1) ){.    struct
a0d0: 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 20   flock lock;.   
a0e0: 20 69 6e 74 20 73 3b 0a 20 20 20 20 6c 6f 63 6b   int s;.    lock
a0f0: 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c 43  .l_type = F_WRLC
a100: 4b 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68  K;.    lock.l_wh
a110: 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
a120: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72  .    lock.l_star
a130: 74 20 3d 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d  t = lock.l_len =
a140: 20 30 4c 3b 0a 20 20 20 20 73 20 3d 20 66 63 6e   0L;.    s = fcn
a150: 74 6c 28 69 64 2d 3e 66 64 2c 20 46 5f 53 45 54  tl(id->fd, F_SET
a160: 4c 4b 2c 20 26 6c 6f 63 6b 29 3b 0a 20 20 20 20  LK, &lock);.    
a170: 69 66 28 20 73 21 3d 30 20 29 7b 0a 20 20 20 20  if( s!=0 ){.    
a180: 20 20 72 63 20 3d 20 28 65 72 72 6e 6f 3d 3d 45    rc = (errno==E
a190: 49 4e 56 41 4c 29 20 3f 20 53 51 4c 49 54 45 5f  INVAL) ? SQLITE_
a1a0: 4e 4f 4c 46 53 20 3a 20 53 51 4c 49 54 45 5f 42  NOLFS : SQLITE_B
a1b0: 55 53 59 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  USY;.    }else{.
a1c0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
a1d0: 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69 66 28 20  E_OK;.      if( 
a1e0: 21 69 64 2d 3e 6c 6f 63 6b 65 64 20 29 7b 0a 20  !id->locked ){. 
a1f0: 20 20 20 20 20 20 20 69 64 2d 3e 70 4f 70 65 6e         id->pOpen
a200: 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 20  ->nLock++;.     
a210: 20 20 20 69 64 2d 3e 6c 6f 63 6b 65 64 20 3d 20     id->locked = 
a220: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
a230: 20 69 64 2d 3e 70 4c 6f 63 6b 2d 3e 63 6e 74 20   id->pLock->cnt 
a240: 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  = -1;.    }.  }e
a250: 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  lse{.    rc = SQ
a260: 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 20  LITE_BUSY;.  }. 
a270: 20 73 71 6c 69 74 65 4f 73 4c 65 61 76 65 4d 75   sqliteOsLeaveMu
a280: 74 65 78 28 29 3b 0a 20 20 72 65 74 75 72 6e 20  tex();.  return 
a290: 72 63 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f  rc;.#endif.#if O
a2a0: 53 5f 57 49 4e 0a 20 20 69 6e 74 20 72 63 3b 0a  S_WIN.  int rc;.
a2b0: 20 20 69 66 28 20 69 64 2d 3e 6c 6f 63 6b 65 64    if( id->locked
a2c0: 3c 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  <0 ){.    rc = S
a2d0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
a2e0: 65 7b 0a 20 20 20 20 69 6e 74 20 72 65 73 3b 0a  e{.    int res;.
a2f0: 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 31 30      int cnt = 10
a300: 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 63 6e  0;.    while( cn
a310: 74 2d 2d 3e 30 20 26 26 20 28 72 65 73 20 3d 20  t-->0 && (res = 
a320: 4c 6f 63 6b 46 69 6c 65 28 69 64 2d 3e 68 2c 20  LockFile(id->h, 
a330: 46 49 52 53 54 5f 4c 4f 43 4b 42 59 54 45 2c 20  FIRST_LOCKBYTE, 
a340: 30 2c 20 31 2c 20 30 29 29 3d 3d 30 20 29 7b 0a  0, 1, 0))==0 ){.
a350: 20 20 20 20 20 20 53 6c 65 65 70 28 31 29 3b 0a        Sleep(1);.
a360: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 65      }.    if( re
a370: 73 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69  s ){.      if( i
a380: 64 2d 3e 6c 6f 63 6b 65 64 3e 30 20 29 7b 0a 20  d->locked>0 ){. 
a390: 20 20 20 20 20 20 20 69 66 28 20 69 73 4e 54 28         if( isNT(
a3a0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 55  ) ){.          U
a3b0: 6e 6c 6f 63 6b 46 69 6c 65 28 69 64 2d 3e 68 2c  nlockFile(id->h,
a3c0: 20 46 49 52 53 54 5f 4c 4f 43 4b 42 59 54 45 2b   FIRST_LOCKBYTE+
a3d0: 31 2c 20 30 2c 20 4e 5f 4c 4f 43 4b 42 59 54 45  1, 0, N_LOCKBYTE
a3e0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  , 0);.        }e
a3f0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72  lse{.          r
a400: 65 73 20 3d 20 55 6e 6c 6f 63 6b 46 69 6c 65 28  es = UnlockFile(
a410: 69 64 2d 3e 68 2c 20 46 49 52 53 54 5f 4c 4f 43  id->h, FIRST_LOC
a420: 4b 42 59 54 45 20 2b 20 69 64 2d 3e 6c 6f 63 6b  KBYTE + id->lock
a430: 65 64 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20  ed, 0, 1, 0);.  
a440: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
a450: 20 20 20 20 20 20 69 66 28 20 72 65 73 20 29 7b        if( res ){
a460: 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 4c  .        res = L
a470: 6f 63 6b 46 69 6c 65 28 69 64 2d 3e 68 2c 20 46  ockFile(id->h, F
a480: 49 52 53 54 5f 4c 4f 43 4b 42 59 54 45 2b 31 2c  IRST_LOCKBYTE+1,
a490: 20 30 2c 20 4e 5f 4c 4f 43 4b 42 59 54 45 2c 20   0, N_LOCKBYTE, 
a4a0: 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  0);.      }else{
a4b0: 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 30  .        res = 0
a4c0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
a4d0: 55 6e 6c 6f 63 6b 46 69 6c 65 28 69 64 2d 3e 68  UnlockFile(id->h
a4e0: 2c 20 46 49 52 53 54 5f 4c 4f 43 4b 42 59 54 45  , FIRST_LOCKBYTE
a4f0: 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  , 0, 1, 0);.    
a500: 7d 0a 20 20 20 20 69 66 28 20 72 65 73 20 29 7b  }.    if( res ){
a510: 0a 20 20 20 20 20 20 69 64 2d 3e 6c 6f 63 6b 65  .      id->locke
a520: 64 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 72 63  d = -1;.      rc
a530: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
a540: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
a550: 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
a560: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
a570: 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 23  urn rc;.#endif.#
a580: 69 66 20 4f 53 5f 4d 41 43 0a 20 20 69 6e 74 20  if OS_MAC.  int 
a590: 72 63 3b 0a 20 20 69 66 28 20 69 64 2d 3e 6c 6f  rc;.  if( id->lo
a5a0: 63 6b 65 64 3c 30 20 7c 7c 20 69 64 2d 3e 72 65  cked<0 || id->re
a5b0: 66 4e 75 6d 52 46 20 3d 3d 20 2d 31 20 29 7b 0a  fNumRF == -1 ){.
a5c0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
a5d0: 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OK;.  }else{.   
a5e0: 20 4f 53 45 72 72 20 72 65 73 3b 0a 20 20 20 20   OSErr res;.    
a5f0: 69 6e 74 20 63 6e 74 20 3d 20 35 3b 0a 20 20 20  int cnt = 5;.   
a600: 20 50 61 72 61 6d 42 6c 6f 63 6b 52 65 63 20 70   ParamBlockRec p
a610: 61 72 61 6d 73 3b 0a 20 20 20 20 6d 65 6d 73 65  arams;.    memse
a620: 74 28 26 70 61 72 61 6d 73 2c 20 30 2c 20 73 69  t(&params, 0, si
a630: 7a 65 6f 66 28 70 61 72 61 6d 73 29 29 3b 0a 20  zeof(params));. 
a640: 20 20 20 70 61 72 61 6d 73 2e 69 6f 50 61 72 61     params.ioPara
a650: 6d 2e 69 6f 52 65 66 4e 75 6d 20 3d 20 69 64 2d  m.ioRefNum = id-
a660: 3e 72 65 66 4e 75 6d 52 46 3b 0a 20 20 20 20 70  >refNumRF;.    p
a670: 61 72 61 6d 73 2e 69 6f 50 61 72 61 6d 2e 69 6f  arams.ioParam.io
a680: 50 6f 73 4d 6f 64 65 20 3d 20 66 73 46 72 6f 6d  PosMode = fsFrom
a690: 53 74 61 72 74 3b 0a 20 20 20 20 70 61 72 61 6d  Start;.    param
a6a0: 73 2e 69 6f 50 61 72 61 6d 2e 69 6f 50 6f 73 4f  s.ioParam.ioPosO
a6b0: 66 66 73 65 74 20 3d 20 46 49 52 53 54 5f 4c 4f  ffset = FIRST_LO
a6c0: 43 4b 42 59 54 45 3b 0a 20 20 20 20 70 61 72 61  CKBYTE;.    para
a6d0: 6d 73 2e 69 6f 50 61 72 61 6d 2e 69 6f 52 65 71  ms.ioParam.ioReq
a6e0: 43 6f 75 6e 74 20 3d 20 31 3b 0a 20 20 20 20 77  Count = 1;.    w
a6f0: 68 69 6c 65 28 20 63 6e 74 2d 2d 3e 30 20 26 26  hile( cnt-->0 &&
a700: 20 28 72 65 73 20 3d 20 50 42 4c 6f 63 6b 52 61   (res = PBLockRa
a710: 6e 67 65 53 79 6e 63 28 26 70 61 72 61 6d 73 29  ngeSync(&params)
a720: 29 21 3d 6e 6f 45 72 72 20 29 7b 0a 20 20 20 20  )!=noErr ){.    
a730: 20 20 55 49 6e 74 33 32 20 66 69 6e 61 6c 54 69    UInt32 finalTi
a740: 63 6b 73 3b 0a 20 20 20 20 20 20 44 65 6c 61 79  cks;.      Delay
a750: 28 31 2c 20 26 66 69 6e 61 6c 54 69 63 6b 73 29  (1, &finalTicks)
a760: 3b 20 2f 2a 20 31 2f 36 30 20 73 65 63 20 2a 2f  ; /* 1/60 sec */
a770: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
a780: 65 73 20 3d 3d 20 6e 6f 45 72 72 20 29 7b 0a 20  es == noErr ){. 
a790: 20 20 20 20 20 70 61 72 61 6d 73 2e 69 6f 50 61       params.ioPa
a7a0: 72 61 6d 2e 69 6f 50 6f 73 4f 66 66 73 65 74 20  ram.ioPosOffset 
a7b0: 3d 20 46 49 52 53 54 5f 4c 4f 43 4b 42 59 54 45  = FIRST_LOCKBYTE
a7c0: 20 2b 20 69 64 2d 3e 6c 6f 63 6b 65 64 3b 0a 20   + id->locked;. 
a7d0: 20 20 20 20 20 70 61 72 61 6d 73 2e 69 6f 50 61       params.ioPa
a7e0: 72 61 6d 2e 69 6f 52 65 71 43 6f 75 6e 74 20 3d  ram.ioReqCount =
a7f0: 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 69 64   1;.      if( id
a800: 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 0a 20 20 20  ->locked==0 .   
a810: 20 20 20 20 20 20 20 20 20 7c 7c 20 50 42 55 6e           || PBUn
a820: 6c 6f 63 6b 52 61 6e 67 65 53 79 6e 63 28 26 70  lockRangeSync(&p
a830: 61 72 61 6d 73 29 3d 3d 6e 6f 45 72 72 20 29 7b  arams)==noErr ){
a840: 0a 20 20 20 20 20 20 20 20 70 61 72 61 6d 73 2e  .        params.
a850: 69 6f 50 61 72 61 6d 2e 69 6f 50 6f 73 4f 66 66  ioParam.ioPosOff
a860: 73 65 74 20 3d 20 46 49 52 53 54 5f 4c 4f 43 4b  set = FIRST_LOCK
a870: 42 59 54 45 2b 31 3b 0a 20 20 20 20 20 20 20 20  BYTE+1;.        
a880: 70 61 72 61 6d 73 2e 69 6f 50 61 72 61 6d 2e 69  params.ioParam.i
a890: 6f 52 65 71 43 6f 75 6e 74 20 3d 20 4e 5f 4c 4f  oReqCount = N_LO
a8a0: 43 4b 42 59 54 45 3b 0a 20 20 20 20 20 20 20 20  CKBYTE;.        
a8b0: 72 65 73 20 3d 20 50 42 4c 6f 63 6b 52 61 6e 67  res = PBLockRang
a8c0: 65 53 79 6e 63 28 26 70 61 72 61 6d 73 29 3b 0a  eSync(&params);.
a8d0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
a8e0: 20 20 20 20 20 72 65 73 20 3d 20 61 66 70 52 61       res = afpRa
a8f0: 6e 67 65 4e 6f 74 4c 6f 63 6b 65 64 3b 0a 20 20  ngeNotLocked;.  
a900: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 61 72 61      }.      para
a910: 6d 73 2e 69 6f 50 61 72 61 6d 2e 69 6f 50 6f 73  ms.ioParam.ioPos
a920: 4f 66 66 73 65 74 20 3d 20 46 49 52 53 54 5f 4c  Offset = FIRST_L
a930: 4f 43 4b 42 59 54 45 3b 0a 20 20 20 20 20 20 70  OCKBYTE;.      p
a940: 61 72 61 6d 73 2e 69 6f 50 61 72 61 6d 2e 69 6f  arams.ioParam.io
a950: 52 65 71 43 6f 75 6e 74 20 3d 20 31 3b 0a 20 20  ReqCount = 1;.  
a960: 20 20 20 20 50 42 55 6e 6c 6f 63 6b 52 61 6e 67      PBUnlockRang
a970: 65 53 79 6e 63 28 26 70 61 72 61 6d 73 29 3b 0a  eSync(&params);.
a980: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 65      }.    if( re
a990: 73 20 3d 3d 20 6e 6f 45 72 72 20 29 7b 0a 20 20  s == noErr ){.  
a9a0: 20 20 20 20 69 64 2d 3e 6c 6f 63 6b 65 64 20 3d      id->locked =
a9b0: 20 2d 31 3b 0a 20 20 20 20 20 20 72 63 20 3d 20   -1;.      rc = 
a9c0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
a9d0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
a9e0: 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
a9f0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
aa00: 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f   rc;.#endif.}../
aa10: 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20  *.** Unlock the 
aa20: 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72  given file descr
aa30: 69 70 74 6f 72 2e 20 20 49 66 20 74 68 65 20 66  iptor.  If the f
aa40: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 77  ile descriptor w
aa50: 61 73 0a 2a 2a 20 6e 6f 74 20 70 72 65 76 69 6f  as.** not previo
aa60: 75 73 6c 79 20 6c 6f 63 6b 65 64 2c 20 74 68 65  usly locked, the
aa70: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
aa80: 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66 20 74  s a no-op.  If t
aa90: 68 69 73 0a 2a 2a 20 6c 69 62 72 61 72 79 20 77  his.** library w
aaa0: 61 73 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68  as compiled with
aab0: 20 6c 61 72 67 65 20 66 69 6c 65 20 73 75 70 70   large file supp
aac0: 6f 72 74 20 28 4c 46 53 29 20 62 75 74 20 4c 46  ort (LFS) but LF
aad0: 53 20 69 73 20 6e 6f 74 0a 2a 2a 20 61 76 61 69  S is not.** avai
aae0: 6c 61 62 6c 65 20 6f 6e 20 74 68 65 20 68 6f 73  lable on the hos
aaf0: 74 2c 20 74 68 65 6e 20 61 6e 20 53 51 4c 49 54  t, then an SQLIT
ab00: 45 5f 4e 4f 4c 46 53 20 69 73 20 72 65 74 75 72  E_NOLFS is retur
ab10: 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ned..*/.int sqli
ab20: 74 65 4f 73 55 6e 6c 6f 63 6b 28 4f 73 46 69 6c  teOsUnlock(OsFil
ab30: 65 20 2a 69 64 29 7b 0a 23 69 66 20 4f 53 5f 55  e *id){.#if OS_U
ab40: 4e 49 58 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  NIX.  int rc;.  
ab50: 69 66 28 20 21 69 64 2d 3e 6c 6f 63 6b 65 64 20  if( !id->locked 
ab60: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
ab70: 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 4f 73 45 6e  OK;.  sqliteOsEn
ab80: 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 61 73  terMutex();.  as
ab90: 73 65 72 74 28 20 69 64 2d 3e 70 4c 6f 63 6b 2d  sert( id->pLock-
aba0: 3e 63 6e 74 21 3d 30 20 29 3b 0a 20 20 69 66 28  >cnt!=0 );.  if(
abb0: 20 69 64 2d 3e 70 4c 6f 63 6b 2d 3e 63 6e 74 3e   id->pLock->cnt>
abc0: 31 20 29 7b 0a 20 20 20 20 69 64 2d 3e 70 4c 6f  1 ){.    id->pLo
abd0: 63 6b 2d 3e 63 6e 74 2d 2d 3b 0a 20 20 20 20 72  ck->cnt--;.    r
abe0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
abf0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 74 72 75   }else{.    stru
ac00: 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20  ct flock lock;. 
ac10: 20 20 20 69 6e 74 20 73 3b 0a 20 20 20 20 6c 6f     int s;.    lo
ac20: 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e  ck.l_type = F_UN
ac30: 4c 43 4b 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  LCK;.    lock.l_
ac40: 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
ac50: 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74  T;.    lock.l_st
ac60: 61 72 74 20 3d 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e  art = lock.l_len
ac70: 20 3d 20 30 4c 3b 0a 20 20 20 20 73 20 3d 20 66   = 0L;.    s = f
ac80: 63 6e 74 6c 28 69 64 2d 3e 66 64 2c 20 46 5f 53  cntl(id->fd, F_S
ac90: 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3b 0a 20 20  ETLK, &lock);.  
aca0: 20 20 69 66 28 20 73 21 3d 30 20 29 7b 0a 20 20    if( s!=0 ){.  
acb0: 20 20 20 20 72 63 20 3d 20 28 65 72 72 6e 6f 3d      rc = (errno=
acc0: 3d 45 49 4e 56 41 4c 29 20 3f 20 53 51 4c 49 54  =EINVAL) ? SQLIT
acd0: 45 5f 4e 4f 4c 46 53 20 3a 20 53 51 4c 49 54 45  E_NOLFS : SQLITE
ace0: 5f 42 55 53 59 3b 0a 20 20 20 20 7d 65 6c 73 65  _BUSY;.    }else
acf0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
ad00: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69 64  ITE_OK;.      id
ad10: 2d 3e 70 4c 6f 63 6b 2d 3e 63 6e 74 20 3d 20 30  ->pLock->cnt = 0
ad20: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
ad30: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
ad40: 29 7b 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d  ){.    /* Decrem
ad50: 65 6e 74 20 74 68 65 20 63 6f 75 6e 74 20 6f 66  ent the count of
ad60: 20 6c 6f 63 6b 73 20 61 67 61 69 6e 73 74 20 74   locks against t
ad70: 68 69 73 20 73 61 6d 65 20 66 69 6c 65 2e 20 20  his same file.  
ad80: 57 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  When the.    ** 
ad90: 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20 7a 65  count reaches ze
ada0: 72 6f 2c 20 63 6c 6f 73 65 20 61 6e 79 20 6f 74  ro, close any ot
adb0: 68 65 72 20 66 69 6c 65 20 64 65 73 63 72 69 70  her file descrip
adc0: 74 6f 72 73 20 77 68 6f 73 65 20 63 6c 6f 73 65  tors whose close
add0: 0a 20 20 20 20 2a 2a 20 77 61 73 20 64 65 66 65  .    ** was defe
ade0: 72 72 65 64 20 62 65 63 61 75 73 65 20 6f 66 20  rred because of 
adf0: 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b  outstanding lock
ae00: 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 74  s..    */.    st
ae10: 72 75 63 74 20 6f 70 65 6e 43 6e 74 20 2a 70 4f  ruct openCnt *pO
ae20: 70 65 6e 20 3d 20 69 64 2d 3e 70 4f 70 65 6e 3b  pen = id->pOpen;
ae30: 0a 20 20 20 20 70 4f 70 65 6e 2d 3e 6e 4c 6f 63  .    pOpen->nLoc
ae40: 6b 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  k--;.    assert(
ae50: 20 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 3e 3d 30   pOpen->nLock>=0
ae60: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 70 65   );.    if( pOpe
ae70: 6e 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 26 26 20 70  n->nLock==0 && p
ae80: 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67 3e 30  Open->nPending>0
ae90: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   ){.      int i;
aea0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
aeb0: 69 3c 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e  i<pOpen->nPendin
aec0: 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
aed0: 20 63 6c 6f 73 65 28 70 4f 70 65 6e 2d 3e 61 50   close(pOpen->aP
aee0: 65 6e 64 69 6e 67 5b 69 5d 29 3b 0a 20 20 20 20  ending[i]);.    
aef0: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
af00: 46 72 65 65 28 70 4f 70 65 6e 2d 3e 61 50 65 6e  Free(pOpen->aPen
af10: 64 69 6e 67 29 3b 0a 20 20 20 20 20 20 70 4f 70  ding);.      pOp
af20: 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67 20 3d 20 30  en->nPending = 0
af30: 3b 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 61  ;.      pOpen->a
af40: 50 65 6e 64 69 6e 67 20 3d 20 30 3b 0a 20 20 20  Pending = 0;.   
af50: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 4f   }.  }.  sqliteO
af60: 73 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  sLeaveMutex();. 
af70: 20 69 64 2d 3e 6c 6f 63 6b 65 64 20 3d 20 30 3b   id->locked = 0;
af80: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65  .  return rc;.#e
af90: 6e 64 69 66 0a 23 69 66 20 4f 53 5f 57 49 4e 0a  ndif.#if OS_WIN.
afa0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20    int rc;.  if( 
afb0: 69 64 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 7b  id->locked==0 ){
afc0: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
afd0: 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  _OK;.  }else if(
afe0: 20 69 73 4e 54 28 29 20 7c 7c 20 69 64 2d 3e 6c   isNT() || id->l
aff0: 6f 63 6b 65 64 3c 30 20 29 7b 0a 20 20 20 20 55  ocked<0 ){.    U
b000: 6e 6c 6f 63 6b 46 69 6c 65 28 69 64 2d 3e 68 2c  nlockFile(id->h,
b010: 20 46 49 52 53 54 5f 4c 4f 43 4b 42 59 54 45 2b   FIRST_LOCKBYTE+
b020: 31 2c 20 30 2c 20 4e 5f 4c 4f 43 4b 42 59 54 45  1, 0, N_LOCKBYTE
b030: 2c 20 30 29 3b 0a 20 20 20 20 72 63 20 3d 20 53  , 0);.    rc = S
b040: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 69 64  QLITE_OK;.    id
b050: 2d 3e 6c 6f 63 6b 65 64 20 3d 20 30 3b 0a 20 20  ->locked = 0;.  
b060: 7d 65 6c 73 65 7b 0a 20 20 20 20 55 6e 6c 6f 63  }else{.    Unloc
b070: 6b 46 69 6c 65 28 69 64 2d 3e 68 2c 20 46 49 52  kFile(id->h, FIR
b080: 53 54 5f 4c 4f 43 4b 42 59 54 45 2b 69 64 2d 3e  ST_LOCKBYTE+id->
b090: 6c 6f 63 6b 65 64 2c 20 30 2c 20 31 2c 20 30 29  locked, 0, 1, 0)
b0a0: 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
b0b0: 45 5f 4f 4b 3b 0a 20 20 20 20 69 64 2d 3e 6c 6f  E_OK;.    id->lo
b0c0: 63 6b 65 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  cked = 0;.  }.  
b0d0: 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69  return rc;.#endi
b0e0: 66 0a 23 69 66 20 4f 53 5f 4d 41 43 0a 20 20 69  f.#if OS_MAC.  i
b0f0: 6e 74 20 72 63 3b 0a 20 20 50 61 72 61 6d 42 6c  nt rc;.  ParamBl
b100: 6f 63 6b 52 65 63 20 70 61 72 61 6d 73 3b 0a 20  ockRec params;. 
b110: 20 6d 65 6d 73 65 74 28 26 70 61 72 61 6d 73 2c   memset(&params,
b120: 20 30 2c 20 73 69 7a 65 6f 66 28 70 61 72 61 6d   0, sizeof(param
b130: 73 29 29 3b 0a 20 20 70 61 72 61 6d 73 2e 69 6f  s));.  params.io
b140: 50 61 72 61 6d 2e 69 6f 52 65 66 4e 75 6d 20 3d  Param.ioRefNum =
b150: 20 69 64 2d 3e 72 65 66 4e 75 6d 52 46 3b 0a 20   id->refNumRF;. 
b160: 20 70 61 72 61 6d 73 2e 69 6f 50 61 72 61 6d 2e   params.ioParam.
b170: 69 6f 50 6f 73 4d 6f 64 65 20 3d 20 66 73 46 72  ioPosMode = fsFr
b180: 6f 6d 53 74 61 72 74 3b 0a 20 20 69 66 28 20 69  omStart;.  if( i
b190: 64 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 7c 7c 20  d->locked==0 || 
b1a0: 69 64 2d 3e 72 65 66 4e 75 6d 52 46 20 3d 3d 20  id->refNumRF == 
b1b0: 2d 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  -1 ){.    rc = S
b1c0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
b1d0: 65 20 69 66 28 20 69 64 2d 3e 6c 6f 63 6b 65 64  e if( id->locked
b1e0: 3c 30 20 29 7b 0a 20 20 20 20 70 61 72 61 6d 73  <0 ){.    params
b1f0: 2e 69 6f 50 61 72 61 6d 2e 69 6f 50 6f 73 4f 66  .ioParam.ioPosOf
b200: 66 73 65 74 20 3d 20 46 49 52 53 54 5f 4c 4f 43  fset = FIRST_LOC
b210: 4b 42 59 54 45 2b 31 3b 0a 20 20 20 20 70 61 72  KBYTE+1;.    par
b220: 61 6d 73 2e 69 6f 50 61 72 61 6d 2e 69 6f 52 65  ams.ioParam.ioRe
b230: 71 43 6f 75 6e 74 20 3d 20 4e 5f 4c 4f 43 4b 42  qCount = N_LOCKB
b240: 59 54 45 3b 0a 20 20 20 20 50 42 55 6e 6c 6f 63  YTE;.    PBUnloc
b250: 6b 52 61 6e 67 65 53 79 6e 63 28 26 70 61 72 61  kRangeSync(&para
b260: 6d 73 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  ms);.    rc = SQ
b270: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 69 64 2d  LITE_OK;.    id-
b280: 3e 6c 6f 63 6b 65 64 20 3d 20 30 3b 0a 20 20 7d  >locked = 0;.  }
b290: 65 6c 73 65 7b 0a 20 20 20 20 70 61 72 61 6d 73  else{.    params
b2a0: 2e 69 6f 50 61 72 61 6d 2e 69 6f 50 6f 73 4f 66  .ioParam.ioPosOf
b2b0: 66 73 65 74 20 3d 20 46 49 52 53 54 5f 4c 4f 43  fset = FIRST_LOC
b2c0: 4b 42 59 54 45 2b 69 64 2d 3e 6c 6f 63 6b 65 64  KBYTE+id->locked
b2d0: 3b 0a 20 20 20 20 70 61 72 61 6d 73 2e 69 6f 50  ;.    params.ioP
b2e0: 61 72 61 6d 2e 69 6f 52 65 71 43 6f 75 6e 74 20  aram.ioReqCount 
b2f0: 3d 20 31 3b 0a 20 20 20 20 50 42 55 6e 6c 6f 63  = 1;.    PBUnloc
b300: 6b 52 61 6e 67 65 53 79 6e 63 28 26 70 61 72 61  kRangeSync(&para
b310: 6d 73 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  ms);.    rc = SQ
b320: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 69 64 2d  LITE_OK;.    id-
b330: 3e 6c 6f 63 6b 65 64 20 3d 20 30 3b 0a 20 20 7d  >locked = 0;.  }
b340: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65  .  return rc;.#e
b350: 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  ndif.}../*.** Ge
b360: 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f  t information to
b370: 20 73 65 65 64 20 74 68 65 20 72 61 6e 64 6f 6d   seed the random
b380: 20 6e 75 6d 62 65 72 20 67 65 6e 65 72 61 74 6f   number generato
b390: 72 2e 20 20 54 68 65 20 73 65 65 64 0a 2a 2a 20  r.  The seed.** 
b3a0: 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
b3b0: 74 68 65 20 62 75 66 66 65 72 20 7a 42 75 66 5b  the buffer zBuf[
b3c0: 32 35 36 5d 2e 20 20 54 68 65 20 63 61 6c 6c 69  256].  The calli
b3d0: 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74  ng function must
b3e0: 0a 2a 2a 20 73 75 70 70 6c 79 20 61 20 73 75 66  .** supply a suf
b3f0: 66 69 63 69 65 6e 74 6c 79 20 6c 61 72 67 65 20  ficiently large 
b400: 62 75 66 66 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73  buffer..*/.int s
b410: 71 6c 69 74 65 4f 73 52 61 6e 64 6f 6d 53 65 65  qliteOsRandomSee
b420: 64 28 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20  d(char *zBuf){. 
b430: 20 2f 2a 20 57 65 20 68 61 76 65 20 74 6f 20 69   /* We have to i
b440: 6e 69 74 69 61 6c 69 7a 65 20 7a 42 75 66 20 74  nitialize zBuf t
b450: 6f 20 70 72 65 76 65 6e 74 20 76 61 6c 67 72 69  o prevent valgri
b460: 6e 64 20 66 72 6f 6d 20 72 65 70 6f 72 74 69 6e  nd from reportin
b470: 67 0a 20 20 2a 2a 20 65 72 72 6f 72 73 2e 20 20  g.  ** errors.  
b480: 54 68 65 20 72 65 70 6f 72 74 73 20 69 73 73 75  The reports issu
b490: 65 64 20 62 79 20 76 61 6c 67 72 69 6e 64 20 61  ed by valgrind a
b4a0: 72 65 20 69 6e 63 6f 72 72 65 63 74 20 2d 20 77  re incorrect - w
b4b0: 65 20 77 6f 75 6c 64 0a 20 20 2a 2a 20 70 72 65  e would.  ** pre
b4c0: 66 65 72 20 74 68 61 74 20 74 68 65 20 72 61 6e  fer that the ran
b4d0: 64 6f 6d 6e 65 73 73 20 62 65 20 69 6e 63 72 65  domness be incre
b4e0: 61 73 65 64 20 62 79 20 6d 61 6b 69 6e 67 20 75  ased by making u
b4f0: 73 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 75  se of the.  ** u
b500: 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 73 70 61  ninitialized spa
b510: 63 65 20 69 6e 20 7a 42 75 66 20 2d 20 62 75 74  ce in zBuf - but
b520: 20 76 61 6c 67 72 69 6e 64 20 65 72 72 6f 72 73   valgrind errors
b530: 20 74 65 6e 64 20 74 6f 20 77 6f 72 72 79 0a 20   tend to worry. 
b540: 20 2a 2a 20 73 6f 6d 65 20 75 73 65 72 73 2e 20   ** some users. 
b550: 20 52 61 74 68 65 72 20 74 68 61 6e 20 61 72 67   Rather than arg
b560: 75 65 2c 20 69 74 20 73 65 65 6d 73 20 65 61 73  ue, it seems eas
b570: 69 65 72 20 6a 75 73 74 20 74 6f 20 69 6e 69 74  ier just to init
b580: 69 61 6c 69 7a 65 0a 20 20 2a 2a 20 74 68 65 20  ialize.  ** the 
b590: 77 68 6f 6c 65 20 61 72 72 61 79 20 61 6e 64 20  whole array and 
b5a0: 73 69 6c 65 6e 63 65 20 76 61 6c 67 72 69 6e 64  silence valgrind
b5b0: 2c 20 65 76 65 6e 20 69 66 20 74 68 61 74 20 6d  , even if that m
b5c0: 65 61 6e 73 20 6c 65 73 73 20 72 61 6e 64 6f 6d  eans less random
b5d0: 6e 65 73 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65  ness.  ** in the
b5e0: 20 72 61 6e 64 6f 6d 20 73 65 65 64 2e 0a 20 20   random seed..  
b5f0: 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 74 65 73  **.  ** When tes
b600: 74 69 6e 67 2c 20 69 6e 69 74 69 61 6c 69 7a 69  ting, initializi
b610: 6e 67 20 7a 42 75 66 5b 5d 20 74 6f 20 7a 65 72  ng zBuf[] to zer
b620: 6f 20 69 73 20 61 6c 6c 20 77 65 20 64 6f 2e 20  o is all we do. 
b630: 20 54 68 61 74 20 6d 65 61 6e 73 0a 20 20 2a 2a   That means.  **
b640: 20 74 68 61 74 20 77 65 20 61 6c 77 61 79 73 20   that we always 
b650: 75 73 65 20 74 68 65 20 73 61 6d 65 20 72 61 6e  use the same ran
b660: 64 6f 6d 20 6e 75 6d 62 65 72 20 73 65 71 75 65  dom number seque
b670: 6e 63 65 2e 2a 20 54 68 69 73 20 6d 61 6b 65 73  nce.* This makes
b680: 20 74 68 65 0a 20 20 2a 2a 20 74 65 73 74 73 20   the.  ** tests 
b690: 72 65 70 65 61 74 61 62 6c 65 2e 0a 20 20 2a 2f  repeatable..  */
b6a0: 0a 20 20 6d 65 6d 73 65 74 28 7a 42 75 66 2c 20  .  memset(zBuf, 
b6b0: 30 2c 20 32 35 36 29 3b 0a 23 69 66 20 4f 53 5f  0, 256);.#if OS_
b6c0: 55 4e 49 58 20 26 26 20 21 64 65 66 69 6e 65 64  UNIX && !defined
b6d0: 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 20 20  (SQLITE_TEST).  
b6e0: 7b 0a 20 20 20 20 69 6e 74 20 70 69 64 3b 0a 20  {.    int pid;. 
b6f0: 20 20 20 74 69 6d 65 28 28 74 69 6d 65 5f 74 2a     time((time_t*
b700: 29 7a 42 75 66 29 3b 0a 20 20 20 20 70 69 64 20  )zBuf);.    pid 
b710: 3d 20 67 65 74 70 69 64 28 29 3b 0a 20 20 20 20  = getpid();.    
b720: 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 73 69 7a  memcpy(&zBuf[siz
b730: 65 6f 66 28 74 69 6d 65 5f 74 29 5d 2c 20 26 70  eof(time_t)], &p
b740: 69 64 2c 20 73 69 7a 65 6f 66 28 70 69 64 29 29  id, sizeof(pid))
b750: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66  ;.  }.#endif.#if
b760: 20 4f 53 5f 57 49 4e 20 26 26 20 21 64 65 66 69   OS_WIN && !defi
b770: 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29  ned(SQLITE_TEST)
b780: 0a 20 20 47 65 74 53 79 73 74 65 6d 54 69 6d 65  .  GetSystemTime
b790: 28 28 4c 50 53 59 53 54 45 4d 54 49 4d 45 29 7a  ((LPSYSTEMTIME)z
b7a0: 42 75 66 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  Buf);.#endif.#if
b7b0: 20 4f 53 5f 4d 41 43 0a 20 20 7b 0a 20 20 20 20   OS_MAC.  {.    
b7c0: 69 6e 74 20 70 69 64 3b 0a 20 20 20 20 4d 69 63  int pid;.    Mic
b7d0: 72 6f 73 65 63 6f 6e 64 73 28 28 55 6e 73 69 67  roseconds((Unsig
b7e0: 6e 65 64 57 69 64 65 2a 29 7a 42 75 66 29 3b 0a  nedWide*)zBuf);.
b7f0: 20 20 20 20 70 69 64 20 3d 20 67 65 74 70 69 64      pid = getpid
b800: 28 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  ();.    memcpy(&
b810: 7a 42 75 66 5b 73 69 7a 65 6f 66 28 55 6e 73 69  zBuf[sizeof(Unsi
b820: 67 6e 65 64 57 69 64 65 29 5d 2c 20 26 70 69 64  gnedWide)], &pid
b830: 2c 20 73 69 7a 65 6f 66 28 70 69 64 29 29 3b 0a  , sizeof(pid));.
b840: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74    }.#endif.  ret
b850: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
b860: 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f  ../*.** Sleep fo
b870: 72 20 61 20 6c 69 74 74 6c 65 20 77 68 69 6c 65  r a little while
b880: 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 61 6d  .  Return the am
b890: 6f 75 6e 74 20 6f 66 20 74 69 6d 65 20 73 6c 65  ount of time sle
b8a0: 70 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  pt..*/.int sqlit
b8b0: 65 4f 73 53 6c 65 65 70 28 69 6e 74 20 6d 73 29  eOsSleep(int ms)
b8c0: 7b 0a 23 69 66 20 4f 53 5f 55 4e 49 58 0a 23 69  {.#if OS_UNIX.#i
b8d0: 66 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f 55  f defined(HAVE_U
b8e0: 53 4c 45 45 50 29 20 26 26 20 48 41 56 45 5f 55  SLEEP) && HAVE_U
b8f0: 53 4c 45 45 50 0a 20 20 75 73 6c 65 65 70 28 6d  SLEEP.  usleep(m
b900: 73 2a 31 30 30 30 29 3b 0a 20 20 72 65 74 75 72  s*1000);.  retur
b910: 6e 20 6d 73 3b 0a 23 65 6c 73 65 0a 20 20 73 6c  n ms;.#else.  sl
b920: 65 65 70 28 28 6d 73 2b 39 39 39 29 2f 31 30 30  eep((ms+999)/100
b930: 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 30 30  0);.  return 100
b940: 30 2a 28 28 6d 73 2b 39 39 39 29 2f 31 30 30 30  0*((ms+999)/1000
b950: 29 3b 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66  );.#endif.#endif
b960: 0a 23 69 66 20 4f 53 5f 57 49 4e 0a 20 20 53 6c  .#if OS_WIN.  Sl
b970: 65 65 70 28 6d 73 29 3b 0a 20 20 72 65 74 75 72  eep(ms);.  retur
b980: 6e 20 6d 73 3b 0a 23 65 6e 64 69 66 0a 23 69 66  n ms;.#endif.#if
b990: 20 4f 53 5f 4d 41 43 0a 20 20 55 49 6e 74 33 32   OS_MAC.  UInt32
b9a0: 20 66 69 6e 61 6c 54 69 63 6b 73 3b 0a 20 20 55   finalTicks;.  U
b9b0: 49 6e 74 33 32 20 74 69 63 6b 73 20 3d 20 28 28  Int32 ticks = ((
b9c0: 28 55 49 6e 74 33 32 29 6d 73 2b 31 36 29 2a 33  (UInt32)ms+16)*3
b9d0: 29 2f 35 30 3b 20 20 2f 2a 20 31 2f 36 30 20 73  )/50;  /* 1/60 s
b9e0: 65 63 20 70 65 72 20 74 69 63 6b 20 2a 2f 0a 20  ec per tick */. 
b9f0: 20 44 65 6c 61 79 28 74 69 63 6b 73 2c 20 26 66   Delay(ticks, &f
ba00: 69 6e 61 6c 54 69 63 6b 73 29 3b 0a 20 20 72 65  inalTicks);.  re
ba10: 74 75 72 6e 20 28 69 6e 74 29 28 28 74 69 63 6b  turn (int)((tick
ba20: 73 2a 35 30 29 2f 33 29 3b 0a 23 65 6e 64 69 66  s*50)/3);.#endif
ba30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 74 69 63  .}../*.** Static
ba40: 20 76 61 72 69 61 62 6c 65 73 20 75 73 65 64 20   variables used 
ba50: 66 6f 72 20 74 68 72 65 61 64 20 73 79 6e 63 68  for thread synch
ba60: 72 6f 6e 69 7a 61 74 69 6f 6e 0a 2a 2f 0a 73 74  ronization.*/.st
ba70: 61 74 69 63 20 69 6e 74 20 69 6e 4d 75 74 65 78  atic int inMutex
ba80: 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c   = 0;.#ifdef SQL
ba90: 49 54 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53  ITE_UNIX_THREADS
baa0: 0a 20 20 73 74 61 74 69 63 20 70 74 68 72 65 61  .  static pthrea
bab0: 64 5f 6d 75 74 65 78 5f 74 20 6d 75 74 65 78 20  d_mutex_t mutex 
bac0: 3d 20 50 54 48 52 45 41 44 5f 4d 55 54 45 58 5f  = PTHREAD_MUTEX_
bad0: 49 4e 49 54 49 41 4c 49 5a 45 52 3b 0a 23 65 6e  INITIALIZER;.#en
bae0: 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
baf0: 45 5f 57 33 32 5f 54 48 52 45 41 44 53 0a 20 20  E_W32_THREADS.  
bb00: 73 74 61 74 69 63 20 43 52 49 54 49 43 41 4c 5f  static CRITICAL_
bb10: 53 45 43 54 49 4f 4e 20 63 73 3b 0a 23 65 6e 64  SECTION cs;.#end
bb20: 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  if.#ifdef SQLITE
bb30: 5f 4d 41 43 4f 53 5f 4d 55 4c 54 49 54 41 53 4b  _MACOS_MULTITASK
bb40: 49 4e 47 0a 20 20 73 74 61 74 69 63 20 4d 50 43  ING.  static MPC
bb50: 72 69 74 69 63 61 6c 52 65 67 69 6f 6e 49 44 20  riticalRegionID 
bb60: 63 72 69 74 69 63 61 6c 52 65 67 69 6f 6e 3b 0a  criticalRegion;.
bb70: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
bb80: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 61 69 72  e following pair
bb90: 20 6f 66 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c   of routine impl
bba0: 65 6d 65 6e 74 20 6d 75 74 75 61 6c 20 65 78 63  ement mutual exc
bbb0: 6c 75 73 69 6f 6e 20 66 6f 72 0a 2a 2a 20 6d 75  lusion for.** mu
bbc0: 6c 74 69 2d 74 68 72 65 61 64 65 64 20 70 72 6f  lti-threaded pro
bbd0: 63 65 73 73 65 73 2e 20 20 4f 6e 6c 79 20 61 20  cesses.  Only a 
bbe0: 73 69 6e 67 6c 65 20 74 68 72 65 61 64 20 69 73  single thread is
bbf0: 20 61 6c 6c 6f 77 65 64 20 74 6f 0a 2a 2a 20 65   allowed to.** e
bc00: 78 65 63 75 74 65 64 20 63 6f 64 65 20 74 68 61  xecuted code tha
bc10: 74 20 69 73 20 73 75 72 72 6f 75 6e 64 65 64 20  t is surrounded 
bc20: 62 79 20 45 6e 74 65 72 4d 75 74 65 78 28 29 20  by EnterMutex() 
bc30: 61 6e 64 20 4c 65 61 76 65 4d 75 74 65 78 28 29  and LeaveMutex()
bc40: 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 75  ..**.** SQLite u
bc50: 73 65 73 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c  ses only a singl
bc60: 65 20 4d 75 74 65 78 2e 20 20 54 68 65 72 65 20  e Mutex.  There 
bc70: 69 73 20 6e 6f 74 20 6d 75 63 68 20 63 72 69 74  is not much crit
bc80: 69 63 61 6c 0a 2a 2a 20 63 6f 64 65 20 61 6e 64  ical.** code and
bc90: 20 77 68 61 74 20 6c 69 74 74 6c 65 20 74 68 65   what little the
bca0: 72 65 20 69 73 20 65 78 65 63 75 74 65 73 20 71  re is executes q
bcb0: 75 69 63 6b 6c 79 20 61 6e 64 20 77 69 74 68 6f  uickly and witho
bcc0: 75 74 20 62 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a  ut blocking..*/.
bcd0: 76 6f 69 64 20 73 71 6c 69 74 65 4f 73 45 6e 74  void sqliteOsEnt
bce0: 65 72 4d 75 74 65 78 28 29 7b 0a 23 69 66 64 65  erMutex(){.#ifde
bcf0: 66 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f 54 48  f SQLITE_UNIX_TH
bd00: 52 45 41 44 53 0a 20 20 70 74 68 72 65 61 64 5f  READS.  pthread_
bd10: 6d 75 74 65 78 5f 6c 6f 63 6b 28 26 6d 75 74 65  mutex_lock(&mute
bd20: 78 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  x);.#endif.#ifde
bd30: 66 20 53 51 4c 49 54 45 5f 57 33 32 5f 54 48 52  f SQLITE_W32_THR
bd40: 45 41 44 53 0a 20 20 73 74 61 74 69 63 20 69 6e  EADS.  static in
bd50: 74 20 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20  t isInit = 0;.  
bd60: 77 68 69 6c 65 28 20 21 69 73 49 6e 69 74 20 29  while( !isInit )
bd70: 7b 0a 20 20 20 20 73 74 61 74 69 63 20 6c 6f 6e  {.    static lon
bd80: 67 20 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20 20 20  g lock = 0;.    
bd90: 69 66 28 20 49 6e 74 65 72 6c 6f 63 6b 65 64 49  if( InterlockedI
bda0: 6e 63 72 65 6d 65 6e 74 28 26 6c 6f 63 6b 29 3d  ncrement(&lock)=
bdb0: 3d 31 20 29 7b 0a 20 20 20 20 20 20 49 6e 69 74  =1 ){.      Init
bdc0: 69 61 6c 69 7a 65 43 72 69 74 69 63 61 6c 53 65  ializeCriticalSe
bdd0: 63 74 69 6f 6e 28 26 63 73 29 3b 0a 20 20 20 20  ction(&cs);.    
bde0: 20 20 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20    isInit = 1;.  
bdf0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 53    }else{.      S
be00: 6c 65 65 70 28 31 29 3b 0a 20 20 20 20 7d 0a 20  leep(1);.    }. 
be10: 20 7d 0a 20 20 45 6e 74 65 72 43 72 69 74 69 63   }.  EnterCritic
be20: 61 6c 53 65 63 74 69 6f 6e 28 26 63 73 29 3b 0a  alSection(&cs);.
be30: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51  #endif.#ifdef SQ
be40: 4c 49 54 45 5f 4d 41 43 4f 53 5f 4d 55 4c 54 49  LITE_MACOS_MULTI
be50: 54 41 53 4b 49 4e 47 0a 20 20 73 74 61 74 69 63  TASKING.  static
be60: 20 76 6f 6c 61 74 69 6c 65 20 69 6e 74 20 6e 6f   volatile int no
be70: 74 49 6e 69 74 20 3d 20 31 3b 0a 20 20 69 66 28  tInit = 1;.  if(
be80: 20 6e 6f 74 49 6e 69 74 20 29 7b 0a 20 20 20 20   notInit ){.    
be90: 69 66 28 20 6e 6f 74 49 6e 69 74 20 3d 3d 20 32  if( notInit == 2
bea0: 20 29 20 2f 2a 20 61 73 20 63 6c 6f 73 65 20 61   ) /* as close a
beb0: 73 20 79 6f 75 20 63 61 6e 20 67 65 74 20 74 6f  s you can get to
bec0: 20 74 68 72 65 61 64 20 73 61 66 65 20 69 6e 69   thread safe ini
bed0: 74 20 2a 2f 0a 20 20 20 20 20 20 4d 50 59 69 65  t */.      MPYie
bee0: 6c 64 28 29 3b 0a 20 20 20 20 65 6c 73 65 7b 0a  ld();.    else{.
bef0: 20 20 20 20 20 20 6e 6f 74 49 6e 69 74 20 3d 20        notInit = 
bf00: 32 3b 0a 20 20 20 20 20 20 4d 50 43 72 65 61 74  2;.      MPCreat
bf10: 65 43 72 69 74 69 63 61 6c 52 65 67 69 6f 6e 28  eCriticalRegion(
bf20: 26 63 72 69 74 69 63 61 6c 52 65 67 69 6f 6e 29  &criticalRegion)
bf30: 3b 0a 20 20 20 20 20 20 6e 6f 74 49 6e 69 74 20  ;.      notInit 
bf40: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 0;.    }.  }. 
bf50: 20 4d 50 45 6e 74 65 72 43 72 69 74 69 63 61 6c   MPEnterCritical
bf60: 52 65 67 69 6f 6e 28 63 72 69 74 69 63 61 6c 52  Region(criticalR
bf70: 65 67 69 6f 6e 2c 20 6b 44 75 72 61 74 69 6f 6e  egion, kDuration
bf80: 46 6f 72 65 76 65 72 29 3b 0a 23 65 6e 64 69 66  Forever);.#endif
bf90: 0a 20 20 61 73 73 65 72 74 28 20 21 69 6e 4d 75  .  assert( !inMu
bfa0: 74 65 78 20 29 3b 0a 20 20 69 6e 4d 75 74 65 78  tex );.  inMutex
bfb0: 20 3d 20 31 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c   = 1;.}.void sql
bfc0: 69 74 65 4f 73 4c 65 61 76 65 4d 75 74 65 78 28  iteOsLeaveMutex(
bfd0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 6e 4d  ){.  assert( inM
bfe0: 75 74 65 78 20 29 3b 0a 20 20 69 6e 4d 75 74 65  utex );.  inMute
bff0: 78 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51  x = 0;.#ifdef SQ
c000: 4c 49 54 45 5f 55 4e 49 58 5f 54 48 52 45 41 44  LITE_UNIX_THREAD
c010: 53 0a 20 20 70 74 68 72 65 61 64 5f 6d 75 74 65  S.  pthread_mute
c020: 78 5f 75 6e 6c 6f 63 6b 28 26 6d 75 74 65 78 29  x_unlock(&mutex)
c030: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  ;.#endif.#ifdef 
c040: 53 51 4c 49 54 45 5f 57 33 32 5f 54 48 52 45 41  SQLITE_W32_THREA
c050: 44 53 0a 20 20 4c 65 61 76 65 43 72 69 74 69 63  DS.  LeaveCritic
c060: 61 6c 53 65 63 74 69 6f 6e 28 26 63 73 29 3b 0a  alSection(&cs);.
c070: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51  #endif.#ifdef SQ
c080: 4c 49 54 45 5f 4d 41 43 4f 53 5f 4d 55 4c 54 49  LITE_MACOS_MULTI
c090: 54 41 53 4b 49 4e 47 0a 20 20 4d 50 45 78 69 74  TASKING.  MPExit
c0a0: 43 72 69 74 69 63 61 6c 52 65 67 69 6f 6e 28 63  CriticalRegion(c
c0b0: 72 69 74 69 63 61 6c 52 65 67 69 6f 6e 29 3b 0a  riticalRegion);.
c0c0: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
c0d0: 54 75 72 6e 20 61 20 72 65 6c 61 74 69 76 65 20  Turn a relative 
c0e0: 70 61 74 68 6e 61 6d 65 20 69 6e 74 6f 20 61 20  pathname into a 
c0f0: 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 2e 20 20  full pathname.  
c100: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
c110: 0a 2a 2a 20 74 6f 20 74 68 65 20 66 75 6c 6c 20  .** to the full 
c120: 70 61 74 68 6e 61 6d 65 20 73 74 6f 72 65 64 20  pathname stored 
c130: 69 6e 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65  in space obtaine
c140: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c  d from sqliteMal
c150: 6c 6f 63 28 29 2e 0a 2a 2a 20 54 68 65 20 63 61  loc()..** The ca
c160: 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 69  lling function i
c170: 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
c180: 72 20 66 72 65 65 69 6e 67 20 74 68 69 73 20 73  r freeing this s
c190: 70 61 63 65 20 6f 6e 63 65 20 69 74 0a 2a 2a 20  pace once it.** 
c1a0: 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6e 65 65  is no longer nee
c1b0: 64 65 64 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71  ded..*/.char *sq
c1c0: 6c 69 74 65 4f 73 46 75 6c 6c 50 61 74 68 6e 61  liteOsFullPathna
c1d0: 6d 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  me(const char *z
c1e0: 52 65 6c 61 74 69 76 65 29 7b 0a 23 69 66 20 4f  Relative){.#if O
c1f0: 53 5f 55 4e 49 58 0a 20 20 63 68 61 72 20 2a 7a  S_UNIX.  char *z
c200: 46 75 6c 6c 20 3d 20 30 3b 0a 20 20 69 66 28 20  Full = 0;.  if( 
c210: 7a 52 65 6c 61 74 69 76 65 5b 30 5d 3d 3d 27 2f  zRelative[0]=='/
c220: 27 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 53  ' ){.    sqliteS
c230: 65 74 53 74 72 69 6e 67 28 26 7a 46 75 6c 6c 2c  etString(&zFull,
c240: 20 7a 52 65 6c 61 74 69 76 65 2c 20 28 63 68 61   zRelative, (cha
c250: 72 2a 29 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  r*)0);.  }else{.
c260: 20 20 20 20 63 68 61 72 20 7a 42 75 66 5b 35 30      char zBuf[50
c270: 30 30 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 53  00];.    sqliteS
c280: 65 74 53 74 72 69 6e 67 28 26 7a 46 75 6c 6c 2c  etString(&zFull,
c290: 20 67 65 74 63 77 64 28 7a 42 75 66 2c 20 73 69   getcwd(zBuf, si
c2a0: 7a 65 6f 66 28 7a 42 75 66 29 29 2c 20 22 2f 22  zeof(zBuf)), "/"
c2b0: 2c 20 7a 52 65 6c 61 74 69 76 65 2c 0a 20 20 20  , zRelative,.   
c2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c2d0: 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 7d 0a   (char*)0);.  }.
c2e0: 20 20 72 65 74 75 72 6e 20 7a 46 75 6c 6c 3b 0a    return zFull;.
c2f0: 23 65 6e 64 69 66 0a 23 69 66 20 4f 53 5f 57 49  #endif.#if OS_WI
c300: 4e 0a 20 20 63 68 61 72 20 2a 7a 4e 6f 74 55 73  N.  char *zNotUs
c310: 65 64 3b 0a 20 20 63 68 61 72 20 2a 7a 46 75 6c  ed;.  char *zFul
c320: 6c 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a  l;.  int nByte;.
c330: 20 20 6e 42 79 74 65 20 3d 20 47 65 74 46 75 6c    nByte = GetFul
c340: 6c 50 61 74 68 4e 61 6d 65 28 7a 52 65 6c 61 74  lPathName(zRelat
c350: 69 76 65 2c 20 30 2c 20 30 2c 20 26 7a 4e 6f 74  ive, 0, 0, &zNot
c360: 55 73 65 64 29 20 2b 20 31 3b 0a 20 20 7a 46 75  Used) + 1;.  zFu
c370: 6c 6c 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  ll = sqliteMallo
c380: 63 28 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66  c( nByte );.  if
c390: 28 20 7a 46 75 6c 6c 3d 3d 30 20 29 20 72 65 74  ( zFull==0 ) ret
c3a0: 75 72 6e 20 30 3b 0a 20 20 47 65 74 46 75 6c 6c  urn 0;.  GetFull
c3b0: 50 61 74 68 4e 61 6d 65 28 7a 52 65 6c 61 74 69  PathName(zRelati
c3c0: 76 65 2c 20 6e 42 79 74 65 2c 20 7a 46 75 6c 6c  ve, nByte, zFull
c3d0: 2c 20 26 7a 4e 6f 74 55 73 65 64 29 3b 0a 20 20  , &zNotUsed);.  
c3e0: 72 65 74 75 72 6e 20 7a 46 75 6c 6c 3b 0a 23 65  return zFull;.#e
c3f0: 6e 64 69 66 0a 23 69 66 20 4f 53 5f 4d 41 43 0a  ndif.#if OS_MAC.
c400: 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 20 3d 20    char *zFull = 
c410: 30 3b 0a 20 20 69 66 28 20 7a 52 65 6c 61 74 69  0;.  if( zRelati
c420: 76 65 5b 30 5d 3d 3d 27 3a 27 20 29 7b 0a 20 20  ve[0]==':' ){.  
c430: 20 20 63 68 61 72 20 7a 42 75 66 5b 5f 4d 41 58    char zBuf[_MAX
c440: 5f 50 41 54 48 2b 31 5d 3b 0a 20 20 20 20 73 71  _PATH+1];.    sq
c450: 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 7a  liteSetString(&z
c460: 46 75 6c 6c 2c 20 67 65 74 63 77 64 28 7a 42 75  Full, getcwd(zBu
c470: 66 2c 20 73 69 7a 65 6f 66 28 7a 42 75 66 29 29  f, sizeof(zBuf))
c480: 2c 20 26 28 7a 52 65 6c 61 74 69 76 65 5b 31 5d  , &(zRelative[1]
c490: 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
c4a0: 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 30 29         (char*)0)
c4b0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
c4c0: 66 28 20 73 74 72 63 68 72 28 7a 52 65 6c 61 74  f( strchr(zRelat
c4d0: 69 76 65 2c 20 27 3a 27 29 20 29 7b 0a 20 20 20  ive, ':') ){.   
c4e0: 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69     sqliteSetStri
c4f0: 6e 67 28 26 7a 46 75 6c 6c 2c 20 7a 52 65 6c 61  ng(&zFull, zRela
c500: 74 69 76 65 2c 20 28 63 68 61 72 2a 29 30 29 3b  tive, (char*)0);
c510: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
c520: 63 68 61 72 20 7a 42 75 66 5b 5f 4d 41 58 5f 50  char zBuf[_MAX_P
c530: 41 54 48 2b 31 5d 3b 0a 20 20 20 20 20 20 73 71  ATH+1];.      sq
c540: 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 7a  liteSetString(&z
c550: 46 75 6c 6c 2c 20 67 65 74 63 77 64 28 7a 42 75  Full, getcwd(zBu
c560: 66 2c 20 73 69 7a 65 6f 66 28 7a 42 75 66 29 29  f, sizeof(zBuf))
c570: 2c 20 7a 52 65 6c 61 74 69 76 65 2c 20 28 63 68  , zRelative, (ch
c580: 61 72 2a 29 30 29 3b 0a 20 20 20 20 7d 0a 20 20  ar*)0);.    }.  
c590: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 46 75 6c 6c  }.  return zFull
c5a0: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
c5b0: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
c5c0: 76 61 72 69 61 62 6c 65 2c 20 69 66 20 73 65 74  variable, if set
c5d0: 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76   to a non-zero v
c5e0: 61 6c 75 65 2c 20 62 65 63 6f 6d 65 73 20 74 68  alue, becomes th
c5f0: 65 20 72 65 73 75 6c 74 0a 2a 2a 20 72 65 74 75  e result.** retu
c600: 72 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  rned from sqlite
c610: 4f 73 43 75 72 72 65 6e 74 54 69 6d 65 28 29 2e  OsCurrentTime().
c620: 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20 66    This is used f
c630: 6f 72 20 74 65 73 74 69 6e 67 2e 0a 2a 2f 0a 23  or testing..*/.#
c640: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
c650: 54 0a 69 6e 74 20 73 71 6c 69 74 65 5f 63 75 72  T.int sqlite_cur
c660: 72 65 6e 74 5f 74 69 6d 65 20 3d 20 30 3b 0a 23  rent_time = 0;.#
c670: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e  endif../*.** Fin
c680: 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 69  d the current ti
c690: 6d 65 20 28 69 6e 20 55 6e 69 76 65 72 73 61 6c  me (in Universal
c6a0: 20 43 6f 6f 72 64 69 6e 61 74 65 64 20 54 69 6d   Coordinated Tim
c6b0: 65 29 2e 20 20 57 72 69 74 65 20 74 68 65 0a 2a  e).  Write the.*
c6c0: 2a 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 61  * current time a
c6d0: 6e 64 20 64 61 74 65 20 61 73 20 61 20 4a 75 6c  nd date as a Jul
c6e0: 69 61 6e 20 44 61 79 20 6e 75 6d 62 65 72 20 69  ian Day number i
c6f0: 6e 74 6f 20 2a 70 72 4e 6f 77 20 61 6e 64 0a 2a  nto *prNow and.*
c700: 2a 20 72 65 74 75 72 6e 20 30 2e 20 20 52 65 74  * return 0.  Ret
c710: 75 72 6e 20 31 20 69 66 20 74 68 65 20 74 69 6d  urn 1 if the tim
c720: 65 20 61 6e 64 20 64 61 74 65 20 63 61 6e 6e 6f  e and date canno
c730: 74 20 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69  t be found..*/.i
c740: 6e 74 20 73 71 6c 69 74 65 4f 73 43 75 72 72 65  nt sqliteOsCurre
c750: 6e 74 54 69 6d 65 28 64 6f 75 62 6c 65 20 2a 70  ntTime(double *p
c760: 72 4e 6f 77 29 7b 0a 23 69 66 20 4f 53 5f 55 4e  rNow){.#if OS_UN
c770: 49 58 0a 20 20 74 69 6d 65 5f 74 20 74 3b 0a 20  IX.  time_t t;. 
c780: 20 74 69 6d 65 28 26 74 29 3b 0a 20 20 2a 70 72   time(&t);.  *pr
c790: 4e 6f 77 20 3d 20 74 2f 38 36 34 30 30 2e 30 20  Now = t/86400.0 
c7a0: 2b 20 32 34 34 30 35 38 37 2e 35 3b 0a 23 65 6e  + 2440587.5;.#en
c7b0: 64 69 66 0a 23 69 66 20 4f 53 5f 57 49 4e 0a 20  dif.#if OS_WIN. 
c7c0: 20 46 49 4c 45 54 49 4d 45 20 66 74 3b 0a 20 20   FILETIME ft;.  
c7d0: 2f 2a 20 46 49 4c 45 54 49 4d 45 20 73 74 72 75  /* FILETIME stru
c7e0: 63 74 75 72 65 20 69 73 20 61 20 36 34 2d 62 69  cture is a 64-bi
c7f0: 74 20 76 61 6c 75 65 20 72 65 70 72 65 73 65 6e  t value represen
c800: 74 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72 20  ting the number 
c810: 6f 66 20 0a 20 20 20 20 20 31 30 30 2d 6e 61 6e  of .     100-nan
c820: 6f 73 65 63 6f 6e 64 20 69 6e 74 65 72 76 61 6c  osecond interval
c830: 73 20 73 69 6e 63 65 20 4a 61 6e 75 61 72 79 20  s since January 
c840: 31 2c 20 31 36 30 31 20 28 3d 20 4a 44 20 32 33  1, 1601 (= JD 23
c850: 30 35 38 31 33 2e 35 29 2e 20 0a 20 20 2a 2f 0a  05813.5). .  */.
c860: 20 20 64 6f 75 62 6c 65 20 6e 6f 77 3b 0a 20 20    double now;.  
c870: 47 65 74 53 79 73 74 65 6d 54 69 6d 65 41 73 46  GetSystemTimeAsF
c880: 69 6c 65 54 69 6d 65 28 20 26 66 74 20 29 3b 0a  ileTime( &ft );.
c890: 20 20 6e 6f 77 20 3d 20 28 28 64 6f 75 62 6c 65    now = ((double
c8a0: 29 66 74 2e 64 77 48 69 67 68 44 61 74 65 54 69  )ft.dwHighDateTi
c8b0: 6d 65 29 20 2a 20 34 32 39 34 39 36 37 32 39 36  me) * 4294967296
c8c0: 2e 30 3b 20 0a 20 20 2a 70 72 4e 6f 77 20 3d 20  .0; .  *prNow = 
c8d0: 28 6e 6f 77 20 2b 20 66 74 2e 64 77 4c 6f 77 44  (now + ft.dwLowD
c8e0: 61 74 65 54 69 6d 65 29 2f 38 36 34 30 30 30 30  ateTime)/8640000
c8f0: 30 30 30 30 30 2e 30 20 2b 20 32 33 30 35 38 31  00000.0 + 230581
c900: 33 2e 35 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64  3.5;.#endif.#ifd
c910: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
c920: 20 69 66 28 20 73 71 6c 69 74 65 5f 63 75 72 72   if( sqlite_curr
c930: 65 6e 74 5f 74 69 6d 65 20 29 7b 0a 20 20 20 20  ent_time ){.    
c940: 2a 70 72 4e 6f 77 20 3d 20 73 71 6c 69 74 65 5f  *prNow = sqlite_
c950: 63 75 72 72 65 6e 74 5f 74 69 6d 65 2f 38 36 34  current_time/864
c960: 30 30 2e 30 20 2b 20 32 34 34 30 35 38 37 2e 35  00.0 + 2440587.5
c970: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72  ;.  }.#endif.  r
c980: 65 74 75 72 6e 20 30 3b 0a 7d 0a                 eturn 0;.}.