/ Hex Artifact Content
Login

Artifact 681ec36217bc7c795d55d9a63ff79a8614ddee8c:


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 20 20 20 20 69 64 2d 3e  fd<0 ){.    id->
3a30: 66 64 20 3d 20 6f 70 65 6e 28 7a 46 69 6c 65 6e  fd = open(zFilen
3a40: 61 6d 65 2c 20 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f  ame, O_RDONLY|O_
3a50: 4c 41 52 47 45 46 49 4c 45 7c 4f 5f 42 49 4e 41  LARGEFILE|O_BINA
3a60: 52 59 29 3b 0a 20 20 20 20 69 66 28 20 69 64 2d  RY);.    if( id-
3a70: 3e 66 64 3c 30 20 29 7b 0a 20 20 20 20 20 20 72  >fd<0 ){.      r
3a80: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e  eturn SQLITE_CAN
3a90: 54 4f 50 45 4e 3b 20 0a 20 20 20 20 7d 0a 20 20  TOPEN; .    }.  
3aa0: 20 20 2a 70 52 65 61 64 6f 6e 6c 79 20 3d 20 31    *pReadonly = 1
3ab0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a  ;.  }else{.    *
3ac0: 70 52 65 61 64 6f 6e 6c 79 20 3d 20 30 3b 0a 20  pReadonly = 0;. 
3ad0: 20 7d 0a 20 20 73 71 6c 69 74 65 4f 73 45 6e 74   }.  sqliteOsEnt
3ae0: 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 72 63 20  erMutex();.  rc 
3af0: 3d 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28 69  = findLockInfo(i
3b00: 64 2d 3e 66 64 2c 20 26 69 64 2d 3e 70 4c 6f 63  d->fd, &id->pLoc
3b10: 6b 2c 20 26 69 64 2d 3e 70 4f 70 65 6e 29 3b 0a  k, &id->pOpen);.
3b20: 20 20 73 71 6c 69 74 65 4f 73 4c 65 61 76 65 4d    sqliteOsLeaveM
3b30: 75 74 65 78 28 29 3b 0a 20 20 69 66 28 20 72 63  utex();.  if( rc
3b40: 20 29 7b 0a 20 20 20 20 63 6c 6f 73 65 28 69 64   ){.    close(id
3b50: 2d 3e 66 64 29 3b 0a 20 20 20 20 72 65 74 75 72  ->fd);.    retur
3b60: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
3b70: 20 20 7d 0a 20 20 69 64 2d 3e 6c 6f 63 6b 65 64    }.  id->locked
3b80: 20 3d 20 30 3b 0a 20 20 54 52 41 43 45 33 28 22   = 0;.  TRACE3("
3b90: 4f 50 45 4e 20 20 20 20 25 2d 33 64 20 25 73 5c  OPEN    %-3d %s\
3ba0: 6e 22 2c 20 69 64 2d 3e 66 64 2c 20 7a 46 69 6c  n", id->fd, zFil
3bb0: 65 6e 61 6d 65 29 3b 0a 20 20 4f 70 65 6e 43 6f  ename);.  OpenCo
3bc0: 75 6e 74 65 72 28 2b 31 29 3b 0a 20 20 72 65 74  unter(+1);.  ret
3bd0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23  urn SQLITE_OK;.#
3be0: 65 6e 64 69 66 0a 23 69 66 20 4f 53 5f 57 49 4e  endif.#if OS_WIN
3bf0: 0a 20 20 48 41 4e 44 4c 45 20 68 20 3d 20 43 72  .  HANDLE h = Cr
3c00: 65 61 74 65 46 69 6c 65 28 7a 46 69 6c 65 6e 61  eateFile(zFilena
3c10: 6d 65 2c 0a 20 20 20 20 20 47 45 4e 45 52 49 43  me,.     GENERIC
3c20: 5f 52 45 41 44 20 7c 20 47 45 4e 45 52 49 43 5f  _READ | GENERIC_
3c30: 57 52 49 54 45 2c 0a 20 20 20 20 20 46 49 4c 45  WRITE,.     FILE
3c40: 5f 53 48 41 52 45 5f 52 45 41 44 20 7c 20 46 49  _SHARE_READ | FI
3c50: 4c 45 5f 53 48 41 52 45 5f 57 52 49 54 45 2c 0a  LE_SHARE_WRITE,.
3c60: 20 20 20 20 20 4e 55 4c 4c 2c 0a 20 20 20 20 20       NULL,.     
3c70: 4f 50 45 4e 5f 41 4c 57 41 59 53 2c 0a 20 20 20  OPEN_ALWAYS,.   
3c80: 20 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45    FILE_ATTRIBUTE
3c90: 5f 4e 4f 52 4d 41 4c 20 7c 20 46 49 4c 45 5f 46  _NORMAL | FILE_F
3ca0: 4c 41 47 5f 52 41 4e 44 4f 4d 5f 41 43 43 45 53  LAG_RANDOM_ACCES
3cb0: 53 2c 0a 20 20 20 20 20 4e 55 4c 4c 0a 20 20 29  S,.     NULL.  )
3cc0: 3b 0a 20 20 69 66 28 20 68 3d 3d 49 4e 56 41 4c  ;.  if( h==INVAL
3cd0: 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20  ID_HANDLE_VALUE 
3ce0: 29 7b 0a 20 20 20 20 68 20 3d 20 43 72 65 61 74  ){.    h = Creat
3cf0: 65 46 69 6c 65 28 7a 46 69 6c 65 6e 61 6d 65 2c  eFile(zFilename,
3d00: 0a 20 20 20 20 20 20 20 47 45 4e 45 52 49 43 5f  .       GENERIC_
3d10: 52 45 41 44 2c 0a 20 20 20 20 20 20 20 46 49 4c  READ,.       FIL
3d20: 45 5f 53 48 41 52 45 5f 52 45 41 44 2c 0a 20 20  E_SHARE_READ,.  
3d30: 20 20 20 20 20 4e 55 4c 4c 2c 0a 20 20 20 20 20       NULL,.     
3d40: 20 20 4f 50 45 4e 5f 41 4c 57 41 59 53 2c 0a 20    OPEN_ALWAYS,. 
3d50: 20 20 20 20 20 20 46 49 4c 45 5f 41 54 54 52 49        FILE_ATTRI
3d60: 42 55 54 45 5f 4e 4f 52 4d 41 4c 20 7c 20 46 49  BUTE_NORMAL | FI
3d70: 4c 45 5f 46 4c 41 47 5f 52 41 4e 44 4f 4d 5f 41  LE_FLAG_RANDOM_A
3d80: 43 43 45 53 53 2c 0a 20 20 20 20 20 20 20 4e 55  CCESS,.       NU
3d90: 4c 4c 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66  LL.    );.    if
3da0: 28 20 68 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e  ( h==INVALID_HAN
3db0: 44 4c 45 5f 56 41 4c 55 45 20 29 7b 0a 20 20 20  DLE_VALUE ){.   
3dc0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
3dd0: 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 20 20 7d  _CANTOPEN;.    }
3de0: 0a 20 20 20 20 2a 70 52 65 61 64 6f 6e 6c 79 20  .    *pReadonly 
3df0: 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 1;.  }else{.  
3e00: 20 20 2a 70 52 65 61 64 6f 6e 6c 79 20 3d 20 30    *pReadonly = 0
3e10: 3b 0a 20 20 7d 0a 20 20 69 64 2d 3e 68 20 3d 20  ;.  }.  id->h = 
3e20: 68 3b 0a 20 20 69 64 2d 3e 6c 6f 63 6b 65 64 20  h;.  id->locked 
3e30: 3d 20 30 3b 0a 20 20 4f 70 65 6e 43 6f 75 6e 74  = 0;.  OpenCount
3e40: 65 72 28 2b 31 29 3b 0a 20 20 72 65 74 75 72 6e  er(+1);.  return
3e50: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64   SQLITE_OK;.#end
3e60: 69 66 0a 23 69 66 20 4f 53 5f 4d 41 43 0a 20 20  if.#if OS_MAC.  
3e70: 46 53 53 70 65 63 20 66 73 53 70 65 63 3b 0a 23  FSSpec fsSpec;.#
3e80: 20 69 66 64 65 66 20 5f 4c 41 52 47 45 5f 46 49   ifdef _LARGE_FI
3e90: 4c 45 0a 20 20 48 46 53 55 6e 69 53 74 72 32 35  LE.  HFSUniStr25
3ea0: 35 20 64 66 4e 61 6d 65 3b 0a 20 20 46 53 52 65  5 dfName;.  FSRe
3eb0: 66 20 66 73 52 65 66 3b 0a 20 20 69 66 28 20 5f  f fsRef;.  if( _
3ec0: 5f 70 61 74 68 32 66 73 73 28 7a 46 69 6c 65 6e  _path2fss(zFilen
3ed0: 61 6d 65 2c 20 26 66 73 53 70 65 63 29 20 21 3d  ame, &fsSpec) !=
3ee0: 20 6e 6f 45 72 72 20 29 7b 0a 20 20 20 20 69 66   noErr ){.    if
3ef0: 28 20 48 43 72 65 61 74 65 28 66 73 53 70 65 63  ( HCreate(fsSpec
3f00: 2e 76 52 65 66 4e 75 6d 2c 20 66 73 53 70 65 63  .vRefNum, fsSpec
3f10: 2e 70 61 72 49 44 2c 20 66 73 53 70 65 63 2e 6e  .parID, fsSpec.n
3f20: 61 6d 65 2c 20 27 53 51 4c 49 27 2c 20 63 44 6f  ame, 'SQLI', cDo
3f30: 63 75 6d 65 6e 74 46 69 6c 65 29 20 21 3d 20 6e  cumentFile) != n
3f40: 6f 45 72 72 20 29 0a 20 20 20 20 20 20 72 65 74  oErr ).      ret
3f50: 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  urn SQLITE_CANTO
3f60: 50 45 4e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 46  PEN;.  }.  if( F
3f70: 53 70 4d 61 6b 65 46 53 52 65 66 28 26 66 73 53  SpMakeFSRef(&fsS
3f80: 70 65 63 2c 20 26 66 73 52 65 66 29 20 21 3d 20  pec, &fsRef) != 
3f90: 6e 6f 45 72 72 20 29 0a 20 20 20 20 72 65 74 75  noErr ).    retu
3fa0: 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  rn SQLITE_CANTOP
3fb0: 45 4e 3b 0a 20 20 46 53 47 65 74 44 61 74 61 46  EN;.  FSGetDataF
3fc0: 6f 72 6b 4e 61 6d 65 28 26 64 66 4e 61 6d 65 29  orkName(&dfName)
3fd0: 3b 0a 20 20 69 66 28 20 46 53 4f 70 65 6e 46 6f  ;.  if( FSOpenFo
3fe0: 72 6b 28 26 66 73 52 65 66 2c 20 64 66 4e 61 6d  rk(&fsRef, dfNam
3ff0: 65 2e 6c 65 6e 67 74 68 2c 20 64 66 4e 61 6d 65  e.length, dfName
4000: 2e 75 6e 69 63 6f 64 65 2c 0a 20 20 20 20 20 20  .unicode,.      
4010: 20 20 20 20 20 20 20 20 20 20 20 66 73 52 64 57             fsRdW
4020: 72 53 68 50 65 72 6d 2c 20 26 28 69 64 2d 3e 72  rShPerm, &(id->r
4030: 65 66 4e 75 6d 29 29 20 21 3d 20 6e 6f 45 72 72  efNum)) != noErr
4040: 20 29 7b 0a 20 20 20 20 69 66 28 20 46 53 4f 70   ){.    if( FSOp
4050: 65 6e 46 6f 72 6b 28 26 66 73 52 65 66 2c 20 64  enFork(&fsRef, d
4060: 66 4e 61 6d 65 2e 6c 65 6e 67 74 68 2c 20 64 66  fName.length, df
4070: 4e 61 6d 65 2e 75 6e 69 63 6f 64 65 2c 0a 20 20  Name.unicode,.  
4080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4090: 20 66 73 52 64 57 72 50 65 72 6d 2c 20 26 28 69   fsRdWrPerm, &(i
40a0: 64 2d 3e 72 65 66 4e 75 6d 29 29 20 21 3d 20 6e  d->refNum)) != n
40b0: 6f 45 72 72 20 29 7b 0a 20 20 20 20 20 20 69 66  oErr ){.      if
40c0: 20 28 46 53 4f 70 65 6e 46 6f 72 6b 28 26 66 73   (FSOpenFork(&fs
40d0: 52 65 66 2c 20 64 66 4e 61 6d 65 2e 6c 65 6e 67  Ref, dfName.leng
40e0: 74 68 2c 20 64 66 4e 61 6d 65 2e 75 6e 69 63 6f  th, dfName.unico
40f0: 64 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  de,.            
4100: 20 20 20 20 20 20 20 66 73 52 64 50 65 72 6d 2c         fsRdPerm,
4110: 20 26 28 69 64 2d 3e 72 65 66 4e 75 6d 29 29 20   &(id->refNum)) 
4120: 21 3d 20 6e 6f 45 72 72 20 29 0a 20 20 20 20 20  != noErr ).     
4130: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
4140: 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 20 20 20  _CANTOPEN;.     
4150: 20 65 6c 73 65 0a 20 20 20 20 20 20 20 20 2a 70   else.        *p
4160: 52 65 61 64 6f 6e 6c 79 20 3d 20 31 3b 0a 20 20  Readonly = 1;.  
4170: 20 20 7d 20 65 6c 73 65 0a 20 20 20 20 20 20 2a    } else.      *
4180: 70 52 65 61 64 6f 6e 6c 79 20 3d 20 30 3b 0a 20  pReadonly = 0;. 
4190: 20 7d 20 65 6c 73 65 0a 20 20 20 20 2a 70 52 65   } else.    *pRe
41a0: 61 64 6f 6e 6c 79 20 3d 20 30 3b 0a 23 20 65 6c  adonly = 0;.# el
41b0: 73 65 0a 20 20 5f 5f 70 61 74 68 32 66 73 73 28  se.  __path2fss(
41c0: 7a 46 69 6c 65 6e 61 6d 65 2c 20 26 66 73 53 70  zFilename, &fsSp
41d0: 65 63 29 3b 0a 20 20 69 66 28 20 21 73 71 6c 69  ec);.  if( !sqli
41e0: 74 65 4f 73 46 69 6c 65 45 78 69 73 74 73 28 7a  teOsFileExists(z
41f0: 46 69 6c 65 6e 61 6d 65 29 20 29 7b 0a 20 20 20  Filename) ){.   
4200: 20 69 66 28 20 48 43 72 65 61 74 65 28 66 73 53   if( HCreate(fsS
4210: 70 65 63 2e 76 52 65 66 4e 75 6d 2c 20 66 73 53  pec.vRefNum, fsS
4220: 70 65 63 2e 70 61 72 49 44 2c 20 66 73 53 70 65  pec.parID, fsSpe
4230: 63 2e 6e 61 6d 65 2c 20 27 53 51 4c 49 27 2c 20  c.name, 'SQLI', 
4240: 63 44 6f 63 75 6d 65 6e 74 46 69 6c 65 29 20 21  cDocumentFile) !
4250: 3d 20 6e 6f 45 72 72 20 29 0a 20 20 20 20 20 20  = noErr ).      
4260: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41  return SQLITE_CA
4270: 4e 54 4f 50 45 4e 3b 0a 20 20 7d 0a 20 20 69 66  NTOPEN;.  }.  if
4280: 28 20 48 4f 70 65 6e 44 46 28 66 73 53 70 65 63  ( HOpenDF(fsSpec
4290: 2e 76 52 65 66 4e 75 6d 2c 20 66 73 53 70 65 63  .vRefNum, fsSpec
42a0: 2e 70 61 72 49 44 2c 20 66 73 53 70 65 63 2e 6e  .parID, fsSpec.n
42b0: 61 6d 65 2c 20 66 73 52 64 57 72 53 68 50 65 72  ame, fsRdWrShPer
42c0: 6d 2c 20 26 28 69 64 2d 3e 72 65 66 4e 75 6d 29  m, &(id->refNum)
42d0: 29 20 21 3d 20 6e 6f 45 72 72 20 29 7b 0a 20 20  ) != noErr ){.  
42e0: 20 20 69 66 28 20 48 4f 70 65 6e 44 46 28 66 73    if( HOpenDF(fs
42f0: 53 70 65 63 2e 76 52 65 66 4e 75 6d 2c 20 66 73  Spec.vRefNum, fs
4300: 53 70 65 63 2e 70 61 72 49 44 2c 20 66 73 53 70  Spec.parID, fsSp
4310: 65 63 2e 6e 61 6d 65 2c 20 66 73 52 64 57 72 50  ec.name, fsRdWrP
4320: 65 72 6d 2c 20 26 28 69 64 2d 3e 72 65 66 4e 75  erm, &(id->refNu
4330: 6d 29 29 20 21 3d 20 6e 6f 45 72 72 20 29 7b 0a  m)) != noErr ){.
4340: 20 20 20 20 20 20 69 66 28 20 48 4f 70 65 6e 44        if( HOpenD
4350: 46 28 66 73 53 70 65 63 2e 76 52 65 66 4e 75 6d  F(fsSpec.vRefNum
4360: 2c 20 66 73 53 70 65 63 2e 70 61 72 49 44 2c 20  , fsSpec.parID, 
4370: 66 73 53 70 65 63 2e 6e 61 6d 65 2c 20 66 73 52  fsSpec.name, fsR
4380: 64 50 65 72 6d 2c 20 26 28 69 64 2d 3e 72 65 66  dPerm, &(id->ref
4390: 4e 75 6d 29 29 20 21 3d 20 6e 6f 45 72 72 20 29  Num)) != noErr )
43a0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
43b0: 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b  SQLITE_CANTOPEN;
43c0: 0a 20 20 20 20 20 20 65 6c 73 65 0a 20 20 20 20  .      else.    
43d0: 20 20 20 20 2a 70 52 65 61 64 6f 6e 6c 79 20 3d      *pReadonly =
43e0: 20 31 3b 0a 20 20 20 20 7d 20 65 6c 73 65 0a 20   1;.    } else. 
43f0: 20 20 20 20 20 2a 70 52 65 61 64 6f 6e 6c 79 20       *pReadonly 
4400: 3d 20 30 3b 0a 20 20 7d 20 65 6c 73 65 0a 20 20  = 0;.  } else.  
4410: 20 20 2a 70 52 65 61 64 6f 6e 6c 79 20 3d 20 30    *pReadonly = 0
4420: 3b 0a 23 20 65 6e 64 69 66 0a 20 20 69 66 28 20  ;.# endif.  if( 
4430: 48 4f 70 65 6e 52 46 28 66 73 53 70 65 63 2e 76  HOpenRF(fsSpec.v
4440: 52 65 66 4e 75 6d 2c 20 66 73 53 70 65 63 2e 70  RefNum, fsSpec.p
4450: 61 72 49 44 2c 20 66 73 53 70 65 63 2e 6e 61 6d  arID, fsSpec.nam
4460: 65 2c 20 66 73 52 64 57 72 53 68 50 65 72 6d 2c  e, fsRdWrShPerm,
4470: 20 26 28 69 64 2d 3e 72 65 66 4e 75 6d 52 46 29   &(id->refNumRF)
4480: 29 20 21 3d 20 6e 6f 45 72 72 29 7b 0a 20 20 20  ) != noErr){.   
4490: 20 69 64 2d 3e 72 65 66 4e 75 6d 52 46 20 3d 20   id->refNumRF = 
44a0: 2d 31 3b 0a 20 20 7d 0a 20 20 69 64 2d 3e 6c 6f  -1;.  }.  id->lo
44b0: 63 6b 65 64 20 3d 20 30 3b 0a 20 20 69 64 2d 3e  cked = 0;.  id->
44c0: 64 65 6c 4f 6e 43 6c 6f 73 65 20 3d 20 30 3b 0a  delOnClose = 0;.
44d0: 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2b 31    OpenCounter(+1
44e0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
44f0: 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 7d 0a  TE_OK;.#endif.}.
4500: 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20  ../*.** Attempt 
4510: 74 6f 20 6f 70 65 6e 20 61 20 6e 65 77 20 66 69  to open a new fi
4520: 6c 65 20 66 6f 72 20 65 78 63 6c 75 73 69 76 65  le for exclusive
4530: 20 61 63 63 65 73 73 20 62 79 20 74 68 69 73 20   access by this 
4540: 70 72 6f 63 65 73 73 2e 0a 2a 2a 20 54 68 65 20  process..** The 
4550: 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 6f 70 65  file will be ope
4560: 6e 65 64 20 66 6f 72 20 62 6f 74 68 20 72 65 61  ned for both rea
4570: 64 69 6e 67 20 61 6e 64 20 77 72 69 74 69 6e 67  ding and writing
4580: 2e 20 20 54 6f 20 61 76 6f 69 64 0a 2a 2a 20 61  .  To avoid.** a
4590: 20 70 6f 74 65 6e 74 69 61 6c 20 73 65 63 75 72   potential secur
45a0: 69 74 79 20 70 72 6f 62 6c 65 6d 2c 20 77 65 20  ity problem, we 
45b0: 64 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 74 68 65  do not allow the
45c0: 20 66 69 6c 65 20 74 6f 20 68 61 76 65 0a 2a 2a   file to have.**
45d0: 20 70 72 65 76 69 6f 75 73 6c 79 20 65 78 69 73   previously exis
45e0: 74 65 64 2e 20 20 4e 6f 72 20 64 6f 20 77 65 20  ted.  Nor do we 
45f0: 61 6c 6c 6f 77 20 74 68 65 20 66 69 6c 65 20 74  allow the file t
4600: 6f 20 62 65 20 61 20 73 79 6d 62 6f 6c 69 63 0a  o be a symbolic.
4610: 2a 2a 20 6c 69 6e 6b 2e 0a 2a 2a 0a 2a 2a 20 49  ** link..**.** I
4620: 66 20 64 65 6c 46 6c 61 67 20 69 73 20 74 72 75  f delFlag is tru
4630: 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 61 72 72  e, then make arr
4640: 61 6e 67 65 6d 65 6e 74 73 20 74 6f 20 61 75 74  angements to aut
4650: 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74  omatically delet
4660: 65 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20 77 68  e.** the file wh
4670: 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e  en it is closed.
4680: 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73  .**.** On succes
4690: 73 2c 20 77 72 69 74 65 20 74 68 65 20 66 69 6c  s, write the fil
46a0: 65 20 68 61 6e 64 6c 65 20 69 6e 74 6f 20 2a 69  e handle into *i
46b0: 64 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  d and return SQL
46c0: 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  ITE_OK..**.** On
46d0: 20 66 61 69 6c 75 72 65 2c 20 72 65 74 75 72 6e   failure, return
46e0: 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
46f0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 4f  ..*/.int sqliteO
4700: 73 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 63  sOpenExclusive(c
4710: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
4720: 6e 61 6d 65 2c 20 4f 73 46 69 6c 65 20 2a 69 64  name, OsFile *id
4730: 2c 20 69 6e 74 20 64 65 6c 46 6c 61 67 29 7b 0a  , int delFlag){.
4740: 23 69 66 20 4f 53 5f 55 4e 49 58 0a 20 20 69 6e  #if OS_UNIX.  in
4750: 74 20 72 63 3b 0a 20 20 69 66 28 20 61 63 63 65  t rc;.  if( acce
4760: 73 73 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 30 29  ss(zFilename, 0)
4770: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
4780: 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  n SQLITE_CANTOPE
4790: 4e 3b 0a 20 20 7d 0a 20 20 69 64 2d 3e 64 69 72  N;.  }.  id->dir
47a0: 66 64 20 3d 20 2d 31 3b 0a 20 20 69 64 2d 3e 66  fd = -1;.  id->f
47b0: 64 20 3d 20 6f 70 65 6e 28 7a 46 69 6c 65 6e 61  d = open(zFilena
47c0: 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  me,.            
47d0: 20 20 20 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45      O_RDWR|O_CRE
47e0: 41 54 7c 4f 5f 45 58 43 4c 7c 4f 5f 4e 4f 46 4f  AT|O_EXCL|O_NOFO
47f0: 4c 4c 4f 57 7c 4f 5f 4c 41 52 47 45 46 49 4c 45  LLOW|O_LARGEFILE
4800: 7c 4f 5f 42 49 4e 41 52 59 2c 20 30 36 30 30 29  |O_BINARY, 0600)
4810: 3b 0a 20 20 69 66 28 20 69 64 2d 3e 66 64 3c 30  ;.  if( id->fd<0
4820: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
4830: 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a  QLITE_CANTOPEN;.
4840: 20 20 7d 0a 20 20 73 71 6c 69 74 65 4f 73 45 6e    }.  sqliteOsEn
4850: 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 72 63  terMutex();.  rc
4860: 20 3d 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28   = findLockInfo(
4870: 69 64 2d 3e 66 64 2c 20 26 69 64 2d 3e 70 4c 6f  id->fd, &id->pLo
4880: 63 6b 2c 20 26 69 64 2d 3e 70 4f 70 65 6e 29 3b  ck, &id->pOpen);
4890: 0a 20 20 73 71 6c 69 74 65 4f 73 4c 65 61 76 65  .  sqliteOsLeave
48a0: 4d 75 74 65 78 28 29 3b 0a 20 20 69 66 28 20 72  Mutex();.  if( r
48b0: 63 20 29 7b 0a 20 20 20 20 63 6c 6f 73 65 28 69  c ){.    close(i
48c0: 64 2d 3e 66 64 29 3b 0a 20 20 20 20 75 6e 6c 69  d->fd);.    unli
48d0: 6e 6b 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  nk(zFilename);. 
48e0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
48f0: 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 64  _NOMEM;.  }.  id
4900: 2d 3e 6c 6f 63 6b 65 64 20 3d 20 30 3b 0a 20 20  ->locked = 0;.  
4910: 69 66 28 20 64 65 6c 46 6c 61 67 20 29 7b 0a 20  if( delFlag ){. 
4920: 20 20 20 75 6e 6c 69 6e 6b 28 7a 46 69 6c 65 6e     unlink(zFilen
4930: 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 54 52 41 43  ame);.  }.  TRAC
4940: 45 33 28 22 4f 50 45 4e 2d 45 58 20 25 2d 33 64  E3("OPEN-EX %-3d
4950: 20 25 73 5c 6e 22 2c 20 69 64 2d 3e 66 64 2c 20   %s\n", id->fd, 
4960: 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 4f 70  zFilename);.  Op
4970: 65 6e 43 6f 75 6e 74 65 72 28 2b 31 29 3b 0a 20  enCounter(+1);. 
4980: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
4990: 4b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f 53  K;.#endif.#if OS
49a0: 5f 57 49 4e 0a 20 20 48 41 4e 44 4c 45 20 68 3b  _WIN.  HANDLE h;
49b0: 0a 20 20 69 6e 74 20 66 69 6c 65 66 6c 61 67 73  .  int fileflags
49c0: 3b 0a 20 20 69 66 28 20 64 65 6c 46 6c 61 67 20  ;.  if( delFlag 
49d0: 29 7b 0a 20 20 20 20 66 69 6c 65 66 6c 61 67 73  ){.    fileflags
49e0: 20 3d 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54   = FILE_ATTRIBUT
49f0: 45 5f 54 45 4d 50 4f 52 41 52 59 20 7c 20 46 49  E_TEMPORARY | FI
4a00: 4c 45 5f 46 4c 41 47 5f 52 41 4e 44 4f 4d 5f 41  LE_FLAG_RANDOM_A
4a10: 43 43 45 53 53 20 0a 20 20 20 20 20 20 20 20 20  CCESS .         
4a20: 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 46 49              | FI
4a30: 4c 45 5f 46 4c 41 47 5f 44 45 4c 45 54 45 5f 4f  LE_FLAG_DELETE_O
4a40: 4e 5f 43 4c 4f 53 45 3b 0a 20 20 7d 65 6c 73 65  N_CLOSE;.  }else
4a50: 7b 0a 20 20 20 20 66 69 6c 65 66 6c 61 67 73 20  {.    fileflags 
4a60: 3d 20 46 49 4c 45 5f 46 4c 41 47 5f 52 41 4e 44  = FILE_FLAG_RAND
4a70: 4f 4d 5f 41 43 43 45 53 53 3b 0a 20 20 7d 0a 20  OM_ACCESS;.  }. 
4a80: 20 68 20 3d 20 43 72 65 61 74 65 46 69 6c 65 28   h = CreateFile(
4a90: 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20  zFilename,.     
4aa0: 47 45 4e 45 52 49 43 5f 52 45 41 44 20 7c 20 47  GENERIC_READ | G
4ab0: 45 4e 45 52 49 43 5f 57 52 49 54 45 2c 0a 20 20  ENERIC_WRITE,.  
4ac0: 20 20 20 30 2c 0a 20 20 20 20 20 4e 55 4c 4c 2c     0,.     NULL,
4ad0: 0a 20 20 20 20 20 43 52 45 41 54 45 5f 41 4c 57  .     CREATE_ALW
4ae0: 41 59 53 2c 0a 20 20 20 20 20 66 69 6c 65 66 6c  AYS,.     filefl
4af0: 61 67 73 2c 0a 20 20 20 20 20 4e 55 4c 4c 0a 20  ags,.     NULL. 
4b00: 20 29 3b 0a 20 20 69 66 28 20 68 3d 3d 49 4e 56   );.  if( h==INV
4b10: 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
4b20: 45 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  E ){.    return 
4b30: 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b  SQLITE_CANTOPEN;
4b40: 0a 20 20 7d 0a 20 20 69 64 2d 3e 68 20 3d 20 68  .  }.  id->h = h
4b50: 3b 0a 20 20 69 64 2d 3e 6c 6f 63 6b 65 64 20 3d  ;.  id->locked =
4b60: 20 30 3b 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65   0;.  OpenCounte
4b70: 72 28 2b 31 29 3b 0a 20 20 72 65 74 75 72 6e 20  r(+1);.  return 
4b80: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69  SQLITE_OK;.#endi
4b90: 66 0a 23 69 66 20 4f 53 5f 4d 41 43 0a 20 20 46  f.#if OS_MAC.  F
4ba0: 53 53 70 65 63 20 66 73 53 70 65 63 3b 0a 23 20  SSpec fsSpec;.# 
4bb0: 69 66 64 65 66 20 5f 4c 41 52 47 45 5f 46 49 4c  ifdef _LARGE_FIL
4bc0: 45 0a 20 20 48 46 53 55 6e 69 53 74 72 32 35 35  E.  HFSUniStr255
4bd0: 20 64 66 4e 61 6d 65 3b 0a 20 20 46 53 52 65 66   dfName;.  FSRef
4be0: 20 66 73 52 65 66 3b 0a 20 20 5f 5f 70 61 74 68   fsRef;.  __path
4bf0: 32 66 73 73 28 7a 46 69 6c 65 6e 61 6d 65 2c 20  2fss(zFilename, 
4c00: 26 66 73 53 70 65 63 29 3b 0a 20 20 69 66 28 20  &fsSpec);.  if( 
4c10: 48 43 72 65 61 74 65 28 66 73 53 70 65 63 2e 76  HCreate(fsSpec.v
4c20: 52 65 66 4e 75 6d 2c 20 66 73 53 70 65 63 2e 70  RefNum, fsSpec.p
4c30: 61 72 49 44 2c 20 66 73 53 70 65 63 2e 6e 61 6d  arID, fsSpec.nam
4c40: 65 2c 20 27 53 51 4c 49 27 2c 20 63 44 6f 63 75  e, 'SQLI', cDocu
4c50: 6d 65 6e 74 46 69 6c 65 29 20 21 3d 20 6e 6f 45  mentFile) != noE
4c60: 72 72 20 29 0a 20 20 20 20 72 65 74 75 72 6e 20  rr ).    return 
4c70: 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b  SQLITE_CANTOPEN;
4c80: 0a 20 20 69 66 28 20 46 53 70 4d 61 6b 65 46 53  .  if( FSpMakeFS
4c90: 52 65 66 28 26 66 73 53 70 65 63 2c 20 26 66 73  Ref(&fsSpec, &fs
4ca0: 52 65 66 29 20 21 3d 20 6e 6f 45 72 72 20 29 0a  Ref) != noErr ).
4cb0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
4cc0: 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 46 53  E_CANTOPEN;.  FS
4cd0: 47 65 74 44 61 74 61 46 6f 72 6b 4e 61 6d 65 28  GetDataForkName(
4ce0: 26 64 66 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  &dfName);.  if( 
4cf0: 46 53 4f 70 65 6e 46 6f 72 6b 28 26 66 73 52 65  FSOpenFork(&fsRe
4d00: 66 2c 20 64 66 4e 61 6d 65 2e 6c 65 6e 67 74 68  f, dfName.length
4d10: 2c 20 64 66 4e 61 6d 65 2e 75 6e 69 63 6f 64 65  , dfName.unicode
4d20: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
4d30: 20 20 20 66 73 52 64 57 72 50 65 72 6d 2c 20 26     fsRdWrPerm, &
4d40: 28 69 64 2d 3e 72 65 66 4e 75 6d 29 29 20 21 3d  (id->refNum)) !=
4d50: 20 6e 6f 45 72 72 20 29 0a 20 20 20 20 72 65 74   noErr ).    ret
4d60: 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  urn SQLITE_CANTO
4d70: 50 45 4e 3b 0a 23 20 65 6c 73 65 0a 20 20 5f 5f  PEN;.# else.  __
4d80: 70 61 74 68 32 66 73 73 28 7a 46 69 6c 65 6e 61  path2fss(zFilena
4d90: 6d 65 2c 20 26 66 73 53 70 65 63 29 3b 0a 20 20  me, &fsSpec);.  
4da0: 69 66 28 20 48 43 72 65 61 74 65 28 66 73 53 70  if( HCreate(fsSp
4db0: 65 63 2e 76 52 65 66 4e 75 6d 2c 20 66 73 53 70  ec.vRefNum, fsSp
4dc0: 65 63 2e 70 61 72 49 44 2c 20 66 73 53 70 65 63  ec.parID, fsSpec
4dd0: 2e 6e 61 6d 65 2c 20 27 53 51 4c 49 27 2c 20 63  .name, 'SQLI', c
4de0: 44 6f 63 75 6d 65 6e 74 46 69 6c 65 29 20 21 3d  DocumentFile) !=
4df0: 20 6e 6f 45 72 72 20 29 0a 20 20 20 20 72 65 74   noErr ).    ret
4e00: 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  urn SQLITE_CANTO
4e10: 50 45 4e 3b 0a 20 20 69 66 28 20 48 4f 70 65 6e  PEN;.  if( HOpen
4e20: 44 46 28 66 73 53 70 65 63 2e 76 52 65 66 4e 75  DF(fsSpec.vRefNu
4e30: 6d 2c 20 66 73 53 70 65 63 2e 70 61 72 49 44 2c  m, fsSpec.parID,
4e40: 20 66 73 53 70 65 63 2e 6e 61 6d 65 2c 20 66 73   fsSpec.name, fs
4e50: 52 64 57 72 50 65 72 6d 2c 20 26 28 69 64 2d 3e  RdWrPerm, &(id->
4e60: 72 65 66 4e 75 6d 29 29 20 21 3d 20 6e 6f 45 72  refNum)) != noEr
4e70: 72 20 29 0a 20 20 20 20 72 65 74 75 72 6e 20 53  r ).    return S
4e80: 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a  QLITE_CANTOPEN;.
4e90: 23 20 65 6e 64 69 66 0a 20 20 69 64 2d 3e 72 65  # endif.  id->re
4ea0: 66 4e 75 6d 52 46 20 3d 20 2d 31 3b 0a 20 20 69  fNumRF = -1;.  i
4eb0: 64 2d 3e 6c 6f 63 6b 65 64 20 3d 20 30 3b 0a 20  d->locked = 0;. 
4ec0: 20 69 64 2d 3e 64 65 6c 4f 6e 43 6c 6f 73 65 20   id->delOnClose 
4ed0: 3d 20 64 65 6c 46 6c 61 67 3b 0a 20 20 69 66 20  = delFlag;.  if 
4ee0: 28 64 65 6c 46 6c 61 67 29 0a 20 20 20 20 69 64  (delFlag).    id
4ef0: 2d 3e 70 61 74 68 54 6f 44 65 6c 20 3d 20 73 71  ->pathToDel = sq
4f00: 6c 69 74 65 4f 73 46 75 6c 6c 50 61 74 68 6e 61  liteOsFullPathna
4f10: 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  me(zFilename);. 
4f20: 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2b 31 29   OpenCounter(+1)
4f30: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
4f40: 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  E_OK;.#endif.}..
4f50: 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f  /*.** Attempt to
4f60: 20 6f 70 65 6e 20 61 20 6e 65 77 20 66 69 6c 65   open a new file
4f70: 20 66 6f 72 20 72 65 61 64 2d 6f 6e 6c 79 20 61   for read-only a
4f80: 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20  ccess..**.** On 
4f90: 73 75 63 63 65 73 73 2c 20 77 72 69 74 65 20 74  success, write t
4fa0: 68 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 69  he file handle i
4fb0: 6e 74 6f 20 2a 69 64 20 61 6e 64 20 72 65 74 75  nto *id and retu
4fc0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a  rn SQLITE_OK..**
4fd0: 0a 2a 2a 20 4f 6e 20 66 61 69 6c 75 72 65 2c 20  .** On failure, 
4fe0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41  return SQLITE_CA
4ff0: 4e 54 4f 50 45 4e 2e 0a 2a 2f 0a 69 6e 74 20 73  NTOPEN..*/.int s
5000: 71 6c 69 74 65 4f 73 4f 70 65 6e 52 65 61 64 4f  qliteOsOpenReadO
5010: 6e 6c 79 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  nly(const char *
5020: 7a 46 69 6c 65 6e 61 6d 65 2c 20 4f 73 46 69 6c  zFilename, OsFil
5030: 65 20 2a 69 64 29 7b 0a 23 69 66 20 4f 53 5f 55  e *id){.#if OS_U
5040: 4e 49 58 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  NIX.  int rc;.  
5050: 69 64 2d 3e 64 69 72 66 64 20 3d 20 2d 31 3b 0a  id->dirfd = -1;.
5060: 20 20 69 64 2d 3e 66 64 20 3d 20 6f 70 65 6e 28    id->fd = open(
5070: 7a 46 69 6c 65 6e 61 6d 65 2c 20 4f 5f 52 44 4f  zFilename, O_RDO
5080: 4e 4c 59 7c 4f 5f 4c 41 52 47 45 46 49 4c 45 7c  NLY|O_LARGEFILE|
5090: 4f 5f 42 49 4e 41 52 59 29 3b 0a 20 20 69 66 28  O_BINARY);.  if(
50a0: 20 69 64 2d 3e 66 64 3c 30 20 29 7b 0a 20 20 20   id->fd<0 ){.   
50b0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
50c0: 41 4e 54 4f 50 45 4e 3b 0a 20 20 7d 0a 20 20 73  ANTOPEN;.  }.  s
50d0: 71 6c 69 74 65 4f 73 45 6e 74 65 72 4d 75 74 65  qliteOsEnterMute
50e0: 78 28 29 3b 0a 20 20 72 63 20 3d 20 66 69 6e 64  x();.  rc = find
50f0: 4c 6f 63 6b 49 6e 66 6f 28 69 64 2d 3e 66 64 2c  LockInfo(id->fd,
5100: 20 26 69 64 2d 3e 70 4c 6f 63 6b 2c 20 26 69 64   &id->pLock, &id
5110: 2d 3e 70 4f 70 65 6e 29 3b 0a 20 20 73 71 6c 69  ->pOpen);.  sqli
5120: 74 65 4f 73 4c 65 61 76 65 4d 75 74 65 78 28 29  teOsLeaveMutex()
5130: 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
5140: 20 20 63 6c 6f 73 65 28 69 64 2d 3e 66 64 29 3b    close(id->fd);
5150: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
5160: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
5170: 69 64 2d 3e 6c 6f 63 6b 65 64 20 3d 20 30 3b 0a  id->locked = 0;.
5180: 20 20 54 52 41 43 45 33 28 22 4f 50 45 4e 2d 52    TRACE3("OPEN-R
5190: 4f 20 25 2d 33 64 20 25 73 5c 6e 22 2c 20 69 64  O %-3d %s\n", id
51a0: 2d 3e 66 64 2c 20 7a 46 69 6c 65 6e 61 6d 65 29  ->fd, zFilename)
51b0: 3b 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28  ;.  OpenCounter(
51c0: 2b 31 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  +1);.  return SQ
51d0: 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a  LITE_OK;.#endif.
51e0: 23 69 66 20 4f 53 5f 57 49 4e 0a 20 20 48 41 4e  #if OS_WIN.  HAN
51f0: 44 4c 45 20 68 20 3d 20 43 72 65 61 74 65 46 69  DLE h = CreateFi
5200: 6c 65 28 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20  le(zFilename,.  
5210: 20 20 20 47 45 4e 45 52 49 43 5f 52 45 41 44 2c     GENERIC_READ,
5220: 0a 20 20 20 20 20 30 2c 0a 20 20 20 20 20 4e 55  .     0,.     NU
5230: 4c 4c 2c 0a 20 20 20 20 20 4f 50 45 4e 5f 45 58  LL,.     OPEN_EX
5240: 49 53 54 49 4e 47 2c 0a 20 20 20 20 20 46 49 4c  ISTING,.     FIL
5250: 45 5f 41 54 54 52 49 42 55 54 45 5f 4e 4f 52 4d  E_ATTRIBUTE_NORM
5260: 41 4c 20 7c 20 46 49 4c 45 5f 46 4c 41 47 5f 52  AL | FILE_FLAG_R
5270: 41 4e 44 4f 4d 5f 41 43 43 45 53 53 2c 0a 20 20  ANDOM_ACCESS,.  
5280: 20 20 20 4e 55 4c 4c 0a 20 20 29 3b 0a 20 20 69     NULL.  );.  i
5290: 66 28 20 68 3d 3d 49 4e 56 41 4c 49 44 5f 48 41  f( h==INVALID_HA
52a0: 4e 44 4c 45 5f 56 41 4c 55 45 20 29 7b 0a 20 20  NDLE_VALUE ){.  
52b0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
52c0: 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 7d 0a 20 20  CANTOPEN;.  }.  
52d0: 69 64 2d 3e 68 20 3d 20 68 3b 0a 20 20 69 64 2d  id->h = h;.  id-
52e0: 3e 6c 6f 63 6b 65 64 20 3d 20 30 3b 0a 20 20 4f  >locked = 0;.  O
52f0: 70 65 6e 43 6f 75 6e 74 65 72 28 2b 31 29 3b 0a  penCounter(+1);.
5300: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
5310: 4f 4b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f  OK;.#endif.#if O
5320: 53 5f 4d 41 43 0a 20 20 46 53 53 70 65 63 20 66  S_MAC.  FSSpec f
5330: 73 53 70 65 63 3b 0a 23 20 69 66 64 65 66 20 5f  sSpec;.# ifdef _
5340: 4c 41 52 47 45 5f 46 49 4c 45 0a 20 20 48 46 53  LARGE_FILE.  HFS
5350: 55 6e 69 53 74 72 32 35 35 20 64 66 4e 61 6d 65  UniStr255 dfName
5360: 3b 0a 20 20 46 53 52 65 66 20 66 73 52 65 66 3b  ;.  FSRef fsRef;
5370: 0a 20 20 69 66 28 20 5f 5f 70 61 74 68 32 66 73  .  if( __path2fs
5380: 73 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 26 66 73  s(zFilename, &fs
5390: 53 70 65 63 29 20 21 3d 20 6e 6f 45 72 72 20 29  Spec) != noErr )
53a0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
53b0: 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 69  TE_CANTOPEN;.  i
53c0: 66 28 20 46 53 70 4d 61 6b 65 46 53 52 65 66 28  f( FSpMakeFSRef(
53d0: 26 66 73 53 70 65 63 2c 20 26 66 73 52 65 66 29  &fsSpec, &fsRef)
53e0: 20 21 3d 20 6e 6f 45 72 72 20 29 0a 20 20 20 20   != noErr ).    
53f0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41  return SQLITE_CA
5400: 4e 54 4f 50 45 4e 3b 0a 20 20 46 53 47 65 74 44  NTOPEN;.  FSGetD
5410: 61 74 61 46 6f 72 6b 4e 61 6d 65 28 26 64 66 4e  ataForkName(&dfN
5420: 61 6d 65 29 3b 0a 20 20 69 66 28 20 46 53 4f 70  ame);.  if( FSOp
5430: 65 6e 46 6f 72 6b 28 26 66 73 52 65 66 2c 20 64  enFork(&fsRef, d
5440: 66 4e 61 6d 65 2e 6c 65 6e 67 74 68 2c 20 64 66  fName.length, df
5450: 4e 61 6d 65 2e 75 6e 69 63 6f 64 65 2c 0a 20 20  Name.unicode,.  
5460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
5470: 73 52 64 50 65 72 6d 2c 20 26 28 69 64 2d 3e 72  sRdPerm, &(id->r
5480: 65 66 4e 75 6d 29 29 20 21 3d 20 6e 6f 45 72 72  efNum)) != noErr
5490: 20 29 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51   ).    return SQ
54a0: 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 23  LITE_CANTOPEN;.#
54b0: 20 65 6c 73 65 0a 20 20 5f 5f 70 61 74 68 32 66   else.  __path2f
54c0: 73 73 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 26 66  ss(zFilename, &f
54d0: 73 53 70 65 63 29 3b 0a 20 20 69 66 28 20 48 4f  sSpec);.  if( HO
54e0: 70 65 6e 44 46 28 66 73 53 70 65 63 2e 76 52 65  penDF(fsSpec.vRe
54f0: 66 4e 75 6d 2c 20 66 73 53 70 65 63 2e 70 61 72  fNum, fsSpec.par
5500: 49 44 2c 20 66 73 53 70 65 63 2e 6e 61 6d 65 2c  ID, fsSpec.name,
5510: 20 66 73 52 64 50 65 72 6d 2c 20 26 28 69 64 2d   fsRdPerm, &(id-
5520: 3e 72 65 66 4e 75 6d 29 29 20 21 3d 20 6e 6f 45  >refNum)) != noE
5530: 72 72 20 29 0a 20 20 20 20 72 65 74 75 72 6e 20  rr ).    return 
5540: 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b  SQLITE_CANTOPEN;
5550: 0a 23 20 65 6e 64 69 66 0a 20 20 69 66 28 20 48  .# endif.  if( H
5560: 4f 70 65 6e 52 46 28 66 73 53 70 65 63 2e 76 52  OpenRF(fsSpec.vR
5570: 65 66 4e 75 6d 2c 20 66 73 53 70 65 63 2e 70 61  efNum, fsSpec.pa
5580: 72 49 44 2c 20 66 73 53 70 65 63 2e 6e 61 6d 65  rID, fsSpec.name
5590: 2c 20 66 73 52 64 57 72 53 68 50 65 72 6d 2c 20  , fsRdWrShPerm, 
55a0: 26 28 69 64 2d 3e 72 65 66 4e 75 6d 52 46 29 29  &(id->refNumRF))
55b0: 20 21 3d 20 6e 6f 45 72 72 29 7b 0a 20 20 20 20   != noErr){.    
55c0: 69 64 2d 3e 72 65 66 4e 75 6d 52 46 20 3d 20 2d  id->refNumRF = -
55d0: 31 3b 0a 20 20 7d 0a 20 20 69 64 2d 3e 6c 6f 63  1;.  }.  id->loc
55e0: 6b 65 64 20 3d 20 30 3b 0a 20 20 69 64 2d 3e 64  ked = 0;.  id->d
55f0: 65 6c 4f 6e 43 6c 6f 73 65 20 3d 20 30 3b 0a 20  elOnClose = 0;. 
5600: 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2b 31 29   OpenCounter(+1)
5610: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
5620: 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  E_OK;.#endif.}..
5630: 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f  /*.** Attempt to
5640: 20 6f 70 65 6e 20 61 20 66 69 6c 65 20 64 65 73   open a file des
5650: 63 72 69 70 74 6f 72 20 66 6f 72 20 74 68 65 20  criptor for the 
5660: 64 69 72 65 63 74 6f 72 79 20 74 68 61 74 20 63  directory that c
5670: 6f 6e 74 61 69 6e 73 20 61 0a 2a 2a 20 66 69 6c  ontains a.** fil
5680: 65 2e 20 20 54 68 69 73 20 66 69 6c 65 20 64 65  e.  This file de
5690: 73 63 72 69 70 74 6f 72 20 63 61 6e 20 62 65 20  scriptor can be 
56a0: 75 73 65 64 20 74 6f 20 66 73 79 6e 63 28 29 20  used to fsync() 
56b0: 74 68 65 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a  the directory.**
56c0: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6d 61 6b   in order to mak
56d0: 65 20 73 75 72 65 20 74 68 65 20 63 72 65 61 74  e sure the creat
56e0: 69 6f 6e 20 6f 66 20 61 20 6e 65 77 20 66 69 6c  ion of a new fil
56f0: 65 20 69 73 20 61 63 74 75 61 6c 6c 79 20 77 72  e is actually wr
5700: 69 74 74 65 6e 0a 2a 2a 20 74 6f 20 64 69 73 6b  itten.** to disk
5710: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
5720: 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 6d 65 61  tine is only mea
5730: 6e 69 6e 67 66 75 6c 20 66 6f 72 20 55 6e 69 78  ningful for Unix
5740: 2e 20 20 49 74 20 69 73 20 61 20 6e 6f 2d 6f 70  .  It is a no-op
5750: 20 75 6e 64 65 72 0a 2a 2a 20 77 69 6e 64 6f 77   under.** window
5760: 73 20 73 69 6e 63 65 20 77 69 6e 64 6f 77 73 20  s since windows 
5770: 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74  does not support
5780: 20 68 61 72 64 20 6c 69 6e 6b 73 2e 0a 2a 2a 0a   hard links..**.
5790: 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 61  ** On success, a
57a0: 20 68 61 6e 64 6c 65 20 66 6f 72 20 61 20 70 72   handle for a pr
57b0: 65 76 69 6f 75 73 6c 79 20 6f 70 65 6e 20 66 69  eviously open fi
57c0: 6c 65 20 69 73 20 61 74 20 2a 69 64 20 69 73 0a  le is at *id is.
57d0: 2a 2a 20 75 70 64 61 74 65 64 20 77 69 74 68 20  ** updated with 
57e0: 74 68 65 20 6e 65 77 20 64 69 72 65 63 74 6f 72  the new director
57f0: 79 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  y file descripto
5800: 72 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  r and SQLITE_OK 
5810: 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a  is.** returned..
5820: 2a 2a 0a 2a 2a 20 4f 6e 20 66 61 69 6c 75 72 65  **.** On failure
5830: 2c 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 72  , the function r
5840: 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 43 41  eturns SQLITE_CA
5850: 4e 54 4f 50 45 4e 20 61 6e 64 20 6c 65 61 76 65  NTOPEN and leave
5860: 73 0a 2a 2a 20 2a 69 64 20 75 6e 63 68 61 6e 67  s.** *id unchang
5870: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
5880: 65 4f 73 4f 70 65 6e 44 69 72 65 63 74 6f 72 79  eOsOpenDirectory
5890: 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
58a0: 7a 44 69 72 6e 61 6d 65 2c 0a 20 20 4f 73 46 69  zDirname,.  OsFi
58b0: 6c 65 20 2a 69 64 0a 29 7b 0a 23 69 66 20 4f 53  le *id.){.#if OS
58c0: 5f 55 4e 49 58 0a 20 20 69 66 28 20 69 64 2d 3e  _UNIX.  if( id->
58d0: 66 64 3c 30 20 29 7b 0a 20 20 20 20 2f 2a 20 44  fd<0 ){.    /* D
58e0: 6f 20 6e 6f 74 20 6f 70 65 6e 20 74 68 65 20 64  o not open the d
58f0: 69 72 65 63 74 6f 72 79 20 69 66 20 74 68 65 20  irectory if the 
5900: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 66 69  corresponding fi
5910: 6c 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  le is not alread
5920: 79 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 2e 20 2a  y.    ** open. *
5930: 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  /.    return SQL
5940: 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20  ITE_CANTOPEN;.  
5950: 7d 0a 20 20 61 73 73 65 72 74 28 20 69 64 2d 3e  }.  assert( id->
5960: 64 69 72 66 64 3c 30 20 29 3b 0a 20 20 69 64 2d  dirfd<0 );.  id-
5970: 3e 64 69 72 66 64 20 3d 20 6f 70 65 6e 28 7a 44  >dirfd = open(zD
5980: 69 72 6e 61 6d 65 2c 20 4f 5f 52 44 4f 4e 4c 59  irname, O_RDONLY
5990: 7c 4f 5f 42 49 4e 41 52 59 2c 20 30 36 34 34 29  |O_BINARY, 0644)
59a0: 3b 0a 20 20 69 66 28 20 69 64 2d 3e 64 69 72 66  ;.  if( id->dirf
59b0: 64 3c 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  d<0 ){.    retur
59c0: 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  n SQLITE_CANTOPE
59d0: 4e 3b 20 0a 20 20 7d 0a 20 20 54 52 41 43 45 33  N; .  }.  TRACE3
59e0: 28 22 4f 50 45 4e 44 49 52 20 25 2d 33 64 20 25  ("OPENDIR %-3d %
59f0: 73 5c 6e 22 2c 20 69 64 2d 3e 64 69 72 66 64 2c  s\n", id->dirfd,
5a00: 20 7a 44 69 72 6e 61 6d 65 29 3b 0a 23 65 6e 64   zDirname);.#end
5a10: 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  if.  return SQLI
5a20: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
5a30: 43 72 65 61 74 65 20 61 20 74 65 6d 70 6f 72 61  Create a tempora
5a40: 72 79 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e 20  ry file name in 
5a50: 7a 42 75 66 2e 20 20 7a 42 75 66 20 6d 75 73 74  zBuf.  zBuf must
5a60: 20 62 65 20 62 69 67 20 65 6e 6f 75 67 68 20 74   be big enough t
5a70: 6f 0a 2a 2a 20 68 6f 6c 64 20 61 74 20 6c 65 61  o.** hold at lea
5a80: 73 74 20 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41  st SQLITE_TEMPNA
5a90: 4d 45 5f 53 49 5a 45 20 63 68 61 72 61 63 74 65  ME_SIZE characte
5aa0: 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  rs..*/.int sqlit
5ab0: 65 4f 73 54 65 6d 70 46 69 6c 65 4e 61 6d 65 28  eOsTempFileName(
5ac0: 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 23 69 66  char *zBuf){.#if
5ad0: 20 4f 53 5f 55 4e 49 58 0a 20 20 73 74 61 74 69   OS_UNIX.  stati
5ae0: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a  c const char *az
5af0: 44 69 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  Dirs[] = {.     
5b00: 22 2f 76 61 72 2f 74 6d 70 22 2c 0a 20 20 20 20  "/var/tmp",.    
5b10: 20 22 2f 75 73 72 2f 74 6d 70 22 2c 0a 20 20 20   "/usr/tmp",.   
5b20: 20 20 22 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22    "/tmp",.     "
5b30: 2e 22 2c 0a 20 20 7d 3b 0a 20 20 73 74 61 74 69  .",.  };.  stati
5b40: 63 20 63 68 61 72 20 7a 43 68 61 72 73 5b 5d 20  c char zChars[] 
5b50: 3d 0a 20 20 20 20 22 61 62 63 64 65 66 67 68 69  =.    "abcdefghi
5b60: 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79  jklmnopqrstuvwxy
5b70: 7a 22 0a 20 20 20 20 22 41 42 43 44 45 46 47 48  z".    "ABCDEFGH
5b80: 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58  IJKLMNOPQRSTUVWX
5b90: 59 5a 22 0a 20 20 20 20 22 30 31 32 33 34 35 36  YZ".    "0123456
5ba0: 37 38 39 22 3b 0a 20 20 69 6e 74 20 69 2c 20 6a  789";.  int i, j
5bb0: 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20  ;.  struct stat 
5bc0: 62 75 66 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  buf;.  const cha
5bd0: 72 20 2a 7a 44 69 72 20 3d 20 22 2e 22 3b 0a 20  r *zDir = ".";. 
5be0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
5bf0: 6f 66 28 61 7a 44 69 72 73 29 2f 73 69 7a 65 6f  of(azDirs)/sizeo
5c00: 66 28 61 7a 44 69 72 73 5b 30 5d 29 3b 20 69 2b  f(azDirs[0]); i+
5c10: 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 74 61 74  +){.    if( stat
5c20: 28 61 7a 44 69 72 73 5b 69 5d 2c 20 26 62 75 66  (azDirs[i], &buf
5c30: 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  ) ) continue;.  
5c40: 20 20 69 66 28 20 21 53 5f 49 53 44 49 52 28 62    if( !S_ISDIR(b
5c50: 75 66 2e 73 74 5f 6d 6f 64 65 29 20 29 20 63 6f  uf.st_mode) ) co
5c60: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
5c70: 61 63 63 65 73 73 28 61 7a 44 69 72 73 5b 69 5d  access(azDirs[i]
5c80: 2c 20 30 37 29 20 29 20 63 6f 6e 74 69 6e 75 65  , 07) ) continue
5c90: 3b 0a 20 20 20 20 7a 44 69 72 20 3d 20 61 7a 44  ;.    zDir = azD
5ca0: 69 72 73 5b 69 5d 3b 0a 20 20 20 20 62 72 65 61  irs[i];.    brea
5cb0: 6b 3b 0a 20 20 7d 0a 20 20 64 6f 7b 0a 20 20 20  k;.  }.  do{.   
5cc0: 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 20 22   sprintf(zBuf, "
5cd0: 25 73 2f 22 54 45 4d 50 5f 46 49 4c 45 5f 50 52  %s/"TEMP_FILE_PR
5ce0: 45 46 49 58 2c 20 7a 44 69 72 29 3b 0a 20 20 20  EFIX, zDir);.   
5cf0: 20 6a 20 3d 20 73 74 72 6c 65 6e 28 7a 42 75 66   j = strlen(zBuf
5d00: 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
5d10: 69 3c 31 35 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  i<15; i++){.    
5d20: 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65    int n = sqlite
5d30: 52 61 6e 64 6f 6d 42 79 74 65 28 29 20 25 20 28  RandomByte() % (
5d40: 73 69 7a 65 6f 66 28 7a 43 68 61 72 73 29 2d 31  sizeof(zChars)-1
5d50: 29 3b 0a 20 20 20 20 20 20 7a 42 75 66 5b 6a 2b  );.      zBuf[j+
5d60: 2b 5d 20 3d 20 7a 43 68 61 72 73 5b 6e 5d 3b 0a  +] = zChars[n];.
5d70: 20 20 20 20 7d 0a 20 20 20 20 7a 42 75 66 5b 6a      }.    zBuf[j
5d80: 5d 20 3d 20 30 3b 0a 20 20 7d 77 68 69 6c 65 28  ] = 0;.  }while(
5d90: 20 61 63 63 65 73 73 28 7a 42 75 66 2c 30 29 3d   access(zBuf,0)=
5da0: 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  =0 );.#endif.#if
5db0: 20 4f 53 5f 57 49 4e 0a 20 20 73 74 61 74 69 63   OS_WIN.  static
5dc0: 20 63 68 61 72 20 7a 43 68 61 72 73 5b 5d 20 3d   char zChars[] =
5dd0: 0a 20 20 20 20 22 61 62 63 64 65 66 67 68 69 6a  .    "abcdefghij
5de0: 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a  klmnopqrstuvwxyz
5df0: 22 0a 20 20 20 20 22 41 42 43 44 45 46 47 48 49  ".    "ABCDEFGHI
5e00: 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59  JKLMNOPQRSTUVWXY
5e10: 5a 22 0a 20 20 20 20 22 30 31 32 33 34 35 36 37  Z".    "01234567
5e20: 38 39 22 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  89";.  int i, j;
5e30: 0a 20 20 63 68 61 72 20 7a 54 65 6d 70 50 61 74  .  char zTempPat
5e40: 68 5b 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d  h[SQLITE_TEMPNAM
5e50: 45 5f 53 49 5a 45 5d 3b 0a 20 20 47 65 74 54 65  E_SIZE];.  GetTe
5e60: 6d 70 50 61 74 68 28 53 51 4c 49 54 45 5f 54 45  mpPath(SQLITE_TE
5e70: 4d 50 4e 41 4d 45 5f 53 49 5a 45 2d 33 30 2c 20  MPNAME_SIZE-30, 
5e80: 7a 54 65 6d 70 50 61 74 68 29 3b 0a 20 20 66 6f  zTempPath);.  fo
5e90: 72 28 69 3d 73 74 72 6c 65 6e 28 7a 54 65 6d 70  r(i=strlen(zTemp
5ea0: 50 61 74 68 29 3b 20 69 3e 30 20 26 26 20 7a 54  Path); i>0 && zT
5eb0: 65 6d 70 50 61 74 68 5b 69 2d 31 5d 3d 3d 27 5c  empPath[i-1]=='\
5ec0: 5c 27 3b 20 69 2d 2d 29 7b 7d 0a 20 20 7a 54 65  \'; i--){}.  zTe
5ed0: 6d 70 50 61 74 68 5b 69 5d 20 3d 20 30 3b 0a 20  mpPath[i] = 0;. 
5ee0: 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 73 70   for(;;){.    sp
5ef0: 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 25 73 5c  rintf(zBuf, "%s\
5f00: 5c 22 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46  \"TEMP_FILE_PREF
5f10: 49 58 2c 20 7a 54 65 6d 70 50 61 74 68 29 3b 0a  IX, zTempPath);.
5f20: 20 20 20 20 6a 20 3d 20 73 74 72 6c 65 6e 28 7a      j = strlen(z
5f30: 42 75 66 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  Buf);.    for(i=
5f40: 30 3b 20 69 3c 31 35 3b 20 69 2b 2b 29 7b 0a 20  0; i<15; i++){. 
5f50: 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c       int n = sql
5f60: 69 74 65 52 61 6e 64 6f 6d 42 79 74 65 28 29 20  iteRandomByte() 
5f70: 25 20 28 73 69 7a 65 6f 66 28 7a 43 68 61 72 73  % (sizeof(zChars
5f80: 29 20 2d 20 31 29 3b 0a 20 20 20 20 20 20 7a 42  ) - 1);.      zB
5f90: 75 66 5b 6a 2b 2b 5d 20 3d 20 7a 43 68 61 72 73  uf[j++] = zChars
5fa0: 5b 6e 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a  [n];.    }.    z
5fb0: 42 75 66 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20  Buf[j] = 0;.    
5fc0: 69 66 28 20 21 73 71 6c 69 74 65 4f 73 46 69 6c  if( !sqliteOsFil
5fd0: 65 45 78 69 73 74 73 28 7a 42 75 66 29 20 29 20  eExists(zBuf) ) 
5fe0: 62 72 65 61 6b 3b 0a 20 20 7d 0a 23 65 6e 64 69  break;.  }.#endi
5ff0: 66 0a 23 69 66 20 4f 53 5f 4d 41 43 0a 20 20 73  f.#if OS_MAC.  s
6000: 74 61 74 69 63 20 63 68 61 72 20 7a 43 68 61 72  tatic char zChar
6010: 73 5b 5d 20 3d 0a 20 20 20 20 22 61 62 63 64 65  s[] =.    "abcde
6020: 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75  fghijklmnopqrstu
6030: 76 77 78 79 7a 22 0a 20 20 20 20 22 41 42 43 44  vwxyz".    "ABCD
6040: 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54  EFGHIJKLMNOPQRST
6050: 55 56 57 58 59 5a 22 0a 20 20 20 20 22 30 31 32  UVWXYZ".    "012
6060: 33 34 35 36 37 38 39 22 3b 0a 20 20 69 6e 74 20  3456789";.  int 
6070: 69 2c 20 6a 3b 0a 20 20 63 68 61 72 20 7a 54 65  i, j;.  char zTe
6080: 6d 70 50 61 74 68 5b 53 51 4c 49 54 45 5f 54 45  mpPath[SQLITE_TE
6090: 4d 50 4e 41 4d 45 5f 53 49 5a 45 5d 3b 0a 20 20  MPNAME_SIZE];.  
60a0: 63 68 61 72 20 7a 64 69 72 4e 61 6d 65 5b 33 32  char zdirName[32
60b0: 5d 3b 0a 20 20 43 49 6e 66 6f 50 42 52 65 63 20  ];.  CInfoPBRec 
60c0: 69 6e 66 6f 52 65 63 3b 0a 20 20 53 74 72 33 31  infoRec;.  Str31
60d0: 20 64 69 72 4e 61 6d 65 3b 0a 20 20 6d 65 6d 73   dirName;.  mems
60e0: 65 74 28 26 69 6e 66 6f 52 65 63 2c 20 30 2c 20  et(&infoRec, 0, 
60f0: 73 69 7a 65 6f 66 28 69 6e 66 6f 52 65 63 29 29  sizeof(infoRec))
6100: 3b 0a 20 20 6d 65 6d 73 65 74 28 7a 54 65 6d 70  ;.  memset(zTemp
6110: 50 61 74 68 2c 20 30 2c 20 53 51 4c 49 54 45 5f  Path, 0, SQLITE_
6120: 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 29 3b 0a  TEMPNAME_SIZE);.
6130: 20 20 69 66 28 20 46 69 6e 64 46 6f 6c 64 65 72    if( FindFolder
6140: 28 6b 4f 6e 53 79 73 74 65 6d 44 69 73 6b 2c 20  (kOnSystemDisk, 
6150: 6b 54 65 6d 70 6f 72 61 72 79 46 6f 6c 64 65 72  kTemporaryFolder
6160: 54 79 70 65 2c 20 20 6b 43 72 65 61 74 65 46 6f  Type,  kCreateFo
6170: 6c 64 65 72 2c 0a 20 20 20 20 20 20 20 26 28 69  lder,.       &(i
6180: 6e 66 6f 52 65 63 2e 64 69 72 49 6e 66 6f 2e 69  nfoRec.dirInfo.i
6190: 6f 56 52 65 66 4e 75 6d 29 2c 20 26 28 69 6e 66  oVRefNum), &(inf
61a0: 6f 52 65 63 2e 64 69 72 49 6e 66 6f 2e 69 6f 44  oRec.dirInfo.ioD
61b0: 72 50 61 72 49 44 29 29 20 3d 3d 20 6e 6f 45 72  rParID)) == noEr
61c0: 72 20 29 7b 0a 20 20 20 20 69 6e 66 6f 52 65 63  r ){.    infoRec
61d0: 2e 64 69 72 49 6e 66 6f 2e 69 6f 4e 61 6d 65 50  .dirInfo.ioNameP
61e0: 74 72 20 3d 20 64 69 72 4e 61 6d 65 3b 0a 20 20  tr = dirName;.  
61f0: 20 20 64 6f 7b 0a 20 20 20 20 20 20 69 6e 66 6f    do{.      info
6200: 52 65 63 2e 64 69 72 49 6e 66 6f 2e 69 6f 46 44  Rec.dirInfo.ioFD
6210: 69 72 49 6e 64 65 78 20 3d 20 2d 31 3b 0a 20 20  irIndex = -1;.  
6220: 20 20 20 20 69 6e 66 6f 52 65 63 2e 64 69 72 49      infoRec.dirI
6230: 6e 66 6f 2e 69 6f 44 72 44 69 72 49 44 20 3d 20  nfo.ioDrDirID = 
6240: 69 6e 66 6f 52 65 63 2e 64 69 72 49 6e 66 6f 2e  infoRec.dirInfo.
6250: 69 6f 44 72 50 61 72 49 44 3b 0a 20 20 20 20 20  ioDrParID;.     
6260: 20 69 66 28 20 50 42 47 65 74 43 61 74 49 6e 66   if( PBGetCatInf
6270: 6f 53 79 6e 63 28 26 69 6e 66 6f 52 65 63 29 20  oSync(&infoRec) 
6280: 3d 3d 20 6e 6f 45 72 72 20 29 7b 0a 20 20 20 20  == noErr ){.    
6290: 20 20 20 20 43 6f 70 79 50 61 73 63 61 6c 53 74      CopyPascalSt
62a0: 72 69 6e 67 54 6f 43 28 64 69 72 4e 61 6d 65 2c  ringToC(dirName,
62b0: 20 7a 64 69 72 4e 61 6d 65 29 3b 0a 20 20 20 20   zdirName);.    
62c0: 20 20 20 20 69 20 3d 20 73 74 72 6c 65 6e 28 7a      i = strlen(z
62d0: 64 69 72 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  dirName);.      
62e0: 20 20 6d 65 6d 6d 6f 76 65 28 26 28 7a 54 65 6d    memmove(&(zTem
62f0: 70 50 61 74 68 5b 69 2b 31 5d 29 2c 20 7a 54 65  pPath[i+1]), zTe
6300: 6d 70 50 61 74 68 2c 20 73 74 72 6c 65 6e 28 7a  mpPath, strlen(z
6310: 54 65 6d 70 50 61 74 68 29 29 3b 0a 20 20 20 20  TempPath));.    
6320: 20 20 20 20 73 74 72 63 70 79 28 7a 54 65 6d 70      strcpy(zTemp
6330: 50 61 74 68 2c 20 7a 64 69 72 4e 61 6d 65 29 3b  Path, zdirName);
6340: 0a 20 20 20 20 20 20 20 20 7a 54 65 6d 70 50 61  .        zTempPa
6350: 74 68 5b 69 5d 20 3d 20 27 3a 27 3b 0a 20 20 20  th[i] = ':';.   
6360: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6370: 20 20 2a 7a 54 65 6d 70 50 61 74 68 20 3d 20 30    *zTempPath = 0
6380: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
6390: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 77  .      }.    } w
63a0: 68 69 6c 65 28 20 69 6e 66 6f 52 65 63 2e 64 69  hile( infoRec.di
63b0: 72 49 6e 66 6f 2e 69 6f 44 72 44 69 72 49 44 20  rInfo.ioDrDirID 
63c0: 21 3d 20 66 73 52 74 44 69 72 49 44 20 29 3b 0a  != fsRtDirID );.
63d0: 20 20 7d 0a 20 20 69 66 28 20 2a 7a 54 65 6d 70    }.  if( *zTemp
63e0: 50 61 74 68 20 3d 3d 20 30 20 29 0a 20 20 20 20  Path == 0 ).    
63f0: 67 65 74 63 77 64 28 7a 54 65 6d 70 50 61 74 68  getcwd(zTempPath
6400: 2c 20 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d  , SQLITE_TEMPNAM
6410: 45 5f 53 49 5a 45 2d 32 34 29 3b 0a 20 20 66 6f  E_SIZE-24);.  fo
6420: 72 28 3b 3b 29 7b 0a 20 20 20 20 73 70 72 69 6e  r(;;){.    sprin
6430: 74 66 28 7a 42 75 66 2c 20 22 25 73 22 54 45 4d  tf(zBuf, "%s"TEM
6440: 50 5f 46 49 4c 45 5f 50 52 45 46 49 58 2c 20 7a  P_FILE_PREFIX, z
6450: 54 65 6d 70 50 61 74 68 29 3b 0a 20 20 20 20 6a  TempPath);.    j
6460: 20 3d 20 73 74 72 6c 65 6e 28 7a 42 75 66 29 3b   = strlen(zBuf);
6470: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
6480: 31 35 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  15; i++){.      
6490: 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 52 61  int n = sqliteRa
64a0: 6e 64 6f 6d 42 79 74 65 28 29 20 25 20 73 69 7a  ndomByte() % siz
64b0: 65 6f 66 28 7a 43 68 61 72 73 29 3b 0a 20 20 20  eof(zChars);.   
64c0: 20 20 20 7a 42 75 66 5b 6a 2b 2b 5d 20 3d 20 7a     zBuf[j++] = z
64d0: 43 68 61 72 73 5b 6e 5d 3b 0a 20 20 20 20 7d 0a  Chars[n];.    }.
64e0: 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 30 3b      zBuf[j] = 0;
64f0: 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65  .    if( !sqlite
6500: 4f 73 46 69 6c 65 45 78 69 73 74 73 28 7a 42 75  OsFileExists(zBu
6510: 66 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  f) ) break;.  }.
6520: 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
6530: 53 51 4c 49 54 45 5f 4f 4b 3b 20 0a 7d 0a 0a 2f  SQLITE_OK; .}../
6540: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c  *.** Close a fil
6550: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
6560: 4f 73 43 6c 6f 73 65 28 4f 73 46 69 6c 65 20 2a  OsClose(OsFile *
6570: 69 64 29 7b 0a 23 69 66 20 4f 53 5f 55 4e 49 58  id){.#if OS_UNIX
6580: 0a 20 20 73 71 6c 69 74 65 4f 73 55 6e 6c 6f 63  .  sqliteOsUnloc
6590: 6b 28 69 64 29 3b 0a 20 20 69 66 28 20 69 64 2d  k(id);.  if( id-
65a0: 3e 64 69 72 66 64 3e 3d 30 20 29 20 63 6c 6f 73  >dirfd>=0 ) clos
65b0: 65 28 69 64 2d 3e 64 69 72 66 64 29 3b 0a 20 20  e(id->dirfd);.  
65c0: 69 64 2d 3e 64 69 72 66 64 20 3d 20 2d 31 3b 0a  id->dirfd = -1;.
65d0: 20 20 73 71 6c 69 74 65 4f 73 45 6e 74 65 72 4d    sqliteOsEnterM
65e0: 75 74 65 78 28 29 3b 0a 20 20 69 66 28 20 69 64  utex();.  if( id
65f0: 2d 3e 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 20 29  ->pOpen->nLock )
6600: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  {.    /* If ther
6610: 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e  e are outstandin
6620: 67 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74 20  g locks, do not 
6630: 61 63 74 75 61 6c 6c 79 20 63 6c 6f 73 65 20 74  actually close t
6640: 68 65 20 66 69 6c 65 20 6a 75 73 74 0a 20 20 20  he file just.   
6650: 20 2a 2a 20 79 65 74 20 62 65 63 61 75 73 65 20   ** yet because 
6660: 74 68 61 74 20 77 6f 75 6c 64 20 63 6c 65 61 72  that would clear
6670: 20 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 20 49   those locks.  I
6680: 6e 73 74 65 61 64 2c 20 61 64 64 20 74 68 65 20  nstead, add the 
6690: 66 69 6c 65 0a 20 20 20 20 2a 2a 20 64 65 73 63  file.    ** desc
66a0: 72 69 70 74 6f 72 20 74 6f 20 70 4f 70 65 6e 2d  riptor to pOpen-
66b0: 3e 61 50 65 6e 64 69 6e 67 2e 20 20 49 74 20 77  >aPending.  It w
66c0: 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74 69 63  ill be automatic
66d0: 61 6c 6c 79 20 63 6c 6f 73 65 64 20 77 68 65 6e  ally closed when
66e0: 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 61 73 74  .    ** the last
66f0: 20 6c 6f 63 6b 20 69 73 20 63 6c 65 61 72 65 64   lock is cleared
6700: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74  ..    */.    int
6710: 20 2a 61 4e 65 77 3b 0a 20 20 20 20 73 74 72 75   *aNew;.    stru
6720: 63 74 20 6f 70 65 6e 43 6e 74 20 2a 70 4f 70 65  ct openCnt *pOpe
6730: 6e 20 3d 20 69 64 2d 3e 70 4f 70 65 6e 3b 0a 20  n = id->pOpen;. 
6740: 20 20 20 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69     pOpen->nPendi
6750: 6e 67 2b 2b 3b 0a 20 20 20 20 61 4e 65 77 20 3d  ng++;.    aNew =
6760: 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28 20   sqliteRealloc( 
6770: 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 2c  pOpen->aPending,
6780: 20 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67   pOpen->nPending
6790: 2a 73 69 7a 65 6f 66 28 69 6e 74 29 20 29 3b 0a  *sizeof(int) );.
67a0: 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30 20      if( aNew==0 
67b0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 61  ){.      /* If a
67c0: 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2c 20 6a   malloc fails, j
67d0: 75 73 74 20 6c 65 61 6b 20 74 68 65 20 66 69 6c  ust leak the fil
67e0: 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a  e descriptor */.
67f0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
6800: 20 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67   pOpen->aPending
6810: 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20 20 20 70   = aNew;.      p
6820: 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 5b 70  Open->aPending[p
6830: 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67 2d 31  Open->nPending-1
6840: 5d 20 3d 20 69 64 2d 3e 66 64 3b 0a 20 20 20 20  ] = id->fd;.    
6850: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  }.  }else{.    /
6860: 2a 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20 6f  * There are no o
6870: 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73  utstanding locks
6880: 20 73 6f 20 77 65 20 63 61 6e 20 63 6c 6f 73 65   so we can close
6890: 20 74 68 65 20 66 69 6c 65 20 69 6d 6d 65 64 69   the file immedi
68a0: 61 74 65 6c 79 20 2a 2f 0a 20 20 20 20 63 6c 6f  ately */.    clo
68b0: 73 65 28 69 64 2d 3e 66 64 29 3b 0a 20 20 7d 0a  se(id->fd);.  }.
68c0: 20 20 72 65 6c 65 61 73 65 4c 6f 63 6b 49 6e 66    releaseLockInf
68d0: 6f 28 69 64 2d 3e 70 4c 6f 63 6b 29 3b 0a 20 20  o(id->pLock);.  
68e0: 72 65 6c 65 61 73 65 4f 70 65 6e 43 6e 74 28 69  releaseOpenCnt(i
68f0: 64 2d 3e 70 4f 70 65 6e 29 3b 0a 20 20 73 71 6c  d->pOpen);.  sql
6900: 69 74 65 4f 73 4c 65 61 76 65 4d 75 74 65 78 28  iteOsLeaveMutex(
6910: 29 3b 0a 20 20 54 52 41 43 45 32 28 22 43 4c 4f  );.  TRACE2("CLO
6920: 53 45 20 20 20 25 2d 33 64 5c 6e 22 2c 20 69 64  SE   %-3d\n", id
6930: 2d 3e 66 64 29 3b 0a 20 20 4f 70 65 6e 43 6f 75  ->fd);.  OpenCou
6940: 6e 74 65 72 28 2d 31 29 3b 0a 20 20 72 65 74 75  nter(-1);.  retu
6950: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65  rn SQLITE_OK;.#e
6960: 6e 64 69 66 0a 23 69 66 20 4f 53 5f 57 49 4e 0a  ndif.#if OS_WIN.
6970: 20 20 43 6c 6f 73 65 48 61 6e 64 6c 65 28 69 64    CloseHandle(id
6980: 2d 3e 68 29 3b 0a 20 20 4f 70 65 6e 43 6f 75 6e  ->h);.  OpenCoun
6990: 74 65 72 28 2d 31 29 3b 0a 20 20 72 65 74 75 72  ter(-1);.  retur
69a0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e  n SQLITE_OK;.#en
69b0: 64 69 66 0a 23 69 66 20 4f 53 5f 4d 41 43 0a 20  dif.#if OS_MAC. 
69c0: 20 69 66 28 20 69 64 2d 3e 72 65 66 4e 75 6d 52   if( id->refNumR
69d0: 46 21 3d 2d 31 20 29 0a 20 20 20 20 46 53 43 6c  F!=-1 ).    FSCl
69e0: 6f 73 65 28 69 64 2d 3e 72 65 66 4e 75 6d 52 46  ose(id->refNumRF
69f0: 29 3b 0a 23 20 69 66 64 65 66 20 5f 4c 41 52 47  );.# ifdef _LARG
6a00: 45 5f 46 49 4c 45 0a 20 20 46 53 43 6c 6f 73 65  E_FILE.  FSClose
6a10: 46 6f 72 6b 28 69 64 2d 3e 72 65 66 4e 75 6d 29  Fork(id->refNum)
6a20: 3b 0a 23 20 65 6c 73 65 0a 20 20 46 53 43 6c 6f  ;.# else.  FSClo
6a30: 73 65 28 69 64 2d 3e 72 65 66 4e 75 6d 29 3b 0a  se(id->refNum);.
6a40: 23 20 65 6e 64 69 66 0a 20 20 69 66 28 20 69 64  # endif.  if( id
6a50: 2d 3e 64 65 6c 4f 6e 43 6c 6f 73 65 20 29 7b 0a  ->delOnClose ){.
6a60: 20 20 20 20 75 6e 6c 69 6e 6b 28 69 64 2d 3e 70      unlink(id->p
6a70: 61 74 68 54 6f 44 65 6c 29 3b 0a 20 20 20 20 73  athToDel);.    s
6a80: 71 6c 69 74 65 46 72 65 65 28 69 64 2d 3e 70 61  qliteFree(id->pa
6a90: 74 68 54 6f 44 65 6c 29 3b 0a 20 20 7d 0a 20 20  thToDel);.  }.  
6aa0: 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2d 31 29 3b  OpenCounter(-1);
6ab0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
6ac0: 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  _OK;.#endif.}../
6ad0: 2a 0a 2a 2a 20 52 65 61 64 20 64 61 74 61 20 66  *.** Read data f
6ae0: 72 6f 6d 20 61 20 66 69 6c 65 20 69 6e 74 6f 20  rom a file into 
6af0: 61 20 62 75 66 66 65 72 2e 20 20 52 65 74 75 72  a buffer.  Retur
6b00: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 61  n SQLITE_OK if a
6b10: 6c 6c 0a 2a 2a 20 62 79 74 65 73 20 77 65 72 65  ll.** bytes were
6b20: 20 72 65 61 64 20 73 75 63 63 65 73 73 66 75 6c   read successful
6b30: 6c 79 20 61 6e 64 20 53 51 4c 49 54 45 5f 49 4f  ly and SQLITE_IO
6b40: 45 52 52 20 69 66 20 61 6e 79 74 68 69 6e 67 20  ERR if anything 
6b50: 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 0a 2a  goes.** wrong..*
6b60: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 4f 73 52 65  /.int sqliteOsRe
6b70: 61 64 28 4f 73 46 69 6c 65 20 2a 69 64 2c 20 76  ad(OsFile *id, v
6b80: 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e 74 20 61  oid *pBuf, int a
6b90: 6d 74 29 7b 0a 23 69 66 20 4f 53 5f 55 4e 49 58  mt){.#if OS_UNIX
6ba0: 0a 20 20 69 6e 74 20 67 6f 74 3b 0a 20 20 53 69  .  int got;.  Si
6bb0: 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 53 51  mulateIOError(SQ
6bc0: 4c 49 54 45 5f 49 4f 45 52 52 29 3b 0a 20 20 54  LITE_IOERR);.  T
6bd0: 49 4d 45 52 5f 53 54 41 52 54 3b 0a 20 20 67 6f  IMER_START;.  go
6be0: 74 20 3d 20 72 65 61 64 28 69 64 2d 3e 66 64 2c  t = read(id->fd,
6bf0: 20 70 42 75 66 2c 20 61 6d 74 29 3b 0a 20 20 54   pBuf, amt);.  T
6c00: 49 4d 45 52 5f 45 4e 44 3b 0a 20 20 54 52 41 43  IMER_END;.  TRAC
6c10: 45 34 28 22 52 45 41 44 20 20 20 20 25 2d 33 64  E4("READ    %-3d
6c20: 20 25 37 64 20 25 64 5c 6e 22 2c 20 69 64 2d 3e   %7d %d\n", id->
6c30: 66 64 2c 20 6c 61 73 74 5f 70 61 67 65 2c 20 65  fd, last_page, e
6c40: 6c 61 70 73 65 29 3b 0a 20 20 53 45 45 4b 28 30  lapse);.  SEEK(0
6c50: 29 3b 0a 20 20 2f 2a 20 69 66 28 20 67 6f 74 3c  );.  /* if( got<
6c60: 30 20 29 20 67 6f 74 20 3d 20 30 3b 20 2a 2f 0a  0 ) got = 0; */.
6c70: 20 20 69 66 28 20 67 6f 74 3d 3d 61 6d 74 20 29    if( got==amt )
6c80: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
6c90: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b  ITE_OK;.  }else{
6ca0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
6cb0: 54 45 5f 49 4f 45 52 52 3b 0a 20 20 7d 0a 23 65  TE_IOERR;.  }.#e
6cc0: 6e 64 69 66 0a 23 69 66 20 4f 53 5f 57 49 4e 0a  ndif.#if OS_WIN.
6cd0: 20 20 44 57 4f 52 44 20 67 6f 74 3b 0a 20 20 53    DWORD got;.  S
6ce0: 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 53  imulateIOError(S
6cf0: 51 4c 49 54 45 5f 49 4f 45 52 52 29 3b 0a 20 20  QLITE_IOERR);.  
6d00: 54 52 41 43 45 32 28 22 52 45 41 44 20 25 64 5c  TRACE2("READ %d\
6d10: 6e 22 2c 20 6c 61 73 74 5f 70 61 67 65 29 3b 0a  n", last_page);.
6d20: 20 20 69 66 28 20 21 52 65 61 64 46 69 6c 65 28    if( !ReadFile(
6d30: 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 61 6d 74  id->h, pBuf, amt
6d40: 2c 20 26 67 6f 74 2c 20 30 29 20 29 7b 0a 20 20  , &got, 0) ){.  
6d50: 20 20 67 6f 74 20 3d 20 30 3b 0a 20 20 7d 0a 20    got = 0;.  }. 
6d60: 20 69 66 28 20 67 6f 74 3d 3d 28 44 57 4f 52 44   if( got==(DWORD
6d70: 29 61 6d 74 20 29 7b 0a 20 20 20 20 72 65 74 75  )amt ){.    retu
6d80: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
6d90: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
6da0: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a  n SQLITE_IOERR;.
6db0: 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f    }.#endif.#if O
6dc0: 53 5f 4d 41 43 0a 20 20 69 6e 74 20 67 6f 74 3b  S_MAC.  int got;
6dd0: 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
6de0: 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 29  or(SQLITE_IOERR)
6df0: 3b 0a 20 20 54 52 41 43 45 32 28 22 52 45 41 44  ;.  TRACE2("READ
6e00: 20 25 64 5c 6e 22 2c 20 6c 61 73 74 5f 70 61 67   %d\n", last_pag
6e10: 65 29 3b 0a 23 20 69 66 64 65 66 20 5f 4c 41 52  e);.# ifdef _LAR
6e20: 47 45 5f 46 49 4c 45 0a 20 20 46 53 52 65 61 64  GE_FILE.  FSRead
6e30: 46 6f 72 6b 28 69 64 2d 3e 72 65 66 4e 75 6d 2c  Fork(id->refNum,
6e40: 20 66 73 41 74 4d 61 72 6b 2c 20 30 2c 20 28 42   fsAtMark, 0, (B
6e50: 79 74 65 43 6f 75 6e 74 29 61 6d 74 2c 20 70 42  yteCount)amt, pB
6e60: 75 66 2c 20 28 42 79 74 65 43 6f 75 6e 74 2a 29  uf, (ByteCount*)
6e70: 26 67 6f 74 29 3b 0a 23 20 65 6c 73 65 0a 20 20  &got);.# else.  
6e80: 67 6f 74 20 3d 20 61 6d 74 3b 0a 20 20 46 53 52  got = amt;.  FSR
6e90: 65 61 64 28 69 64 2d 3e 72 65 66 4e 75 6d 2c 20  ead(id->refNum, 
6ea0: 26 67 6f 74 2c 20 70 42 75 66 29 3b 0a 23 20 65  &got, pBuf);.# e
6eb0: 6e 64 69 66 0a 20 20 69 66 28 20 67 6f 74 3d 3d  ndif.  if( got==
6ec0: 61 6d 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72  amt ){.    retur
6ed0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
6ee0: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
6ef0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20   SQLITE_IOERR;. 
6f00: 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a   }.#endif.}../*.
6f10: 2a 2a 20 57 72 69 74 65 20 64 61 74 61 20 66 72  ** Write data fr
6f20: 6f 6d 20 61 20 62 75 66 66 65 72 20 69 6e 74 6f  om a buffer into
6f30: 20 61 20 66 69 6c 65 2e 20 20 52 65 74 75 72 6e   a file.  Return
6f40: 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
6f50: 63 63 65 73 73 0a 2a 2a 20 6f 72 20 73 6f 6d 65  ccess.** or some
6f60: 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64   other error cod
6f70: 65 20 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f  e on failure..*/
6f80: 0a 69 6e 74 20 73 71 6c 69 74 65 4f 73 57 72 69  .int sqliteOsWri
6f90: 74 65 28 4f 73 46 69 6c 65 20 2a 69 64 2c 20 63  te(OsFile *id, c
6fa0: 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 75 66 2c  onst void *pBuf,
6fb0: 20 69 6e 74 20 61 6d 74 29 7b 0a 23 69 66 20 4f   int amt){.#if O
6fc0: 53 5f 55 4e 49 58 0a 20 20 69 6e 74 20 77 72 6f  S_UNIX.  int wro
6fd0: 74 65 20 3d 20 30 3b 0a 20 20 53 69 6d 75 6c 61  te = 0;.  Simula
6fe0: 74 65 49 4f 45 72 72 6f 72 28 53 51 4c 49 54 45  teIOError(SQLITE
6ff0: 5f 49 4f 45 52 52 29 3b 0a 20 20 54 49 4d 45 52  _IOERR);.  TIMER
7000: 5f 53 54 41 52 54 3b 0a 20 20 77 68 69 6c 65 28  _START;.  while(
7010: 20 61 6d 74 3e 30 20 26 26 20 28 77 72 6f 74 65   amt>0 && (wrote
7020: 20 3d 20 77 72 69 74 65 28 69 64 2d 3e 66 64 2c   = write(id->fd,
7030: 20 70 42 75 66 2c 20 61 6d 74 29 29 3e 30 20 29   pBuf, amt))>0 )
7040: 7b 0a 20 20 20 20 61 6d 74 20 2d 3d 20 77 72 6f  {.    amt -= wro
7050: 74 65 3b 0a 20 20 20 20 70 42 75 66 20 3d 20 26  te;.    pBuf = &
7060: 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b 77 72  ((char*)pBuf)[wr
7070: 6f 74 65 5d 3b 0a 20 20 7d 0a 20 20 54 49 4d 45  ote];.  }.  TIME
7080: 52 5f 45 4e 44 3b 0a 20 20 54 52 41 43 45 34 28  R_END;.  TRACE4(
7090: 22 57 52 49 54 45 20 20 20 25 2d 33 64 20 25 37  "WRITE   %-3d %7
70a0: 64 20 25 64 5c 6e 22 2c 20 69 64 2d 3e 66 64 2c  d %d\n", id->fd,
70b0: 20 6c 61 73 74 5f 70 61 67 65 2c 20 65 6c 61 70   last_page, elap
70c0: 73 65 29 3b 0a 20 20 53 45 45 4b 28 30 29 3b 0a  se);.  SEEK(0);.
70d0: 20 20 69 66 28 20 61 6d 74 3e 30 20 29 7b 0a 20    if( amt>0 ){. 
70e0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
70f0: 5f 46 55 4c 4c 3b 0a 20 20 7d 0a 20 20 72 65 74  _FULL;.  }.  ret
7100: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23  urn SQLITE_OK;.#
7110: 65 6e 64 69 66 0a 23 69 66 20 4f 53 5f 57 49 4e  endif.#if OS_WIN
7120: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 44 57 4f  .  int rc;.  DWO
7130: 52 44 20 77 72 6f 74 65 3b 0a 20 20 53 69 6d 75  RD wrote;.  Simu
7140: 6c 61 74 65 49 4f 45 72 72 6f 72 28 53 51 4c 49  lateIOError(SQLI
7150: 54 45 5f 49 4f 45 52 52 29 3b 0a 20 20 54 52 41  TE_IOERR);.  TRA
7160: 43 45 32 28 22 57 52 49 54 45 20 25 64 5c 6e 22  CE2("WRITE %d\n"
7170: 2c 20 6c 61 73 74 5f 70 61 67 65 29 3b 0a 20 20  , last_page);.  
7180: 77 68 69 6c 65 28 20 61 6d 74 3e 30 20 26 26 20  while( amt>0 && 
7190: 28 72 63 20 3d 20 57 72 69 74 65 46 69 6c 65 28  (rc = WriteFile(
71a0: 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 61 6d 74  id->h, pBuf, amt
71b0: 2c 20 26 77 72 6f 74 65 2c 20 30 29 29 21 3d 30  , &wrote, 0))!=0
71c0: 20 26 26 20 77 72 6f 74 65 3e 30 20 29 7b 0a 20   && wrote>0 ){. 
71d0: 20 20 20 61 6d 74 20 2d 3d 20 77 72 6f 74 65 3b     amt -= wrote;
71e0: 0a 20 20 20 20 70 42 75 66 20 3d 20 26 28 28 63  .    pBuf = &((c
71f0: 68 61 72 2a 29 70 42 75 66 29 5b 77 72 6f 74 65  har*)pBuf)[wrote
7200: 5d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 72 63  ];.  }.  if( !rc
7210: 20 7c 7c 20 61 6d 74 3e 28 69 6e 74 29 77 72 6f   || amt>(int)wro
7220: 74 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  te ){.    return
7230: 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20   SQLITE_FULL;.  
7240: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
7250: 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 23 69 66  E_OK;.#endif.#if
7260: 20 4f 53 5f 4d 41 43 0a 20 20 4f 53 45 72 72 20   OS_MAC.  OSErr 
7270: 6f 73 65 72 72 3b 0a 20 20 69 6e 74 20 77 72 6f  oserr;.  int wro
7280: 74 65 20 3d 20 30 3b 0a 20 20 53 69 6d 75 6c 61  te = 0;.  Simula
7290: 74 65 49 4f 45 72 72 6f 72 28 53 51 4c 49 54 45  teIOError(SQLITE
72a0: 5f 49 4f 45 52 52 29 3b 0a 20 20 54 52 41 43 45  _IOERR);.  TRACE
72b0: 32 28 22 57 52 49 54 45 20 25 64 5c 6e 22 2c 20  2("WRITE %d\n", 
72c0: 6c 61 73 74 5f 70 61 67 65 29 3b 0a 20 20 77 68  last_page);.  wh
72d0: 69 6c 65 28 20 61 6d 74 3e 30 20 29 7b 0a 23 20  ile( amt>0 ){.# 
72e0: 69 66 64 65 66 20 5f 4c 41 52 47 45 5f 46 49 4c  ifdef _LARGE_FIL
72f0: 45 0a 20 20 20 20 6f 73 65 72 72 20 3d 20 46 53  E.    oserr = FS
7300: 57 72 69 74 65 46 6f 72 6b 28 69 64 2d 3e 72 65  WriteFork(id->re
7310: 66 4e 75 6d 2c 20 66 73 41 74 4d 61 72 6b 2c 20  fNum, fsAtMark, 
7320: 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
7330: 20 20 20 20 20 20 20 20 20 20 20 28 42 79 74 65             (Byte
7340: 43 6f 75 6e 74 29 61 6d 74 2c 20 70 42 75 66 2c  Count)amt, pBuf,
7350: 20 28 42 79 74 65 43 6f 75 6e 74 2a 29 26 77 72   (ByteCount*)&wr
7360: 6f 74 65 29 3b 0a 23 20 65 6c 73 65 0a 20 20 20  ote);.# else.   
7370: 20 77 72 6f 74 65 20 3d 20 61 6d 74 3b 0a 20 20   wrote = amt;.  
7380: 20 20 6f 73 65 72 72 20 3d 20 46 53 57 72 69 74    oserr = FSWrit
7390: 65 28 69 64 2d 3e 72 65 66 4e 75 6d 2c 20 26 77  e(id->refNum, &w
73a0: 72 6f 74 65 2c 20 70 42 75 66 29 3b 0a 23 20 65  rote, pBuf);.# e
73b0: 6e 64 69 66 0a 20 20 20 20 69 66 28 20 77 72 6f  ndif.    if( wro
73c0: 74 65 20 3d 3d 20 30 20 7c 7c 20 6f 73 65 72 72  te == 0 || oserr
73d0: 20 21 3d 20 6e 6f 45 72 72 29 0a 20 20 20 20 20   != noErr).     
73e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 61 6d 74 20   break;.    amt 
73f0: 2d 3d 20 77 72 6f 74 65 3b 0a 20 20 20 20 70 42  -= wrote;.    pB
7400: 75 66 20 3d 20 26 28 28 63 68 61 72 2a 29 70 42  uf = &((char*)pB
7410: 75 66 29 5b 77 72 6f 74 65 5d 3b 0a 20 20 7d 0a  uf)[wrote];.  }.
7420: 20 20 69 66 28 20 6f 73 65 72 72 20 21 3d 20 6e    if( oserr != n
7430: 6f 45 72 72 20 7c 7c 20 61 6d 74 3e 77 72 6f 74  oErr || amt>wrot
7440: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
7450: 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 7d  SQLITE_FULL;.  }
7460: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
7470: 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  _OK;.#endif.}../
7480: 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 72 65  *.** Move the re
7490: 61 64 2f 77 72 69 74 65 20 70 6f 69 6e 74 65 72  ad/write pointer
74a0: 20 69 6e 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 69   in a file..*/.i
74b0: 6e 74 20 73 71 6c 69 74 65 4f 73 53 65 65 6b 28  nt sqliteOsSeek(
74c0: 4f 73 46 69 6c 65 20 2a 69 64 2c 20 6f 66 66 5f  OsFile *id, off_
74d0: 74 20 6f 66 66 73 65 74 29 7b 0a 20 20 53 45 45  t offset){.  SEE
74e0: 4b 28 6f 66 66 73 65 74 2f 31 30 32 34 20 2b 20  K(offset/1024 + 
74f0: 31 29 3b 0a 23 69 66 20 4f 53 5f 55 4e 49 58 0a  1);.#if OS_UNIX.
7500: 20 20 6c 73 65 65 6b 28 69 64 2d 3e 66 64 2c 20    lseek(id->fd, 
7510: 6f 66 66 73 65 74 2c 20 53 45 45 4b 5f 53 45 54  offset, SEEK_SET
7520: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
7530: 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 23 69  TE_OK;.#endif.#i
7540: 66 20 4f 53 5f 57 49 4e 0a 20 20 7b 0a 20 20 20  f OS_WIN.  {.   
7550: 20 4c 4f 4e 47 20 75 70 70 65 72 42 69 74 73 20   LONG upperBits 
7560: 3d 20 6f 66 66 73 65 74 3e 3e 33 32 3b 0a 20 20  = offset>>32;.  
7570: 20 20 4c 4f 4e 47 20 6c 6f 77 65 72 42 69 74 73    LONG lowerBits
7580: 20 3d 20 6f 66 66 73 65 74 20 26 20 30 78 66 66   = offset & 0xff
7590: 66 66 66 66 66 66 3b 0a 20 20 20 20 44 57 4f 52  ffffff;.    DWOR
75a0: 44 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 53  D rc;.    rc = S
75b0: 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 28 69 64  etFilePointer(id
75c0: 2d 3e 68 2c 20 6c 6f 77 65 72 42 69 74 73 2c 20  ->h, lowerBits, 
75d0: 26 75 70 70 65 72 42 69 74 73 2c 20 46 49 4c 45  &upperBits, FILE
75e0: 5f 42 45 47 49 4e 29 3b 0a 20 20 20 20 2f 2a 20  _BEGIN);.    /* 
75f0: 54 52 41 43 45 33 28 22 53 45 45 4b 20 72 63 3d  TRACE3("SEEK rc=
7600: 30 78 25 78 20 75 70 70 65 72 3d 30 78 25 78 5c  0x%x upper=0x%x\
7610: 6e 22 2c 20 72 63 2c 20 75 70 70 65 72 42 69 74  n", rc, upperBit
7620: 73 29 3b 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74  s); */.  }.  ret
7630: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23  urn SQLITE_OK;.#
7640: 65 6e 64 69 66 0a 23 69 66 20 4f 53 5f 4d 41 43  endif.#if OS_MAC
7650: 0a 20 20 7b 0a 20 20 20 20 6f 66 66 5f 74 20 63  .  {.    off_t c
7660: 75 72 53 69 7a 65 3b 0a 20 20 20 20 69 66 28 20  urSize;.    if( 
7670: 73 71 6c 69 74 65 4f 73 46 69 6c 65 53 69 7a 65  sqliteOsFileSize
7680: 28 69 64 2c 20 26 63 75 72 53 69 7a 65 29 20 21  (id, &curSize) !
7690: 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  = SQLITE_OK ){. 
76a0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
76b0: 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 7d 0a  TE_IOERR;.    }.
76c0: 20 20 20 20 69 66 28 20 6f 66 66 73 65 74 20 3e      if( offset >
76d0: 3d 20 63 75 72 53 69 7a 65 20 29 7b 0a 20 20 20  = curSize ){.   
76e0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 4f 73 54     if( sqliteOsT
76f0: 72 75 6e 63 61 74 65 28 69 64 2c 20 6f 66 66 73  runcate(id, offs
7700: 65 74 2b 31 29 20 21 3d 20 53 51 4c 49 54 45 5f  et+1) != SQLITE_
7710: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
7720: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
7730: 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  R;.      }.    }
7740: 0a 23 20 69 66 64 65 66 20 5f 4c 41 52 47 45 5f  .# ifdef _LARGE_
7750: 46 49 4c 45 0a 20 20 20 20 69 66 28 20 46 53 53  FILE.    if( FSS
7760: 65 74 46 6f 72 6b 50 6f 73 69 74 69 6f 6e 28 69  etForkPosition(i
7770: 64 2d 3e 72 65 66 4e 75 6d 2c 20 66 73 46 72 6f  d->refNum, fsFro
7780: 6d 53 74 61 72 74 2c 20 6f 66 66 73 65 74 29 20  mStart, offset) 
7790: 21 3d 20 6e 6f 45 72 72 20 29 7b 0a 23 20 65 6c  != noErr ){.# el
77a0: 73 65 0a 20 20 20 20 69 66 28 20 53 65 74 46 50  se.    if( SetFP
77b0: 6f 73 28 69 64 2d 3e 72 65 66 4e 75 6d 2c 20 66  os(id->refNum, f
77c0: 73 46 72 6f 6d 53 74 61 72 74 2c 20 6f 66 66 73  sFromStart, offs
77d0: 65 74 29 20 21 3d 20 6e 6f 45 72 72 20 29 7b 0a  et) != noErr ){.
77e0: 23 20 65 6e 64 69 66 0a 20 20 20 20 20 20 72 65  # endif.      re
77f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
7800: 52 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  R;.    }else{.  
7810: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
7820: 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E_OK;.    }.  }.
7830: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
7840: 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 77 72  Make sure all wr
7850: 69 74 65 73 20 74 6f 20 61 20 70 61 72 74 69 63  ites to a partic
7860: 75 6c 61 72 20 66 69 6c 65 20 61 72 65 20 63 6f  ular file are co
7870: 6d 6d 69 74 74 65 64 20 74 6f 20 64 69 73 6b 2e  mmitted to disk.
7880: 0a 2a 2a 0a 2a 2a 20 55 6e 64 65 72 20 55 6e 69  .**.** Under Uni
7890: 78 2c 20 61 6c 73 6f 20 6d 61 6b 65 20 73 75 72  x, also make sur
78a0: 65 20 74 68 61 74 20 74 68 65 20 64 69 72 65 63  e that the direc
78b0: 74 6f 72 79 20 65 6e 74 72 79 20 66 6f 72 20 74  tory entry for t
78c0: 68 65 20 66 69 6c 65 0a 2a 2a 20 68 61 73 20 62  he file.** has b
78d0: 65 65 6e 20 63 72 65 61 74 65 64 20 62 79 20 66  een created by f
78e0: 73 79 6e 63 2d 69 6e 67 20 74 68 65 20 64 69 72  sync-ing the dir
78f0: 65 63 74 6f 72 79 20 74 68 61 74 20 63 6f 6e 74  ectory that cont
7900: 61 69 6e 73 20 74 68 65 20 66 69 6c 65 2e 0a 2a  ains the file..*
7910: 2a 20 49 66 20 77 65 20 64 6f 20 6e 6f 74 20 64  * If we do not d
7920: 6f 20 74 68 69 73 20 61 6e 64 20 77 65 20 65 6e  o this and we en
7930: 63 6f 75 6e 74 65 72 20 61 20 70 6f 77 65 72 20  counter a power 
7940: 66 61 69 6c 75 72 65 2c 20 74 68 65 20 64 69 72  failure, the dir
7950: 65 63 74 6f 72 79 0a 2a 2a 20 65 6e 74 72 79 20  ectory.** entry 
7960: 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  for the journal 
7970: 6d 69 67 68 74 20 6e 6f 74 20 65 78 69 73 74 20  might not exist 
7980: 61 66 74 65 72 20 77 65 20 72 65 62 6f 6f 74 2e  after we reboot.
7990: 20 20 54 68 65 20 6e 65 78 74 0a 2a 2a 20 53 51    The next.** SQ
79a0: 4c 69 74 65 20 74 6f 20 61 63 63 65 73 73 20 74  Lite to access t
79b0: 68 65 20 66 69 6c 65 20 77 69 6c 6c 20 6e 6f 74  he file will not
79c0: 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 6a   know that the j
79d0: 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 20 28 62  ournal exists (b
79e0: 65 63 61 75 73 65 0a 2a 2a 20 74 68 65 20 64 69  ecause.** the di
79f0: 72 65 63 74 6f 72 79 20 65 6e 74 72 79 20 66 6f  rectory entry fo
7a00: 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61  r the journal wa
7a10: 73 20 6e 65 76 65 72 20 63 72 65 61 74 65 64 29  s never created)
7a20: 20 61 6e 64 20 74 68 65 20 74 72 61 6e 73 61 63   and the transac
7a30: 74 69 6f 6e 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74  tion.** will not
7a40: 20 72 6f 6c 6c 20 62 61 63 6b 20 2d 20 70 6f 73   roll back - pos
7a50: 73 69 62 6c 79 20 6c 65 61 64 69 6e 67 20 74 6f  sibly leading to
7a60: 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
7a70: 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tion..*/.int sql
7a80: 69 74 65 4f 73 53 79 6e 63 28 4f 73 46 69 6c 65  iteOsSync(OsFile
7a90: 20 2a 69 64 29 7b 0a 23 69 66 20 4f 53 5f 55 4e   *id){.#if OS_UN
7aa0: 49 58 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  IX.  SimulateIOE
7ab0: 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
7ac0: 52 29 3b 0a 20 20 54 52 41 43 45 32 28 22 53 59  R);.  TRACE2("SY
7ad0: 4e 43 20 20 20 20 25 2d 33 64 5c 6e 22 2c 20 69  NC    %-3d\n", i
7ae0: 64 2d 3e 66 64 29 3b 0a 20 20 69 66 28 20 66 73  d->fd);.  if( fs
7af0: 79 6e 63 28 69 64 2d 3e 66 64 29 20 29 7b 0a 20  ync(id->fd) ){. 
7b00: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
7b10: 5f 49 4f 45 52 52 3b 0a 20 20 7d 65 6c 73 65 7b  _IOERR;.  }else{
7b20: 0a 20 20 20 20 69 66 28 20 69 64 2d 3e 64 69 72  .    if( id->dir
7b30: 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 54  fd>=0 ){.      T
7b40: 52 41 43 45 32 28 22 44 49 52 53 59 4e 43 20 25  RACE2("DIRSYNC %
7b50: 2d 33 64 5c 6e 22 2c 20 69 64 2d 3e 64 69 72 66  -3d\n", id->dirf
7b60: 64 29 3b 0a 20 20 20 20 20 20 66 73 79 6e 63 28  d);.      fsync(
7b70: 69 64 2d 3e 64 69 72 66 64 29 3b 0a 20 20 20 20  id->dirfd);.    
7b80: 20 20 63 6c 6f 73 65 28 69 64 2d 3e 64 69 72 66    close(id->dirf
7b90: 64 29 3b 20 20 2f 2a 20 4f 6e 6c 79 20 6e 65 65  d);  /* Only nee
7ba0: 64 20 74 6f 20 73 79 6e 63 20 6f 6e 63 65 2c 20  d to sync once, 
7bb0: 73 6f 20 63 6c 6f 73 65 20 74 68 65 20 64 69 72  so close the dir
7bc0: 65 63 74 6f 72 79 20 2a 2f 0a 20 20 20 20 20 20  ectory */.      
7bd0: 69 64 2d 3e 64 69 72 66 64 20 3d 20 2d 31 3b 20  id->dirfd = -1; 
7be0: 20 20 20 2f 2a 20 77 68 65 6e 20 77 65 20 61 72     /* when we ar
7bf0: 65 20 64 6f 6e 65 2e 20 2a 2f 0a 20 20 20 20 7d  e done. */.    }
7c00: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
7c10: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 23 65 6e 64 69  TE_OK;.  }.#endi
7c20: 66 0a 23 69 66 20 4f 53 5f 57 49 4e 0a 20 20 69  f.#if OS_WIN.  i
7c30: 66 28 20 46 6c 75 73 68 46 69 6c 65 42 75 66 66  f( FlushFileBuff
7c40: 65 72 73 28 69 64 2d 3e 68 29 20 29 7b 0a 20 20  ers(id->h) ){.  
7c50: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
7c60: 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OK;.  }else{.   
7c70: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
7c80: 4f 45 52 52 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  OERR;.  }.#endif
7c90: 0a 23 69 66 20 4f 53 5f 4d 41 43 0a 23 20 69 66  .#if OS_MAC.# if
7ca0: 64 65 66 20 5f 4c 41 52 47 45 5f 46 49 4c 45 0a  def _LARGE_FILE.
7cb0: 20 20 69 66 28 20 46 53 46 6c 75 73 68 46 6f 72    if( FSFlushFor
7cc0: 6b 28 69 64 2d 3e 72 65 66 4e 75 6d 29 20 21 3d  k(id->refNum) !=
7cd0: 20 6e 6f 45 72 72 20 29 7b 0a 23 20 65 6c 73 65   noErr ){.# else
7ce0: 0a 20 20 50 61 72 61 6d 42 6c 6f 63 6b 52 65 63  .  ParamBlockRec
7cf0: 20 70 61 72 61 6d 73 3b 0a 20 20 6d 65 6d 73 65   params;.  memse
7d00: 74 28 26 70 61 72 61 6d 73 2c 20 30 2c 20 73 69  t(&params, 0, si
7d10: 7a 65 6f 66 28 50 61 72 61 6d 42 6c 6f 63 6b 52  zeof(ParamBlockR
7d20: 65 63 29 29 3b 0a 20 20 70 61 72 61 6d 73 2e 69  ec));.  params.i
7d30: 6f 50 61 72 61 6d 2e 69 6f 52 65 66 4e 75 6d 20  oParam.ioRefNum 
7d40: 3d 20 69 64 2d 3e 72 65 66 4e 75 6d 3b 0a 20 20  = id->refNum;.  
7d50: 69 66 28 20 50 42 46 6c 75 73 68 46 69 6c 65 53  if( PBFlushFileS
7d60: 79 6e 63 28 26 70 61 72 61 6d 73 29 20 21 3d 20  ync(&params) != 
7d70: 6e 6f 45 72 72 20 29 7b 0a 23 20 65 6e 64 69 66  noErr ){.# endif
7d80: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
7d90: 54 45 5f 49 4f 45 52 52 3b 0a 20 20 7d 65 6c 73  TE_IOERR;.  }els
7da0: 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  e{.    return SQ
7db0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 23 65 6e  LITE_OK;.  }.#en
7dc0: 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75  dif.}../*.** Tru
7dd0: 6e 63 61 74 65 20 61 6e 20 6f 70 65 6e 20 66 69  ncate an open fi
7de0: 6c 65 20 74 6f 20 61 20 73 70 65 63 69 66 69 65  le to a specifie
7df0: 64 20 73 69 7a 65 0a 2a 2f 0a 69 6e 74 20 73 71  d size.*/.int sq
7e00: 6c 69 74 65 4f 73 54 72 75 6e 63 61 74 65 28 4f  liteOsTruncate(O
7e10: 73 46 69 6c 65 20 2a 69 64 2c 20 6f 66 66 5f 74  sFile *id, off_t
7e20: 20 6e 42 79 74 65 29 7b 0a 20 20 53 69 6d 75 6c   nByte){.  Simul
7e30: 61 74 65 49 4f 45 72 72 6f 72 28 53 51 4c 49 54  ateIOError(SQLIT
7e40: 45 5f 49 4f 45 52 52 29 3b 0a 23 69 66 20 4f 53  E_IOERR);.#if OS
7e50: 5f 55 4e 49 58 0a 20 20 72 65 74 75 72 6e 20 66  _UNIX.  return f
7e60: 74 72 75 6e 63 61 74 65 28 69 64 2d 3e 66 64 2c  truncate(id->fd,
7e70: 20 6e 42 79 74 65 29 3d 3d 30 20 3f 20 53 51 4c   nByte)==0 ? SQL
7e80: 49 54 45 5f 4f 4b 20 3a 20 53 51 4c 49 54 45 5f  ITE_OK : SQLITE_
7e90: 49 4f 45 52 52 3b 0a 23 65 6e 64 69 66 0a 23 69  IOERR;.#endif.#i
7ea0: 66 20 4f 53 5f 57 49 4e 0a 20 20 7b 0a 20 20 20  f OS_WIN.  {.   
7eb0: 20 4c 4f 4e 47 20 75 70 70 65 72 42 69 74 73 20   LONG upperBits 
7ec0: 3d 20 6e 42 79 74 65 3e 3e 33 32 3b 0a 20 20 20  = nByte>>32;.   
7ed0: 20 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 28   SetFilePointer(
7ee0: 69 64 2d 3e 68 2c 20 6e 42 79 74 65 2c 20 26 75  id->h, nByte, &u
7ef0: 70 70 65 72 42 69 74 73 2c 20 46 49 4c 45 5f 42  pperBits, FILE_B
7f00: 45 47 49 4e 29 3b 0a 20 20 20 20 53 65 74 45 6e  EGIN);.    SetEn
7f10: 64 4f 66 46 69 6c 65 28 69 64 2d 3e 68 29 3b 0a  dOfFile(id->h);.
7f20: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
7f30: 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 23  ITE_OK;.#endif.#
7f40: 69 66 20 4f 53 5f 4d 41 43 0a 23 20 69 66 64 65  if OS_MAC.# ifde
7f50: 66 20 5f 4c 41 52 47 45 5f 46 49 4c 45 0a 20 20  f _LARGE_FILE.  
7f60: 69 66 28 20 46 53 53 65 74 46 6f 72 6b 53 69 7a  if( FSSetForkSiz
7f70: 65 28 69 64 2d 3e 72 65 66 4e 75 6d 2c 20 66 73  e(id->refNum, fs
7f80: 46 72 6f 6d 53 74 61 72 74 2c 20 6e 42 79 74 65  FromStart, nByte
7f90: 29 20 21 3d 20 6e 6f 45 72 72 29 7b 0a 23 20 65  ) != noErr){.# e
7fa0: 6c 73 65 0a 20 20 69 66 28 20 53 65 74 45 4f 46  lse.  if( SetEOF
7fb0: 28 69 64 2d 3e 72 65 66 4e 75 6d 2c 20 6e 42 79  (id->refNum, nBy
7fc0: 74 65 29 20 21 3d 20 6e 6f 45 72 72 20 29 7b 0a  te) != noErr ){.
7fd0: 23 20 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75  # endif.    retu
7fe0: 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b  rn SQLITE_IOERR;
7ff0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
8000: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
8010: 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a    }.#endif.}../*
8020: 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68  .** Determine th
8030: 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f  e current size o
8040: 66 20 61 20 66 69 6c 65 20 69 6e 20 62 79 74 65  f a file in byte
8050: 73 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 4f  s.*/.int sqliteO
8060: 73 46 69 6c 65 53 69 7a 65 28 4f 73 46 69 6c 65  sFileSize(OsFile
8070: 20 2a 69 64 2c 20 6f 66 66 5f 74 20 2a 70 53 69   *id, off_t *pSi
8080: 7a 65 29 7b 0a 23 69 66 20 4f 53 5f 55 4e 49 58  ze){.#if OS_UNIX
8090: 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62  .  struct stat b
80a0: 75 66 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  uf;.  SimulateIO
80b0: 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
80c0: 52 52 29 3b 0a 20 20 69 66 28 20 66 73 74 61 74  RR);.  if( fstat
80d0: 28 69 64 2d 3e 66 64 2c 20 26 62 75 66 29 21 3d  (id->fd, &buf)!=
80e0: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
80f0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20  SQLITE_IOERR;.  
8100: 7d 0a 20 20 2a 70 53 69 7a 65 20 3d 20 62 75 66  }.  *pSize = buf
8110: 2e 73 74 5f 73 69 7a 65 3b 0a 20 20 72 65 74 75  .st_size;.  retu
8120: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65  rn SQLITE_OK;.#e
8130: 6e 64 69 66 0a 23 69 66 20 4f 53 5f 57 49 4e 0a  ndif.#if OS_WIN.
8140: 20 20 44 57 4f 52 44 20 75 70 70 65 72 42 69 74    DWORD upperBit
8150: 73 2c 20 6c 6f 77 65 72 42 69 74 73 3b 0a 20 20  s, lowerBits;.  
8160: 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
8170: 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 3b 0a 20  SQLITE_IOERR);. 
8180: 20 6c 6f 77 65 72 42 69 74 73 20 3d 20 47 65 74   lowerBits = Get
8190: 46 69 6c 65 53 69 7a 65 28 69 64 2d 3e 68 2c 20  FileSize(id->h, 
81a0: 26 75 70 70 65 72 42 69 74 73 29 3b 0a 20 20 2a  &upperBits);.  *
81b0: 70 53 69 7a 65 20 3d 20 28 28 28 6f 66 66 5f 74  pSize = (((off_t
81c0: 29 75 70 70 65 72 42 69 74 73 29 3c 3c 33 32 29  )upperBits)<<32)
81d0: 20 2b 20 6c 6f 77 65 72 42 69 74 73 3b 0a 20 20   + lowerBits;.  
81e0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
81f0: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f 53 5f  ;.#endif.#if OS_
8200: 4d 41 43 0a 23 20 69 66 64 65 66 20 5f 4c 41 52  MAC.# ifdef _LAR
8210: 47 45 5f 46 49 4c 45 0a 20 20 69 66 28 20 46 53  GE_FILE.  if( FS
8220: 47 65 74 46 6f 72 6b 53 69 7a 65 28 69 64 2d 3e  GetForkSize(id->
8230: 72 65 66 4e 75 6d 2c 20 70 53 69 7a 65 29 20 21  refNum, pSize) !
8240: 3d 20 6e 6f 45 72 72 29 7b 0a 23 20 65 6c 73 65  = noErr){.# else
8250: 0a 20 20 69 66 28 20 47 65 74 45 4f 46 28 69 64  .  if( GetEOF(id
8260: 2d 3e 72 65 66 4e 75 6d 2c 20 70 53 69 7a 65 29  ->refNum, pSize)
8270: 20 21 3d 20 6e 6f 45 72 72 20 29 7b 0a 23 20 65   != noErr ){.# e
8280: 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20  ndif.    return 
8290: 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20  SQLITE_IOERR;.  
82a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
82b0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
82c0: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23 69 66 20 4f  .#endif.}..#if O
82d0: 53 5f 57 49 4e 0a 2f 2a 0a 2a 2a 20 52 65 74 75  S_WIN./*.** Retu
82e0: 72 6e 20 74 72 75 65 20 28 6e 6f 6e 2d 7a 65 72  rn true (non-zer
82f0: 6f 29 20 69 66 20 77 65 20 61 72 65 20 72 75 6e  o) if we are run
8300: 6e 69 6e 67 20 75 6e 64 65 72 20 57 69 6e 4e 54  ning under WinNT
8310: 2c 20 57 69 6e 32 4b 20 6f 72 20 57 69 6e 58 50  , Win2K or WinXP
8320: 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 66 61 6c 73  ..** Return fals
8330: 65 20 28 7a 65 72 6f 29 20 66 6f 72 20 57 69 6e  e (zero) for Win
8340: 39 35 2c 20 57 69 6e 39 38 2c 20 6f 72 20 57 69  95, Win98, or Wi
8350: 6e 4d 45 2e 0a 2a 2a 0a 2a 2a 20 48 65 72 65 20  nME..**.** Here 
8360: 69 73 20 61 6e 20 69 6e 74 65 72 65 73 74 69 6e  is an interestin
8370: 67 20 6f 62 73 65 72 76 61 74 69 6f 6e 3a 20 20  g observation:  
8380: 57 69 6e 39 35 2c 20 57 69 6e 39 38 2c 20 61 6e  Win95, Win98, an
8390: 64 20 57 69 6e 4d 45 20 6c 61 63 6b 0a 2a 2a 20  d WinME lack.** 
83a0: 74 68 65 20 4c 6f 63 6b 46 69 6c 65 45 78 28 29  the LockFileEx()
83b0: 20 41 50 49 2e 20 20 42 75 74 20 77 65 20 63 61   API.  But we ca
83c0: 6e 20 73 74 69 6c 6c 20 73 74 61 74 69 63 61 6c  n still statical
83d0: 6c 79 20 6c 69 6e 6b 20 61 67 61 69 6e 73 74 20  ly link against 
83e0: 74 68 61 74 0a 2a 2a 20 41 50 49 20 61 73 20 6c  that.** API as l
83f0: 6f 6e 67 20 61 73 20 77 65 20 64 6f 6e 27 74 20  ong as we don't 
8400: 63 61 6c 6c 20 69 74 20 77 69 6e 20 72 75 6e 6e  call it win runn
8410: 69 6e 67 20 57 69 6e 39 35 2f 39 38 2f 4d 45 2e  ing Win95/98/ME.
8420: 20 20 41 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 74    A call to.** t
8430: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
8440: 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  sed to determine
8450: 20 69 66 20 74 68 65 20 68 6f 73 74 20 69 73 20   if the host is 
8460: 57 69 6e 39 35 2f 39 38 2f 4d 45 20 6f 72 0a 2a  Win95/98/ME or.*
8470: 2a 20 57 69 6e 4e 54 2f 32 4b 2f 58 50 20 73 6f  * WinNT/2K/XP so
8480: 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20 6b 6e   that we will kn
8490: 6f 77 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ow whether or no
84a0: 74 20 77 65 20 63 61 6e 20 73 61 66 65 6c 79 20  t we can safely 
84b0: 63 61 6c 6c 0a 2a 2a 20 74 68 65 20 4c 6f 63 6b  call.** the Lock
84c0: 46 69 6c 65 45 78 28 29 20 41 50 49 2e 0a 2a 2f  FileEx() API..*/
84d0: 0a 69 6e 74 20 69 73 4e 54 28 76 6f 69 64 29 7b  .int isNT(void){
84e0: 0a 20 20 73 74 61 74 69 63 20 6f 73 54 79 70 65  .  static osType
84f0: 20 3d 20 30 3b 20 20 20 2f 2a 20 30 3d 75 6e 6b   = 0;   /* 0=unk
8500: 6e 6f 77 6e 20 31 3d 77 69 6e 39 35 20 32 3d 77  nown 1=win95 2=w
8510: 69 6e 4e 54 20 2a 2f 0a 20 20 69 66 28 20 6f 73  inNT */.  if( os
8520: 54 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 4f  Type==0 ){.    O
8530: 53 56 45 52 53 49 4f 4e 49 4e 46 4f 20 73 49 6e  SVERSIONINFO sIn
8540: 66 6f 3b 0a 20 20 20 20 73 49 6e 66 6f 2e 64 77  fo;.    sInfo.dw
8550: 4f 53 56 65 72 73 69 6f 6e 49 6e 66 6f 53 69 7a  OSVersionInfoSiz
8560: 65 20 3d 20 73 69 7a 65 6f 66 28 73 49 6e 66 6f  e = sizeof(sInfo
8570: 29 3b 0a 20 20 20 20 47 65 74 56 65 72 73 69 6f  );.    GetVersio
8580: 6e 45 78 28 26 73 49 6e 66 6f 29 3b 0a 20 20 20  nEx(&sInfo);.   
8590: 20 6f 73 54 79 70 65 20 3d 20 73 49 6e 66 6f 2e   osType = sInfo.
85a0: 64 77 50 6c 61 74 66 6f 72 6d 49 64 3d 3d 56 45  dwPlatformId==VE
85b0: 52 5f 50 4c 41 54 46 4f 52 4d 5f 57 49 4e 33 32  R_PLATFORM_WIN32
85c0: 5f 4e 54 20 3f 20 32 20 3a 20 31 3b 0a 20 20 7d  _NT ? 2 : 1;.  }
85d0: 0a 20 20 72 65 74 75 72 6e 20 6f 73 54 79 70 65  .  return osType
85e0: 3d 3d 32 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  ==2;.}.#endif../
85f0: 2a 0a 2a 2a 20 57 69 6e 64 6f 77 73 20 66 69 6c  *.** Windows fil
8600: 65 20 6c 6f 63 6b 69 6e 67 20 6e 6f 74 65 73 3a  e locking notes:
8610: 20 20 5b 73 69 6d 69 6c 61 72 20 69 73 73 75 65    [similar issue
8620: 73 20 61 70 70 6c 79 20 74 6f 20 4d 61 63 4f 53  s apply to MacOS
8630: 5d 0a 2a 2a 0a 2a 2a 20 57 65 20 63 61 6e 6e 6f  ].**.** We canno
8640: 74 20 75 73 65 20 4c 6f 63 6b 46 69 6c 65 45 78  t use LockFileEx
8650: 28 29 20 6f 72 20 55 6e 6c 6f 63 6b 46 69 6c 65  () or UnlockFile
8660: 45 78 28 29 20 6f 6e 20 57 69 6e 39 35 2f 39 38  Ex() on Win95/98
8670: 2f 4d 45 20 62 65 63 61 75 73 65 0a 2a 2a 20 74  /ME because.** t
8680: 68 6f 73 65 20 66 75 6e 63 74 69 6f 6e 73 20 61  hose functions a
8690: 72 65 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  re not available
86a0: 2e 20 20 53 6f 20 77 65 20 75 73 65 20 6f 6e 6c  .  So we use onl
86b0: 79 20 4c 6f 63 6b 46 69 6c 65 28 29 20 61 6e 64  y LockFile() and
86c0: 0a 2a 2a 20 55 6e 6c 6f 63 6b 46 69 6c 65 28 29  .** UnlockFile()
86d0: 2e 0a 2a 2a 0a 2a 2a 20 4c 6f 63 6b 46 69 6c 65  ..**.** LockFile
86e0: 28 29 20 70 72 65 76 65 6e 74 73 20 6e 6f 74 20  () prevents not 
86f0: 6a 75 73 74 20 77 72 69 74 69 6e 67 20 62 75 74  just writing but
8700: 20 61 6c 73 6f 20 72 65 61 64 69 6e 67 20 62 79   also reading by
8710: 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73   other processes
8720: 2e 0a 2a 2a 20 28 54 68 69 73 20 69 73 20 61 20  ..** (This is a 
8730: 64 65 73 69 67 6e 20 65 72 72 6f 72 20 6f 6e 20  design error on 
8740: 74 68 65 20 70 61 72 74 20 6f 66 20 57 69 6e 64  the part of Wind
8750: 6f 77 73 2c 20 62 75 74 20 74 68 65 72 65 20 69  ows, but there i
8760: 73 20 6e 6f 74 68 69 6e 67 0a 2a 2a 20 77 65 20  s nothing.** we 
8770: 63 61 6e 20 64 6f 20 61 62 6f 75 74 20 74 68 61  can do about tha
8780: 74 2e 29 20 20 53 6f 20 74 68 65 20 72 65 67 69  t.)  So the regi
8790: 6f 6e 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b  on used for lock
87a0: 69 6e 67 20 69 73 20 61 74 20 74 68 65 0a 2a 2a  ing is at the.**
87b0: 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65   end of the file
87c0: 20 77 68 65 72 65 20 69 74 20 69 73 20 75 6e 6c   where it is unl
87d0: 69 6b 65 6c 79 20 74 6f 20 65 76 65 72 20 69 6e  ikely to ever in
87e0: 74 65 72 66 65 72 65 20 77 69 74 68 20 61 6e 0a  terfere with an.
87f0: 2a 2a 20 61 63 74 75 61 6c 20 72 65 61 64 20 61  ** actual read a
8800: 74 74 65 6d 70 74 2e 0a 2a 2a 0a 2a 2a 20 41 20  ttempt..**.** A 
8810: 64 61 74 61 62 61 73 65 20 72 65 61 64 20 6c 6f  database read lo
8820: 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20 62  ck is obtained b
8830: 79 20 6c 6f 63 6b 69 6e 67 20 61 20 73 69 6e 67  y locking a sing
8840: 6c 65 20 72 61 6e 64 6f 6d 6c 79 2d 63 68 6f 73  le randomly-chos
8850: 65 6e 20 0a 2a 2a 20 62 79 74 65 20 6f 75 74 20  en .** byte out 
8860: 6f 66 20 61 20 73 70 65 63 69 66 69 63 20 72 61  of a specific ra
8870: 6e 67 65 20 6f 66 20 62 79 74 65 73 2e 20 54 68  nge of bytes. Th
8880: 65 20 6c 6f 63 6b 20 62 79 74 65 20 69 73 20 6f  e lock byte is o
8890: 62 74 61 69 6e 65 64 20 61 74 20 0a 2a 2a 20 72  btained at .** r
88a0: 61 6e 64 6f 6d 20 73 6f 20 74 77 6f 20 73 65 70  andom so two sep
88b0: 61 72 61 74 65 20 72 65 61 64 65 72 73 20 63 61  arate readers ca
88c0: 6e 20 70 72 6f 62 61 62 6c 79 20 61 63 63 65 73  n probably acces
88d0: 73 20 74 68 65 20 66 69 6c 65 20 61 74 20 74 68  s the file at th
88e0: 65 20 0a 2a 2a 20 73 61 6d 65 20 74 69 6d 65 2c  e .** same time,
88f0: 20 75 6e 6c 65 73 73 20 74 68 65 79 20 61 72 65   unless they are
8900: 20 75 6e 6c 75 63 6b 79 20 61 6e 64 20 63 68 6f   unlucky and cho
8910: 6f 73 65 20 74 68 65 20 73 61 6d 65 20 6c 6f 63  ose the same loc
8920: 6b 20 62 79 74 65 2e 0a 2a 2a 20 41 20 64 61 74  k byte..** A dat
8930: 61 62 61 73 65 20 77 72 69 74 65 20 6c 6f 63 6b  abase write lock
8940: 20 69 73 20 6f 62 74 61 69 6e 65 64 20 62 79 20   is obtained by 
8950: 6c 6f 63 6b 69 6e 67 20 61 6c 6c 20 62 79 74 65  locking all byte
8960: 73 20 69 6e 20 74 68 65 20 72 61 6e 67 65 2e 0a  s in the range..
8970: 2a 2a 20 54 68 65 72 65 20 63 61 6e 20 6f 6e 6c  ** There can onl
8980: 79 20 62 65 20 6f 6e 65 20 77 72 69 74 65 72 2e  y be one writer.
8990: 0a 2a 2a 0a 2a 2a 20 41 20 6c 6f 63 6b 20 69 73  .**.** A lock is
89a0: 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65   obtained on the
89b0: 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74   first byte of t
89c0: 68 65 20 6c 6f 63 6b 20 72 61 6e 67 65 20 62 65  he lock range be
89d0: 66 6f 72 65 20 61 63 71 75 69 72 69 6e 67 0a 2a  fore acquiring.*
89e0: 2a 20 65 69 74 68 65 72 20 61 20 72 65 61 64 20  * either a read 
89f0: 6c 6f 63 6b 20 6f 72 20 61 20 77 72 69 74 65 20  lock or a write 
8a00: 6c 6f 63 6b 2e 20 20 54 68 69 73 20 70 72 65 76  lock.  This prev
8a10: 65 6e 74 73 20 74 77 6f 20 70 72 6f 63 65 73 73  ents two process
8a20: 65 73 20 66 72 6f 6d 0a 2a 2a 20 61 74 74 65 6d  es from.** attem
8a30: 70 74 69 6e 67 20 74 6f 20 67 65 74 20 61 20 6c  pting to get a l
8a40: 6f 63 6b 20 61 74 20 61 20 73 61 6d 65 20 74 69  ock at a same ti
8a50: 6d 65 2e 20 20 54 68 65 20 73 65 6d 61 6e 74 69  me.  The semanti
8a60: 63 73 20 6f 66 20 0a 2a 2a 20 73 71 6c 69 74 65  cs of .** sqlite
8a70: 4f 73 52 65 61 64 4c 6f 63 6b 28 29 20 72 65 71  OsReadLock() req
8a80: 75 69 72 65 20 74 68 61 74 20 69 66 20 74 68 65  uire that if the
8a90: 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20  re is already a 
8aa0: 77 72 69 74 65 20 6c 6f 63 6b 2c 20 74 68 61 74  write lock, that
8ab0: 0a 2a 2a 20 6c 6f 63 6b 20 69 73 20 63 6f 6e 76  .** lock is conv
8ac0: 65 72 74 65 64 20 69 6e 74 6f 20 61 20 72 65 61  erted into a rea
8ad0: 64 20 6c 6f 63 6b 20 61 74 6f 6d 69 63 61 6c 6c  d lock atomicall
8ae0: 79 2e 20 20 54 68 65 20 6c 6f 63 6b 20 6f 6e 20  y.  The lock on 
8af0: 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 62 79 74  the first.** byt
8b00: 65 20 61 6c 6c 6f 77 73 20 75 73 20 74 6f 20 64  e allows us to d
8b10: 72 6f 70 20 74 68 65 20 6f 6c 64 20 77 72 69 74  rop the old writ
8b20: 65 20 6c 6f 63 6b 20 61 6e 64 20 67 65 74 20 74  e lock and get t
8b30: 68 65 20 72 65 61 64 20 6c 6f 63 6b 20 77 69 74  he read lock wit
8b40: 68 6f 75 74 0a 2a 2a 20 61 6e 6f 74 68 65 72 20  hout.** another 
8b50: 70 72 6f 63 65 73 73 20 6a 75 6d 70 69 6e 67 20  process jumping 
8b60: 69 6e 74 6f 20 74 68 65 20 6d 69 64 64 6c 65 20  into the middle 
8b70: 61 6e 64 20 6d 65 73 73 69 6e 67 20 75 73 20 75  and messing us u
8b80: 70 2e 20 20 54 68 65 20 73 61 6d 65 0a 2a 2a 20  p.  The same.** 
8b90: 61 72 67 75 6d 65 6e 74 20 61 70 70 6c 69 65 73  argument applies
8ba0: 20 74 6f 20 73 71 6c 69 74 65 4f 73 57 72 69 74   to sqliteOsWrit
8bb0: 65 4c 6f 63 6b 28 29 2e 0a 2a 2a 0a 2a 2a 20 4f  eLock()..**.** O
8bc0: 6e 20 57 69 6e 4e 54 2f 32 4b 2f 58 50 20 73 79  n WinNT/2K/XP sy
8bd0: 73 74 65 6d 73 2c 20 4c 6f 63 6b 46 69 6c 65 45  stems, LockFileE
8be0: 78 28 29 20 61 6e 64 20 55 6e 6c 6f 63 6b 46 69  x() and UnlockFi
8bf0: 6c 65 45 78 28 29 20 61 72 65 20 61 76 61 69 6c  leEx() are avail
8c00: 61 62 6c 65 2c 0a 2a 2a 20 77 68 69 63 68 20 6d  able,.** which m
8c10: 65 61 6e 73 20 77 65 20 63 61 6e 20 75 73 65 20  eans we can use 
8c20: 72 65 61 64 65 72 2f 77 72 69 74 65 72 20 6c 6f  reader/writer lo
8c30: 63 6b 73 2e 20 20 57 68 65 6e 20 72 65 61 64 65  cks.  When reade
8c40: 72 20 77 72 69 74 65 72 20 6c 6f 63 6b 73 0a 2a  r writer locks.*
8c50: 2a 20 61 72 65 20 75 73 65 64 2c 20 74 68 65 20  * are used, the 
8c60: 6c 6f 63 6b 20 69 73 20 70 6c 61 63 65 64 20 6f  lock is placed o
8c70: 6e 20 74 68 65 20 73 61 6d 65 20 72 61 6e 67 65  n the same range
8c80: 20 6f 66 20 62 79 74 65 73 20 74 68 61 74 20 69   of bytes that i
8c90: 73 20 75 73 65 64 0a 2a 2a 20 66 6f 72 20 70 72  s used.** for pr
8ca0: 6f 62 61 62 69 6c 69 73 74 69 63 20 6c 6f 63 6b  obabilistic lock
8cb0: 69 6e 67 20 69 6e 20 57 69 6e 39 35 2f 39 38 2f  ing in Win95/98/
8cc0: 4d 45 2e 20 20 48 65 6e 63 65 2c 20 74 68 65 20  ME.  Hence, the 
8cd0: 6c 6f 63 6b 69 6e 67 20 73 63 68 65 6d 65 0a 2a  locking scheme.*
8ce0: 2a 20 77 69 6c 6c 20 73 75 70 70 6f 72 74 20 74  * will support t
8cf0: 77 6f 20 6f 72 20 6d 6f 72 65 20 57 69 6e 39 35  wo or more Win95
8d00: 20 72 65 61 64 65 72 73 20 6f 72 20 74 77 6f 20   readers or two 
8d10: 6f 72 20 6d 6f 72 65 20 57 69 6e 4e 54 20 72 65  or more WinNT re
8d20: 61 64 65 72 73 2e 0a 2a 2a 20 42 75 74 20 61 20  aders..** But a 
8d30: 73 69 6e 67 6c 65 20 57 69 6e 39 35 20 72 65 61  single Win95 rea
8d40: 64 65 72 20 77 69 6c 6c 20 6c 6f 63 6b 20 6f 75  der will lock ou
8d50: 74 20 61 6c 6c 20 57 69 6e 4e 54 20 72 65 61 64  t all WinNT read
8d60: 65 72 73 20 61 6e 64 20 61 20 73 69 6e 67 6c 65  ers and a single
8d70: 0a 2a 2a 20 57 69 6e 4e 54 20 72 65 61 64 65 72  .** WinNT reader
8d80: 20 77 69 6c 6c 20 6c 6f 63 6b 20 6f 75 74 20 61   will lock out a
8d90: 6c 6c 20 6f 74 68 65 72 20 57 69 6e 39 35 20 72  ll other Win95 r
8da0: 65 61 64 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  eaders..**.** No
8db0: 74 65 3a 20 4f 6e 20 4d 61 63 4f 53 20 77 65 20  te: On MacOS we 
8dc0: 75 73 65 20 74 68 65 20 72 65 73 6f 75 72 63 65  use the resource
8dd0: 20 66 6f 72 6b 20 66 6f 72 20 6c 6f 63 6b 69 6e   fork for lockin
8de0: 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  g..**.** The fol
8df0: 6c 6f 77 69 6e 67 20 23 64 65 66 69 6e 65 73 20  lowing #defines 
8e00: 73 70 65 63 69 66 79 20 74 68 65 20 72 61 6e 67  specify the rang
8e10: 65 20 6f 66 20 62 79 74 65 73 20 75 73 65 64 20  e of bytes used 
8e20: 66 6f 72 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2a 20  for locking..** 
8e30: 4e 5f 4c 4f 43 4b 42 59 54 45 20 69 73 20 74 68  N_LOCKBYTE is th
8e40: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
8e50: 73 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20  s available for 
8e60: 64 6f 69 6e 67 20 74 68 65 20 6c 6f 63 6b 69 6e  doing the lockin
8e70: 67 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  g..** The first 
8e80: 62 79 74 65 20 75 73 65 64 20 74 6f 20 68 6f 6c  byte used to hol
8e90: 64 20 74 68 65 20 6c 6f 63 6b 20 77 68 69 6c 65  d the lock while
8ea0: 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 63 68 61   the lock is cha
8eb0: 6e 67 69 6e 67 20 64 6f 65 73 0a 2a 2a 20 6e 6f  nging does.** no
8ec0: 74 20 63 6f 75 6e 74 20 74 6f 77 61 72 64 20 74  t count toward t
8ed0: 68 69 73 20 6e 75 6d 62 65 72 2e 20 20 46 49 52  his number.  FIR
8ee0: 53 54 5f 4c 4f 43 4b 42 59 54 45 20 69 73 20 74  ST_LOCKBYTE is t
8ef0: 68 65 20 61 64 64 72 65 73 73 20 6f 66 0a 2a 2a  he address of.**
8f00: 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20   the first byte 
8f10: 69 6e 20 74 68 65 20 72 61 6e 67 65 20 6f 66 20  in the range of 
8f20: 62 79 74 65 73 20 75 73 65 64 20 66 6f 72 20 6c  bytes used for l
8f30: 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 23 64 65 66 69  ocking..*/.#defi
8f40: 6e 65 20 4e 5f 4c 4f 43 4b 42 59 54 45 20 20 20  ne N_LOCKBYTE   
8f50: 20 20 20 20 31 30 32 33 39 0a 23 69 66 20 4f 53      10239.#if OS
8f60: 5f 4d 41 43 0a 23 20 64 65 66 69 6e 65 20 46 49  _MAC.# define FI
8f70: 52 53 54 5f 4c 4f 43 4b 42 59 54 45 20 20 20 28  RST_LOCKBYTE   (
8f80: 30 78 30 30 30 66 66 66 66 66 20 2d 20 4e 5f 4c  0x000fffff - N_L
8f90: 4f 43 4b 42 59 54 45 29 0a 23 65 6c 73 65 0a 23  OCKBYTE).#else.#
8fa0: 20 64 65 66 69 6e 65 20 46 49 52 53 54 5f 4c 4f   define FIRST_LO
8fb0: 43 4b 42 59 54 45 20 20 20 28 30 78 66 66 66 66  CKBYTE   (0xffff
8fc0: 66 66 66 66 20 2d 20 4e 5f 4c 4f 43 4b 42 59 54  ffff - N_LOCKBYT
8fd0: 45 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  E).#endif../*.**
8fe0: 20 43 68 61 6e 67 65 20 74 68 65 20 73 74 61 74   Change the stat
8ff0: 75 73 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20 6f  us of the lock o
9000: 6e 20 74 68 65 20 66 69 6c 65 20 22 69 64 22 20  n the file "id" 
9010: 74 6f 20 62 65 20 61 20 72 65 61 64 6c 6f 63 6b  to be a readlock
9020: 2e 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65  ..** If the file
9030: 20 77 61 73 20 77 72 69 74 65 20 6c 6f 63 6b 65   was write locke
9040: 64 2c 20 74 68 65 6e 20 74 68 69 73 20 72 65 64  d, then this red
9050: 75 63 65 73 20 74 68 65 20 6c 6f 63 6b 20 74 6f  uces the lock to
9060: 20 61 20 72 65 61 64 2e 0a 2a 2a 20 49 66 20 74   a read..** If t
9070: 68 65 20 66 69 6c 65 20 77 61 73 20 72 65 61 64  he file was read
9080: 20 6c 6f 63 6b 65 64 2c 20 74 68 65 6e 20 74 68   locked, then th
9090: 69 73 20 61 63 71 75 69 72 65 73 20 61 20 6e 65  is acquires a ne
90a0: 77 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2a 0a  w read lock..**.
90b0: 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
90c0: 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 61  _OK on success a
90d0: 6e 64 20 53 51 4c 49 54 45 5f 42 55 53 59 20 6f  nd SQLITE_BUSY o
90e0: 6e 20 66 61 69 6c 75 72 65 2e 20 20 49 66 20 74  n failure.  If t
90f0: 68 69 73 0a 2a 2a 20 6c 69 62 72 61 72 79 20 77  his.** library w
9100: 61 73 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68  as compiled with
9110: 20 6c 61 72 67 65 20 66 69 6c 65 20 73 75 70 70   large file supp
9120: 6f 72 74 20 28 4c 46 53 29 20 62 75 74 20 4c 46  ort (LFS) but LF
9130: 53 20 69 73 20 6e 6f 74 0a 2a 2a 20 61 76 61 69  S is not.** avai
9140: 6c 61 62 6c 65 20 6f 6e 20 74 68 65 20 68 6f 73  lable on the hos
9150: 74 2c 20 74 68 65 6e 20 61 6e 20 53 51 4c 49 54  t, then an SQLIT
9160: 45 5f 4e 4f 4c 46 53 20 69 73 20 72 65 74 75 72  E_NOLFS is retur
9170: 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ned..*/.int sqli
9180: 74 65 4f 73 52 65 61 64 4c 6f 63 6b 28 4f 73 46  teOsReadLock(OsF
9190: 69 6c 65 20 2a 69 64 29 7b 0a 23 69 66 20 4f 53  ile *id){.#if OS
91a0: 5f 55 4e 49 58 0a 20 20 69 6e 74 20 72 63 3b 0a  _UNIX.  int rc;.
91b0: 20 20 73 71 6c 69 74 65 4f 73 45 6e 74 65 72 4d    sqliteOsEnterM
91c0: 75 74 65 78 28 29 3b 0a 20 20 69 66 28 20 69 64  utex();.  if( id
91d0: 2d 3e 70 4c 6f 63 6b 2d 3e 63 6e 74 3e 30 20 29  ->pLock->cnt>0 )
91e0: 7b 0a 20 20 20 20 69 66 28 20 21 69 64 2d 3e 6c  {.    if( !id->l
91f0: 6f 63 6b 65 64 20 29 7b 0a 20 20 20 20 20 20 69  ocked ){.      i
9200: 64 2d 3e 70 4c 6f 63 6b 2d 3e 63 6e 74 2b 2b 3b  d->pLock->cnt++;
9210: 0a 20 20 20 20 20 20 69 64 2d 3e 6c 6f 63 6b 65  .      id->locke
9220: 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 64 2d  d = 1;.      id-
9230: 3e 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 2b 2b 3b  >pOpen->nLock++;
9240: 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
9250: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c  SQLITE_OK;.  }el
9260: 73 65 20 69 66 28 20 69 64 2d 3e 6c 6f 63 6b 65  se if( id->locke
9270: 64 20 7c 7c 20 69 64 2d 3e 70 4c 6f 63 6b 2d 3e  d || id->pLock->
9280: 63 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74  cnt==0 ){.    st
9290: 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b  ruct flock lock;
92a0: 0a 20 20 20 20 69 6e 74 20 73 3b 0a 20 20 20 20  .    int s;.    
92b0: 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f  lock.l_type = F_
92c0: 52 44 4c 43 4b 3b 0a 20 20 20 20 6c 6f 63 6b 2e  RDLCK;.    lock.
92d0: 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
92e0: 53 45 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  SET;.    lock.l_
92f0: 73 74 61 72 74 20 3d 20 6c 6f 63 6b 2e 6c 5f 6c  start = lock.l_l
9300: 65 6e 20 3d 20 30 4c 3b 0a 20 20 20 20 73 20 3d  en = 0L;.    s =
9310: 20 66 63 6e 74 6c 28 69 64 2d 3e 66 64 2c 20 46   fcntl(id->fd, F
9320: 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3b 0a  _SETLK, &lock);.
9330: 20 20 20 20 69 66 28 20 73 21 3d 30 20 29 7b 0a      if( s!=0 ){.
9340: 20 20 20 20 20 20 72 63 20 3d 20 28 65 72 72 6e        rc = (errn
9350: 6f 3d 3d 45 49 4e 56 41 4c 29 20 3f 20 53 51 4c  o==EINVAL) ? SQL
9360: 49 54 45 5f 4e 4f 4c 46 53 20 3a 20 53 51 4c 49  ITE_NOLFS : SQLI
9370: 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 65 6c  TE_BUSY;.    }el
9380: 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
9390: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
93a0: 69 66 28 20 21 69 64 2d 3e 6c 6f 63 6b 65 64 20  if( !id->locked 
93b0: 29 7b 0a 20 20 20 20 20 20 20 20 69 64 2d 3e 70  ){.        id->p
93c0: 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20  Open->nLock++;. 
93d0: 20 20 20 20 20 20 20 69 64 2d 3e 6c 6f 63 6b 65         id->locke
93e0: 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  d = 1;.      }. 
93f0: 20 20 20 20 20 69 64 2d 3e 70 4c 6f 63 6b 2d 3e       id->pLock->
9400: 63 6e 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  cnt = 1;.    }. 
9410: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
9420: 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
9430: 7d 0a 20 20 73 71 6c 69 74 65 4f 73 4c 65 61 76  }.  sqliteOsLeav
9440: 65 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74 75  eMutex();.  retu
9450: 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 23 69  rn rc;.#endif.#i
9460: 66 20 4f 53 5f 57 49 4e 0a 20 20 69 6e 74 20 72  f OS_WIN.  int r
9470: 63 3b 0a 20 20 69 66 28 20 69 64 2d 3e 6c 6f 63  c;.  if( id->loc
9480: 6b 65 64 3e 30 20 29 7b 0a 20 20 20 20 72 63 20  ked>0 ){.    rc 
9490: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  = SQLITE_OK;.  }
94a0: 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6c 6b  else{.    int lk
94b0: 20 3d 20 28 73 71 6c 69 74 65 52 61 6e 64 6f 6d   = (sqliteRandom
94c0: 49 6e 74 65 67 65 72 28 29 20 26 20 30 78 37 66  Integer() & 0x7f
94d0: 66 66 66 66 66 29 25 4e 5f 4c 4f 43 4b 42 59 54  fffff)%N_LOCKBYT
94e0: 45 2b 31 3b 0a 20 20 20 20 69 6e 74 20 72 65 73  E+1;.    int res
94f0: 3b 0a 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20  ;.    int cnt = 
9500: 31 30 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  100;.    while( 
9510: 63 6e 74 2d 2d 3e 30 20 26 26 20 28 72 65 73 20  cnt-->0 && (res 
9520: 3d 20 4c 6f 63 6b 46 69 6c 65 28 69 64 2d 3e 68  = LockFile(id->h
9530: 2c 20 46 49 52 53 54 5f 4c 4f 43 4b 42 59 54 45  , FIRST_LOCKBYTE
9540: 2c 20 30 2c 20 31 2c 20 30 29 29 3d 3d 30 20 29  , 0, 1, 0))==0 )
9550: 7b 0a 20 20 20 20 20 20 53 6c 65 65 70 28 31 29  {.      Sleep(1)
9560: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
9570: 72 65 73 20 29 7b 0a 20 20 20 20 20 20 55 6e 6c  res ){.      Unl
9580: 6f 63 6b 46 69 6c 65 28 69 64 2d 3e 68 2c 20 46  ockFile(id->h, F
9590: 49 52 53 54 5f 4c 4f 43 4b 42 59 54 45 2b 31 2c  IRST_LOCKBYTE+1,
95a0: 20 30 2c 20 4e 5f 4c 4f 43 4b 42 59 54 45 2c 20   0, N_LOCKBYTE, 
95b0: 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 73  0);.      if( is
95c0: 4e 54 28 29 20 29 7b 0a 20 20 20 20 20 20 20 20  NT() ){.        
95d0: 4f 56 45 52 4c 41 50 50 45 44 20 6f 76 6c 70 3b  OVERLAPPED ovlp;
95e0: 0a 20 20 20 20 20 20 20 20 6f 76 6c 70 2e 4f 66  .        ovlp.Of
95f0: 66 73 65 74 20 3d 20 46 49 52 53 54 5f 4c 4f 43  fset = FIRST_LOC
9600: 4b 42 59 54 45 2b 31 3b 0a 20 20 20 20 20 20 20  KBYTE+1;.       
9610: 20 6f 76 6c 70 2e 4f 66 66 73 65 74 48 69 67 68   ovlp.OffsetHigh
9620: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 6f 76   = 0;.        ov
9630: 6c 70 2e 68 45 76 65 6e 74 20 3d 20 30 3b 0a 20  lp.hEvent = 0;. 
9640: 20 20 20 20 20 20 20 72 65 73 20 3d 20 4c 6f 63         res = Loc
9650: 6b 46 69 6c 65 45 78 28 69 64 2d 3e 68 2c 20 4c  kFileEx(id->h, L
9660: 4f 43 4b 46 49 4c 45 5f 46 41 49 4c 5f 49 4d 4d  OCKFILE_FAIL_IMM
9670: 45 44 49 41 54 45 4c 59 2c 20 0a 20 20 20 20 20  EDIATELY, .     
9680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9690: 20 20 20 20 20 30 2c 20 4e 5f 4c 4f 43 4b 42 59       0, N_LOCKBY
96a0: 54 45 2c 20 30 2c 20 26 6f 76 6c 70 29 3b 0a 20  TE, 0, &ovlp);. 
96b0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
96c0: 20 20 20 20 72 65 73 20 3d 20 4c 6f 63 6b 46 69      res = LockFi
96d0: 6c 65 28 69 64 2d 3e 68 2c 20 46 49 52 53 54 5f  le(id->h, FIRST_
96e0: 4c 4f 43 4b 42 59 54 45 2b 6c 6b 2c 20 30 2c 20  LOCKBYTE+lk, 0, 
96f0: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  1, 0);.      }. 
9700: 20 20 20 20 20 55 6e 6c 6f 63 6b 46 69 6c 65 28       UnlockFile(
9710: 69 64 2d 3e 68 2c 20 46 49 52 53 54 5f 4c 4f 43  id->h, FIRST_LOC
9720: 4b 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b  KBYTE, 0, 1, 0);
9730: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
9740: 65 73 20 29 7b 0a 20 20 20 20 20 20 69 64 2d 3e  es ){.      id->
9750: 6c 6f 63 6b 65 64 20 3d 20 6c 6b 3b 0a 20 20 20  locked = lk;.   
9760: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
9770: 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  K;.    }else{.  
9780: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
9790: 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  BUSY;.    }.  }.
97a0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e    return rc;.#en
97b0: 64 69 66 0a 23 69 66 20 4f 53 5f 4d 41 43 0a 20  dif.#if OS_MAC. 
97c0: 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 69   int rc;.  if( i
97d0: 64 2d 3e 6c 6f 63 6b 65 64 3e 30 20 7c 7c 20 69  d->locked>0 || i
97e0: 64 2d 3e 72 65 66 4e 75 6d 52 46 20 3d 3d 20 2d  d->refNumRF == -
97f0: 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  1 ){.    rc = SQ
9800: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
9810: 7b 0a 20 20 20 20 69 6e 74 20 6c 6b 20 3d 20 28  {.    int lk = (
9820: 73 71 6c 69 74 65 52 61 6e 64 6f 6d 49 6e 74 65  sqliteRandomInte
9830: 67 65 72 28 29 20 26 20 30 78 37 66 66 66 66 66  ger() & 0x7fffff
9840: 66 29 25 4e 5f 4c 4f 43 4b 42 59 54 45 2b 31 3b  f)%N_LOCKBYTE+1;
9850: 0a 20 20 20 20 4f 53 45 72 72 20 72 65 73 3b 0a  .    OSErr res;.
9860: 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 35 3b      int cnt = 5;
9870: 0a 20 20 20 20 50 61 72 61 6d 42 6c 6f 63 6b 52  .    ParamBlockR
9880: 65 63 20 70 61 72 61 6d 73 3b 0a 20 20 20 20 6d  ec params;.    m
9890: 65 6d 73 65 74 28 26 70 61 72 61 6d 73 2c 20 30  emset(&params, 0
98a0: 2c 20 73 69 7a 65 6f 66 28 70 61 72 61 6d 73 29  , sizeof(params)
98b0: 29 3b 0a 20 20 20 20 70 61 72 61 6d 73 2e 69 6f  );.    params.io
98c0: 50 61 72 61 6d 2e 69 6f 52 65 66 4e 75 6d 20 3d  Param.ioRefNum =
98d0: 20 69 64 2d 3e 72 65 66 4e 75 6d 52 46 3b 0a 20   id->refNumRF;. 
98e0: 20 20 20 70 61 72 61 6d 73 2e 69 6f 50 61 72 61     params.ioPara
98f0: 6d 2e 69 6f 50 6f 73 4d 6f 64 65 20 3d 20 66 73  m.ioPosMode = fs
9900: 46 72 6f 6d 53 74 61 72 74 3b 0a 20 20 20 20 70  FromStart;.    p
9910: 61 72 61 6d 73 2e 69 6f 50 61 72 61 6d 2e 69 6f  arams.ioParam.io
9920: 50 6f 73 4f 66 66 73 65 74 20 3d 20 46 49 52 53  PosOffset = FIRS
9930: 54 5f 4c 4f 43 4b 42 59 54 45 3b 0a 20 20 20 20  T_LOCKBYTE;.    
9940: 70 61 72 61 6d 73 2e 69 6f 50 61 72 61 6d 2e 69  params.ioParam.i
9950: 6f 52 65 71 43 6f 75 6e 74 20 3d 20 31 3b 0a 20  oReqCount = 1;. 
9960: 20 20 20 77 68 69 6c 65 28 20 63 6e 74 2d 2d 3e     while( cnt-->
9970: 30 20 26 26 20 28 72 65 73 20 3d 20 50 42 4c 6f  0 && (res = PBLo
9980: 63 6b 52 61 6e 67 65 53 79 6e 63 28 26 70 61 72  ckRangeSync(&par
9990: 61 6d 73 29 29 21 3d 6e 6f 45 72 72 20 29 7b 0a  ams))!=noErr ){.
99a0: 20 20 20 20 20 20 55 49 6e 74 33 32 20 66 69 6e        UInt32 fin
99b0: 61 6c 54 69 63 6b 73 3b 0a 20 20 20 20 20 20 44  alTicks;.      D
99c0: 65 6c 61 79 28 31 2c 20 26 66 69 6e 61 6c 54 69  elay(1, &finalTi
99d0: 63 6b 73 29 3b 20 2f 2a 20 31 2f 36 30 20 73 65  cks); /* 1/60 se
99e0: 63 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69  c */.    }.    i
99f0: 66 28 20 72 65 73 20 3d 3d 20 6e 6f 45 72 72 20  f( res == noErr 
9a00: 29 7b 0a 20 20 20 20 20 20 70 61 72 61 6d 73 2e  ){.      params.
9a10: 69 6f 50 61 72 61 6d 2e 69 6f 50 6f 73 4f 66 66  ioParam.ioPosOff
9a20: 73 65 74 20 3d 20 46 49 52 53 54 5f 4c 4f 43 4b  set = FIRST_LOCK
9a30: 42 59 54 45 2b 31 3b 0a 20 20 20 20 20 20 70 61  BYTE+1;.      pa
9a40: 72 61 6d 73 2e 69 6f 50 61 72 61 6d 2e 69 6f 52  rams.ioParam.ioR
9a50: 65 71 43 6f 75 6e 74 20 3d 20 4e 5f 4c 4f 43 4b  eqCount = N_LOCK
9a60: 42 59 54 45 3b 0a 20 20 20 20 20 20 50 42 55 6e  BYTE;.      PBUn
9a70: 6c 6f 63 6b 52 61 6e 67 65 53 79 6e 63 28 26 70  lockRangeSync(&p
9a80: 61 72 61 6d 73 29 3b 0a 20 20 20 20 20 20 70 61  arams);.      pa
9a90: 72 61 6d 73 2e 69 6f 50 61 72 61 6d 2e 69 6f 50  rams.ioParam.ioP
9aa0: 6f 73 4f 66 66 73 65 74 20 3d 20 46 49 52 53 54  osOffset = FIRST
9ab0: 5f 4c 4f 43 4b 42 59 54 45 2b 6c 6b 3b 0a 20 20  _LOCKBYTE+lk;.  
9ac0: 20 20 20 20 70 61 72 61 6d 73 2e 69 6f 50 61 72      params.ioPar
9ad0: 61 6d 2e 69 6f 52 65 71 43 6f 75 6e 74 20 3d 20  am.ioReqCount = 
9ae0: 31 3b 0a 20 20 20 20 20 20 72 65 73 20 3d 20 50  1;.      res = P
9af0: 42 4c 6f 63 6b 52 61 6e 67 65 53 79 6e 63 28 26  BLockRangeSync(&
9b00: 70 61 72 61 6d 73 29 3b 0a 20 20 20 20 20 20 70  params);.      p
9b10: 61 72 61 6d 73 2e 69 6f 50 61 72 61 6d 2e 69 6f  arams.ioParam.io
9b20: 50 6f 73 4f 66 66 73 65 74 20 3d 20 46 49 52 53  PosOffset = FIRS
9b30: 54 5f 4c 4f 43 4b 42 59 54 45 3b 0a 20 20 20 20  T_LOCKBYTE;.    
9b40: 20 20 70 61 72 61 6d 73 2e 69 6f 50 61 72 61 6d    params.ioParam
9b50: 2e 69 6f 52 65 71 43 6f 75 6e 74 20 3d 20 31 3b  .ioReqCount = 1;
9b60: 0a 20 20 20 20 20 20 50 42 55 6e 6c 6f 63 6b 52  .      PBUnlockR
9b70: 61 6e 67 65 53 79 6e 63 28 26 70 61 72 61 6d 73  angeSync(&params
9b80: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
9b90: 20 72 65 73 20 3d 3d 20 6e 6f 45 72 72 20 29 7b   res == noErr ){
9ba0: 0a 20 20 20 20 20 20 69 64 2d 3e 6c 6f 63 6b 65  .      id->locke
9bb0: 64 20 3d 20 6c 6b 3b 0a 20 20 20 20 20 20 72 63  d = lk;.      rc
9bc0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
9bd0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
9be0: 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
9bf0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
9c00: 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d  urn rc;.#endif.}
9c10: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
9c20: 68 65 20 6c 6f 63 6b 20 73 74 61 74 75 73 20 74  he lock status t
9c30: 6f 20 62 65 20 61 6e 20 65 78 63 6c 75 73 69 76  o be an exclusiv
9c40: 65 20 6f 72 20 77 72 69 74 65 20 6c 6f 63 6b 2e  e or write lock.
9c50: 20 20 52 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49    Return.** SQLI
9c60: 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
9c70: 20 61 6e 64 20 53 51 4c 49 54 45 5f 42 55 53 59   and SQLITE_BUSY
9c80: 20 6f 6e 20 61 20 66 61 69 6c 75 72 65 2e 20 20   on a failure.  
9c90: 49 66 20 74 68 69 73 0a 2a 2a 20 6c 69 62 72 61  If this.** libra
9ca0: 72 79 20 77 61 73 20 63 6f 6d 70 69 6c 65 64 20  ry was compiled 
9cb0: 77 69 74 68 20 6c 61 72 67 65 20 66 69 6c 65 20  with large file 
9cc0: 73 75 70 70 6f 72 74 20 28 4c 46 53 29 20 62 75  support (LFS) bu
9cd0: 74 20 4c 46 53 20 69 73 20 6e 6f 74 0a 2a 2a 20  t LFS is not.** 
9ce0: 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 74 68 65  available on the
9cf0: 20 68 6f 73 74 2c 20 74 68 65 6e 20 61 6e 20 53   host, then an S
9d00: 51 4c 49 54 45 5f 4e 4f 4c 46 53 20 69 73 20 72  QLITE_NOLFS is r
9d10: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20  eturned..*/.int 
9d20: 73 71 6c 69 74 65 4f 73 57 72 69 74 65 4c 6f 63  sqliteOsWriteLoc
9d30: 6b 28 4f 73 46 69 6c 65 20 2a 69 64 29 7b 0a 23  k(OsFile *id){.#
9d40: 69 66 20 4f 53 5f 55 4e 49 58 0a 20 20 69 6e 74  if OS_UNIX.  int
9d50: 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 4f 73 45   rc;.  sqliteOsE
9d60: 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 69  nterMutex();.  i
9d70: 66 28 20 69 64 2d 3e 70 4c 6f 63 6b 2d 3e 63 6e  f( id->pLock->cn
9d80: 74 3d 3d 30 20 7c 7c 20 28 69 64 2d 3e 70 4c 6f  t==0 || (id->pLo
9d90: 63 6b 2d 3e 63 6e 74 3d 3d 31 20 26 26 20 69 64  ck->cnt==1 && id
9da0: 2d 3e 6c 6f 63 6b 65 64 3d 3d 31 29 20 29 7b 0a  ->locked==1) ){.
9db0: 20 20 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b      struct flock
9dc0: 20 6c 6f 63 6b 3b 0a 20 20 20 20 69 6e 74 20 73   lock;.    int s
9dd0: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70  ;.    lock.l_typ
9de0: 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20 20  e = F_WRLCK;.   
9df0: 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d   lock.l_whence =
9e00: 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 6c   SEEK_SET;.    l
9e10: 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 6c 6f  ock.l_start = lo
9e20: 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 30 4c 3b 0a 20  ck.l_len = 0L;. 
9e30: 20 20 20 73 20 3d 20 66 63 6e 74 6c 28 69 64 2d     s = fcntl(id-
9e40: 3e 66 64 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c  >fd, F_SETLK, &l
9e50: 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28 20 73 21  ock);.    if( s!
9e60: 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
9e70: 20 28 65 72 72 6e 6f 3d 3d 45 49 4e 56 41 4c 29   (errno==EINVAL)
9e80: 20 3f 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 20   ? SQLITE_NOLFS 
9e90: 3a 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  : SQLITE_BUSY;. 
9ea0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
9eb0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
9ec0: 20 20 20 20 20 20 69 66 28 20 21 69 64 2d 3e 6c        if( !id->l
9ed0: 6f 63 6b 65 64 20 29 7b 0a 20 20 20 20 20 20 20  ocked ){.       
9ee0: 20 69 64 2d 3e 70 4f 70 65 6e 2d 3e 6e 4c 6f 63   id->pOpen->nLoc
9ef0: 6b 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 64 2d  k++;.        id-
9f00: 3e 6c 6f 63 6b 65 64 20 3d 20 31 3b 0a 20 20 20  >locked = 1;.   
9f10: 20 20 20 7d 0a 20 20 20 20 20 20 69 64 2d 3e 70     }.      id->p
9f20: 4c 6f 63 6b 2d 3e 63 6e 74 20 3d 20 2d 31 3b 0a  Lock->cnt = -1;.
9f30: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
9f40: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
9f50: 55 53 59 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  USY;.  }.  sqlit
9f60: 65 4f 73 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  eOsLeaveMutex();
9f70: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65  .  return rc;.#e
9f80: 6e 64 69 66 0a 23 69 66 20 4f 53 5f 57 49 4e 0a  ndif.#if OS_WIN.
9f90: 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20    int rc;.  if( 
9fa0: 69 64 2d 3e 6c 6f 63 6b 65 64 3c 30 20 29 7b 0a  id->locked<0 ){.
9fb0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
9fc0: 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OK;.  }else{.   
9fd0: 20 69 6e 74 20 72 65 73 3b 0a 20 20 20 20 69 6e   int res;.    in
9fe0: 74 20 63 6e 74 20 3d 20 31 30 30 3b 0a 20 20 20  t cnt = 100;.   
9ff0: 20 77 68 69 6c 65 28 20 63 6e 74 2d 2d 3e 30 20   while( cnt-->0 
a000: 26 26 20 28 72 65 73 20 3d 20 4c 6f 63 6b 46 69  && (res = LockFi
a010: 6c 65 28 69 64 2d 3e 68 2c 20 46 49 52 53 54 5f  le(id->h, FIRST_
a020: 4c 4f 43 4b 42 59 54 45 2c 20 30 2c 20 31 2c 20  LOCKBYTE, 0, 1, 
a030: 30 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  0))==0 ){.      
a040: 53 6c 65 65 70 28 31 29 3b 0a 20 20 20 20 7d 0a  Sleep(1);.    }.
a050: 20 20 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20      if( res ){. 
a060: 20 20 20 20 20 69 66 28 20 69 64 2d 3e 6c 6f 63       if( id->loc
a070: 6b 65 64 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  ked>0 ){.       
a080: 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a 20   if( isNT() ){. 
a090: 20 20 20 20 20 20 20 20 20 55 6e 6c 6f 63 6b 46           UnlockF
a0a0: 69 6c 65 28 69 64 2d 3e 68 2c 20 46 49 52 53 54  ile(id->h, FIRST
a0b0: 5f 4c 4f 43 4b 42 59 54 45 2b 31 2c 20 30 2c 20  _LOCKBYTE+1, 0, 
a0c0: 4e 5f 4c 4f 43 4b 42 59 54 45 2c 20 30 29 3b 0a  N_LOCKBYTE, 0);.
a0d0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
a0e0: 20 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 55           res = U
a0f0: 6e 6c 6f 63 6b 46 69 6c 65 28 69 64 2d 3e 68 2c  nlockFile(id->h,
a100: 20 46 49 52 53 54 5f 4c 4f 43 4b 42 59 54 45 20   FIRST_LOCKBYTE 
a110: 2b 20 69 64 2d 3e 6c 6f 63 6b 65 64 2c 20 30 2c  + id->locked, 0,
a120: 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   1, 0);.        
a130: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
a140: 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20  if( res ){.     
a150: 20 20 20 72 65 73 20 3d 20 4c 6f 63 6b 46 69 6c     res = LockFil
a160: 65 28 69 64 2d 3e 68 2c 20 46 49 52 53 54 5f 4c  e(id->h, FIRST_L
a170: 4f 43 4b 42 59 54 45 2b 31 2c 20 30 2c 20 4e 5f  OCKBYTE+1, 0, N_
a180: 4c 4f 43 4b 42 59 54 45 2c 20 30 29 3b 0a 20 20  LOCKBYTE, 0);.  
a190: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
a1a0: 20 20 20 72 65 73 20 3d 20 30 3b 0a 20 20 20 20     res = 0;.    
a1b0: 20 20 7d 0a 20 20 20 20 20 20 55 6e 6c 6f 63 6b    }.      Unlock
a1c0: 46 69 6c 65 28 69 64 2d 3e 68 2c 20 46 49 52 53  File(id->h, FIRS
a1d0: 54 5f 4c 4f 43 4b 42 59 54 45 2c 20 30 2c 20 31  T_LOCKBYTE, 0, 1
a1e0: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
a1f0: 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20  if( res ){.     
a200: 20 69 64 2d 3e 6c 6f 63 6b 65 64 20 3d 20 2d 31   id->locked = -1
a210: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ;.      rc = SQL
a220: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73  ITE_OK;.    }els
a230: 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  e{.      rc = SQ
a240: 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d  LITE_BUSY;.    }
a250: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
a260: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f 53 5f  ;.#endif.#if OS_
a270: 4d 41 43 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  MAC.  int rc;.  
a280: 69 66 28 20 69 64 2d 3e 6c 6f 63 6b 65 64 3c 30  if( id->locked<0
a290: 20 7c 7c 20 69 64 2d 3e 72 65 66 4e 75 6d 52 46   || id->refNumRF
a2a0: 20 3d 3d 20 2d 31 20 29 7b 0a 20 20 20 20 72 63   == -1 ){.    rc
a2b0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
a2c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 4f 53 45 72 72  }else{.    OSErr
a2d0: 20 72 65 73 3b 0a 20 20 20 20 69 6e 74 20 63 6e   res;.    int cn
a2e0: 74 20 3d 20 35 3b 0a 20 20 20 20 50 61 72 61 6d  t = 5;.    Param
a2f0: 42 6c 6f 63 6b 52 65 63 20 70 61 72 61 6d 73 3b  BlockRec params;
a300: 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 70 61 72  .    memset(&par
a310: 61 6d 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  ams, 0, sizeof(p
a320: 61 72 61 6d 73 29 29 3b 0a 20 20 20 20 70 61 72  arams));.    par
a330: 61 6d 73 2e 69 6f 50 61 72 61 6d 2e 69 6f 52 65  ams.ioParam.ioRe
a340: 66 4e 75 6d 20 3d 20 69 64 2d 3e 72 65 66 4e 75  fNum = id->refNu
a350: 6d 52 46 3b 0a 20 20 20 20 70 61 72 61 6d 73 2e  mRF;.    params.
a360: 69 6f 50 61 72 61 6d 2e 69 6f 50 6f 73 4d 6f 64  ioParam.ioPosMod
a370: 65 20 3d 20 66 73 46 72 6f 6d 53 74 61 72 74 3b  e = fsFromStart;
a380: 0a 20 20 20 20 70 61 72 61 6d 73 2e 69 6f 50 61  .    params.ioPa
a390: 72 61 6d 2e 69 6f 50 6f 73 4f 66 66 73 65 74 20  ram.ioPosOffset 
a3a0: 3d 20 46 49 52 53 54 5f 4c 4f 43 4b 42 59 54 45  = FIRST_LOCKBYTE
a3b0: 3b 0a 20 20 20 20 70 61 72 61 6d 73 2e 69 6f 50  ;.    params.ioP
a3c0: 61 72 61 6d 2e 69 6f 52 65 71 43 6f 75 6e 74 20  aram.ioReqCount 
a3d0: 3d 20 31 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  = 1;.    while( 
a3e0: 63 6e 74 2d 2d 3e 30 20 26 26 20 28 72 65 73 20  cnt-->0 && (res 
a3f0: 3d 20 50 42 4c 6f 63 6b 52 61 6e 67 65 53 79 6e  = PBLockRangeSyn
a400: 63 28 26 70 61 72 61 6d 73 29 29 21 3d 6e 6f 45  c(&params))!=noE
a410: 72 72 20 29 7b 0a 20 20 20 20 20 20 55 49 6e 74  rr ){.      UInt
a420: 33 32 20 66 69 6e 61 6c 54 69 63 6b 73 3b 0a 20  32 finalTicks;. 
a430: 20 20 20 20 20 44 65 6c 61 79 28 31 2c 20 26 66       Delay(1, &f
a440: 69 6e 61 6c 54 69 63 6b 73 29 3b 20 2f 2a 20 31  inalTicks); /* 1
a450: 2f 36 30 20 73 65 63 20 2a 2f 0a 20 20 20 20 7d  /60 sec */.    }
a460: 0a 20 20 20 20 69 66 28 20 72 65 73 20 3d 3d 20  .    if( res == 
a470: 6e 6f 45 72 72 20 29 7b 0a 20 20 20 20 20 20 70  noErr ){.      p
a480: 61 72 61 6d 73 2e 69 6f 50 61 72 61 6d 2e 69 6f  arams.ioParam.io
a490: 50 6f 73 4f 66 66 73 65 74 20 3d 20 46 49 52 53  PosOffset = FIRS
a4a0: 54 5f 4c 4f 43 4b 42 59 54 45 20 2b 20 69 64 2d  T_LOCKBYTE + id-
a4b0: 3e 6c 6f 63 6b 65 64 3b 0a 20 20 20 20 20 20 70  >locked;.      p
a4c0: 61 72 61 6d 73 2e 69 6f 50 61 72 61 6d 2e 69 6f  arams.ioParam.io
a4d0: 52 65 71 43 6f 75 6e 74 20 3d 20 31 3b 0a 20 20  ReqCount = 1;.  
a4e0: 20 20 20 20 69 66 28 20 69 64 2d 3e 6c 6f 63 6b      if( id->lock
a4f0: 65 64 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20  ed==0 .         
a500: 20 20 20 7c 7c 20 50 42 55 6e 6c 6f 63 6b 52 61     || PBUnlockRa
a510: 6e 67 65 53 79 6e 63 28 26 70 61 72 61 6d 73 29  ngeSync(&params)
a520: 3d 3d 6e 6f 45 72 72 20 29 7b 0a 20 20 20 20 20  ==noErr ){.     
a530: 20 20 20 70 61 72 61 6d 73 2e 69 6f 50 61 72 61     params.ioPara
a540: 6d 2e 69 6f 50 6f 73 4f 66 66 73 65 74 20 3d 20  m.ioPosOffset = 
a550: 46 49 52 53 54 5f 4c 4f 43 4b 42 59 54 45 2b 31  FIRST_LOCKBYTE+1
a560: 3b 0a 20 20 20 20 20 20 20 20 70 61 72 61 6d 73  ;.        params
a570: 2e 69 6f 50 61 72 61 6d 2e 69 6f 52 65 71 43 6f  .ioParam.ioReqCo
a580: 75 6e 74 20 3d 20 4e 5f 4c 4f 43 4b 42 59 54 45  unt = N_LOCKBYTE
a590: 3b 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d 20  ;.        res = 
a5a0: 50 42 4c 6f 63 6b 52 61 6e 67 65 53 79 6e 63 28  PBLockRangeSync(
a5b0: 26 70 61 72 61 6d 73 29 3b 0a 20 20 20 20 20 20  &params);.      
a5c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
a5d0: 65 73 20 3d 20 61 66 70 52 61 6e 67 65 4e 6f 74  es = afpRangeNot
a5e0: 4c 6f 63 6b 65 64 3b 0a 20 20 20 20 20 20 7d 0a  Locked;.      }.
a5f0: 20 20 20 20 20 20 70 61 72 61 6d 73 2e 69 6f 50        params.ioP
a600: 61 72 61 6d 2e 69 6f 50 6f 73 4f 66 66 73 65 74  aram.ioPosOffset
a610: 20 3d 20 46 49 52 53 54 5f 4c 4f 43 4b 42 59 54   = FIRST_LOCKBYT
a620: 45 3b 0a 20 20 20 20 20 20 70 61 72 61 6d 73 2e  E;.      params.
a630: 69 6f 50 61 72 61 6d 2e 69 6f 52 65 71 43 6f 75  ioParam.ioReqCou
a640: 6e 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 50 42  nt = 1;.      PB
a650: 55 6e 6c 6f 63 6b 52 61 6e 67 65 53 79 6e 63 28  UnlockRangeSync(
a660: 26 70 61 72 61 6d 73 29 3b 0a 20 20 20 20 7d 0a  &params);.    }.
a670: 20 20 20 20 69 66 28 20 72 65 73 20 3d 3d 20 6e      if( res == n
a680: 6f 45 72 72 20 29 7b 0a 20 20 20 20 20 20 69 64  oErr ){.      id
a690: 2d 3e 6c 6f 63 6b 65 64 20 3d 20 2d 31 3b 0a 20  ->locked = -1;. 
a6a0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
a6b0: 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  _OK;.    }else{.
a6c0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
a6d0: 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20 20  E_BUSY;.    }.  
a6e0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23  }.  return rc;.#
a6f0: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  endif.}../*.** U
a700: 6e 6c 6f 63 6b 20 74 68 65 20 67 69 76 65 6e 20  nlock the given 
a710: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e  file descriptor.
a720: 20 20 49 66 20 74 68 65 20 66 69 6c 65 20 64 65    If the file de
a730: 73 63 72 69 70 74 6f 72 20 77 61 73 0a 2a 2a 20  scriptor was.** 
a740: 6e 6f 74 20 70 72 65 76 69 6f 75 73 6c 79 20 6c  not previously l
a750: 6f 63 6b 65 64 2c 20 74 68 65 6e 20 74 68 69 73  ocked, then this
a760: 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
a770: 2d 6f 70 2e 20 20 49 66 20 74 68 69 73 0a 2a 2a  -op.  If this.**
a780: 20 6c 69 62 72 61 72 79 20 77 61 73 20 63 6f 6d   library was com
a790: 70 69 6c 65 64 20 77 69 74 68 20 6c 61 72 67 65  piled with large
a7a0: 20 66 69 6c 65 20 73 75 70 70 6f 72 74 20 28 4c   file support (L
a7b0: 46 53 29 20 62 75 74 20 4c 46 53 20 69 73 20 6e  FS) but LFS is n
a7c0: 6f 74 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20  ot.** available 
a7d0: 6f 6e 20 74 68 65 20 68 6f 73 74 2c 20 74 68 65  on the host, the
a7e0: 6e 20 61 6e 20 53 51 4c 49 54 45 5f 4e 4f 4c 46  n an SQLITE_NOLF
a7f0: 53 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  S is returned..*
a800: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 4f 73 55 6e  /.int sqliteOsUn
a810: 6c 6f 63 6b 28 4f 73 46 69 6c 65 20 2a 69 64 29  lock(OsFile *id)
a820: 7b 0a 23 69 66 20 4f 53 5f 55 4e 49 58 0a 20 20  {.#if OS_UNIX.  
a830: 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 21 69  int rc;.  if( !i
a840: 64 2d 3e 6c 6f 63 6b 65 64 20 29 20 72 65 74 75  d->locked ) retu
a850: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
a860: 73 71 6c 69 74 65 4f 73 45 6e 74 65 72 4d 75 74  sqliteOsEnterMut
a870: 65 78 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ex();.  assert( 
a880: 69 64 2d 3e 70 4c 6f 63 6b 2d 3e 63 6e 74 21 3d  id->pLock->cnt!=
a890: 30 20 29 3b 0a 20 20 69 66 28 20 69 64 2d 3e 70  0 );.  if( id->p
a8a0: 4c 6f 63 6b 2d 3e 63 6e 74 3e 31 20 29 7b 0a 20  Lock->cnt>1 ){. 
a8b0: 20 20 20 69 64 2d 3e 70 4c 6f 63 6b 2d 3e 63 6e     id->pLock->cn
a8c0: 74 2d 2d 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  t--;.    rc = SQ
a8d0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
a8e0: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 66 6c 6f  {.    struct flo
a8f0: 63 6b 20 6c 6f 63 6b 3b 0a 20 20 20 20 69 6e 74  ck lock;.    int
a900: 20 73 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74   s;.    lock.l_t
a910: 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20  ype = F_UNLCK;. 
a920: 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65     lock.l_whence
a930: 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20   = SEEK_SET;.   
a940: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
a950: 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 30 4c 3b  lock.l_len = 0L;
a960: 0a 20 20 20 20 73 20 3d 20 66 63 6e 74 6c 28 69  .    s = fcntl(i
a970: 64 2d 3e 66 64 2c 20 46 5f 53 45 54 4c 4b 2c 20  d->fd, F_SETLK, 
a980: 26 6c 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28 20  &lock);.    if( 
a990: 73 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  s!=0 ){.      rc
a9a0: 20 3d 20 28 65 72 72 6e 6f 3d 3d 45 49 4e 56 41   = (errno==EINVA
a9b0: 4c 29 20 3f 20 53 51 4c 49 54 45 5f 4e 4f 4c 46  L) ? SQLITE_NOLF
a9c0: 53 20 3a 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  S : SQLITE_BUSY;
a9d0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
a9e0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
a9f0: 3b 0a 20 20 20 20 20 20 69 64 2d 3e 70 4c 6f 63  ;.      id->pLoc
aa00: 6b 2d 3e 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20  k->cnt = 0;.    
aa10: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  }.  }.  if( rc==
aa20: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
aa30: 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68   /* Decrement th
aa40: 65 20 63 6f 75 6e 74 20 6f 66 20 6c 6f 63 6b 73  e count of locks
aa50: 20 61 67 61 69 6e 73 74 20 74 68 69 73 20 73 61   against this sa
aa60: 6d 65 20 66 69 6c 65 2e 20 20 57 68 65 6e 20 74  me file.  When t
aa70: 68 65 0a 20 20 20 20 2a 2a 20 63 6f 75 6e 74 20  he.    ** count 
aa80: 72 65 61 63 68 65 73 20 7a 65 72 6f 2c 20 63 6c  reaches zero, cl
aa90: 6f 73 65 20 61 6e 79 20 6f 74 68 65 72 20 66 69  ose any other fi
aaa0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 77  le descriptors w
aab0: 68 6f 73 65 20 63 6c 6f 73 65 0a 20 20 20 20 2a  hose close.    *
aac0: 2a 20 77 61 73 20 64 65 66 65 72 72 65 64 20 62  * was deferred b
aad0: 65 63 61 75 73 65 20 6f 66 20 6f 75 74 73 74 61  ecause of outsta
aae0: 6e 64 69 6e 67 20 6c 6f 63 6b 73 2e 0a 20 20 20  nding locks..   
aaf0: 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20 6f   */.    struct o
ab00: 70 65 6e 43 6e 74 20 2a 70 4f 70 65 6e 20 3d 20  penCnt *pOpen = 
ab10: 69 64 2d 3e 70 4f 70 65 6e 3b 0a 20 20 20 20 70  id->pOpen;.    p
ab20: 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20  Open->nLock--;. 
ab30: 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 65 6e     assert( pOpen
ab40: 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29 3b 0a 20 20  ->nLock>=0 );.  
ab50: 20 20 69 66 28 20 70 4f 70 65 6e 2d 3e 6e 4c 6f    if( pOpen->nLo
ab60: 63 6b 3d 3d 30 20 26 26 20 70 4f 70 65 6e 2d 3e  ck==0 && pOpen->
ab70: 6e 50 65 6e 64 69 6e 67 3e 30 20 29 7b 0a 20 20  nPending>0 ){.  
ab80: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
ab90: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 70 65   for(i=0; i<pOpe
aba0: 6e 2d 3e 6e 50 65 6e 64 69 6e 67 3b 20 69 2b 2b  n->nPending; i++
abb0: 29 7b 0a 20 20 20 20 20 20 20 20 63 6c 6f 73 65  ){.        close
abc0: 28 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67  (pOpen->aPending
abd0: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  [i]);.      }.  
abe0: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
abf0: 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 29 3b  Open->aPending);
ac00: 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d 3e 6e 50  .      pOpen->nP
ac10: 65 6e 64 69 6e 67 20 3d 20 30 3b 0a 20 20 20 20  ending = 0;.    
ac20: 20 20 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e    pOpen->aPendin
ac30: 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  g = 0;.    }.  }
ac40: 0a 20 20 73 71 6c 69 74 65 4f 73 4c 65 61 76 65  .  sqliteOsLeave
ac50: 4d 75 74 65 78 28 29 3b 0a 20 20 69 64 2d 3e 6c  Mutex();.  id->l
ac60: 6f 63 6b 65 64 20 3d 20 30 3b 0a 20 20 72 65 74  ocked = 0;.  ret
ac70: 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 23  urn rc;.#endif.#
ac80: 69 66 20 4f 53 5f 57 49 4e 0a 20 20 69 6e 74 20  if OS_WIN.  int 
ac90: 72 63 3b 0a 20 20 69 66 28 20 69 64 2d 3e 6c 6f  rc;.  if( id->lo
aca0: 63 6b 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72  cked==0 ){.    r
acb0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
acc0: 20 7d 65 6c 73 65 20 69 66 28 20 69 73 4e 54 28   }else if( isNT(
acd0: 29 20 7c 7c 20 69 64 2d 3e 6c 6f 63 6b 65 64 3c  ) || id->locked<
ace0: 30 20 29 7b 0a 20 20 20 20 55 6e 6c 6f 63 6b 46  0 ){.    UnlockF
acf0: 69 6c 65 28 69 64 2d 3e 68 2c 20 46 49 52 53 54  ile(id->h, FIRST
ad00: 5f 4c 4f 43 4b 42 59 54 45 2b 31 2c 20 30 2c 20  _LOCKBYTE+1, 0, 
ad10: 4e 5f 4c 4f 43 4b 42 59 54 45 2c 20 30 29 3b 0a  N_LOCKBYTE, 0);.
ad20: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
ad30: 4f 4b 3b 0a 20 20 20 20 69 64 2d 3e 6c 6f 63 6b  OK;.    id->lock
ad40: 65 64 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ed = 0;.  }else{
ad50: 0a 20 20 20 20 55 6e 6c 6f 63 6b 46 69 6c 65 28  .    UnlockFile(
ad60: 69 64 2d 3e 68 2c 20 46 49 52 53 54 5f 4c 4f 43  id->h, FIRST_LOC
ad70: 4b 42 59 54 45 2b 69 64 2d 3e 6c 6f 63 6b 65 64  KBYTE+id->locked
ad80: 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  , 0, 1, 0);.    
ad90: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
ada0: 20 20 20 20 69 64 2d 3e 6c 6f 63 6b 65 64 20 3d      id->locked =
adb0: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
adc0: 20 72 63 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20   rc;.#endif.#if 
add0: 4f 53 5f 4d 41 43 0a 20 20 69 6e 74 20 72 63 3b  OS_MAC.  int rc;
ade0: 0a 20 20 50 61 72 61 6d 42 6c 6f 63 6b 52 65 63  .  ParamBlockRec
adf0: 20 70 61 72 61 6d 73 3b 0a 20 20 6d 65 6d 73 65   params;.  memse
ae00: 74 28 26 70 61 72 61 6d 73 2c 20 30 2c 20 73 69  t(&params, 0, si
ae10: 7a 65 6f 66 28 70 61 72 61 6d 73 29 29 3b 0a 20  zeof(params));. 
ae20: 20 70 61 72 61 6d 73 2e 69 6f 50 61 72 61 6d 2e   params.ioParam.
ae30: 69 6f 52 65 66 4e 75 6d 20 3d 20 69 64 2d 3e 72  ioRefNum = id->r
ae40: 65 66 4e 75 6d 52 46 3b 0a 20 20 70 61 72 61 6d  efNumRF;.  param
ae50: 73 2e 69 6f 50 61 72 61 6d 2e 69 6f 50 6f 73 4d  s.ioParam.ioPosM
ae60: 6f 64 65 20 3d 20 66 73 46 72 6f 6d 53 74 61 72  ode = fsFromStar
ae70: 74 3b 0a 20 20 69 66 28 20 69 64 2d 3e 6c 6f 63  t;.  if( id->loc
ae80: 6b 65 64 3d 3d 30 20 7c 7c 20 69 64 2d 3e 72 65  ked==0 || id->re
ae90: 66 4e 75 6d 52 46 20 3d 3d 20 2d 31 20 29 7b 0a  fNumRF == -1 ){.
aea0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
aeb0: 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  OK;.  }else if( 
aec0: 69 64 2d 3e 6c 6f 63 6b 65 64 3c 30 20 29 7b 0a  id->locked<0 ){.
aed0: 20 20 20 20 70 61 72 61 6d 73 2e 69 6f 50 61 72      params.ioPar
aee0: 61 6d 2e 69 6f 50 6f 73 4f 66 66 73 65 74 20 3d  am.ioPosOffset =
aef0: 20 46 49 52 53 54 5f 4c 4f 43 4b 42 59 54 45 2b   FIRST_LOCKBYTE+
af00: 31 3b 0a 20 20 20 20 70 61 72 61 6d 73 2e 69 6f  1;.    params.io
af10: 50 61 72 61 6d 2e 69 6f 52 65 71 43 6f 75 6e 74  Param.ioReqCount
af20: 20 3d 20 4e 5f 4c 4f 43 4b 42 59 54 45 3b 0a 20   = N_LOCKBYTE;. 
af30: 20 20 20 50 42 55 6e 6c 6f 63 6b 52 61 6e 67 65     PBUnlockRange
af40: 53 79 6e 63 28 26 70 61 72 61 6d 73 29 3b 0a 20  Sync(&params);. 
af50: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
af60: 4b 3b 0a 20 20 20 20 69 64 2d 3e 6c 6f 63 6b 65  K;.    id->locke
af70: 64 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  d = 0;.  }else{.
af80: 20 20 20 20 70 61 72 61 6d 73 2e 69 6f 50 61 72      params.ioPar
af90: 61 6d 2e 69 6f 50 6f 73 4f 66 66 73 65 74 20 3d  am.ioPosOffset =
afa0: 20 46 49 52 53 54 5f 4c 4f 43 4b 42 59 54 45 2b   FIRST_LOCKBYTE+
afb0: 69 64 2d 3e 6c 6f 63 6b 65 64 3b 0a 20 20 20 20  id->locked;.    
afc0: 70 61 72 61 6d 73 2e 69 6f 50 61 72 61 6d 2e 69  params.ioParam.i
afd0: 6f 52 65 71 43 6f 75 6e 74 20 3d 20 31 3b 0a 20  oReqCount = 1;. 
afe0: 20 20 20 50 42 55 6e 6c 6f 63 6b 52 61 6e 67 65     PBUnlockRange
aff0: 53 79 6e 63 28 26 70 61 72 61 6d 73 29 3b 0a 20  Sync(&params);. 
b000: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
b010: 4b 3b 0a 20 20 20 20 69 64 2d 3e 6c 6f 63 6b 65  K;.    id->locke
b020: 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  d = 0;.  }.  ret
b030: 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d  urn rc;.#endif.}
b040: 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 69 6e 66 6f  ../*.** Get info
b050: 72 6d 61 74 69 6f 6e 20 74 6f 20 73 65 65 64 20  rmation to seed 
b060: 74 68 65 20 72 61 6e 64 6f 6d 20 6e 75 6d 62 65  the random numbe
b070: 72 20 67 65 6e 65 72 61 74 6f 72 2e 20 20 54 68  r generator.  Th
b080: 65 20 73 65 65 64 0a 2a 2a 20 69 73 20 77 72 69  e seed.** is wri
b090: 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 62 75  tten into the bu
b0a0: 66 66 65 72 20 7a 42 75 66 5b 32 35 36 5d 2e 20  ffer zBuf[256]. 
b0b0: 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e   The calling fun
b0c0: 63 74 69 6f 6e 20 6d 75 73 74 0a 2a 2a 20 73 75  ction must.** su
b0d0: 70 70 6c 79 20 61 20 73 75 66 66 69 63 69 65 6e  pply a sufficien
b0e0: 74 6c 79 20 6c 61 72 67 65 20 62 75 66 66 65 72  tly large buffer
b0f0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 4f  ..*/.int sqliteO
b100: 73 52 61 6e 64 6f 6d 53 65 65 64 28 63 68 61 72  sRandomSeed(char
b110: 20 2a 7a 42 75 66 29 7b 0a 20 20 2f 2a 20 57 65   *zBuf){.  /* We
b120: 20 68 61 76 65 20 74 6f 20 69 6e 69 74 69 61 6c   have to initial
b130: 69 7a 65 20 7a 42 75 66 20 74 6f 20 70 72 65 76  ize zBuf to prev
b140: 65 6e 74 20 76 61 6c 67 72 69 6e 64 20 66 72 6f  ent valgrind fro
b150: 6d 20 72 65 70 6f 72 74 69 6e 67 0a 20 20 2a 2a  m reporting.  **
b160: 20 65 72 72 6f 72 73 2e 20 20 54 68 65 20 72 65   errors.  The re
b170: 70 6f 72 74 73 20 69 73 73 75 65 64 20 62 79 20  ports issued by 
b180: 76 61 6c 67 72 69 6e 64 20 61 72 65 20 69 6e 63  valgrind are inc
b190: 6f 72 72 65 63 74 20 2d 20 77 65 20 77 6f 75 6c  orrect - we woul
b1a0: 64 0a 20 20 2a 2a 20 70 72 65 66 65 72 20 74 68  d.  ** prefer th
b1b0: 61 74 20 74 68 65 20 72 61 6e 64 6f 6d 6e 65 73  at the randomnes
b1c0: 73 20 62 65 20 69 6e 63 72 65 61 73 65 64 20 62  s be increased b
b1d0: 79 20 6d 61 6b 69 6e 67 20 75 73 65 20 6f 66 20  y making use of 
b1e0: 74 68 65 0a 20 20 2a 2a 20 75 6e 69 6e 69 74 69  the.  ** uniniti
b1f0: 61 6c 69 7a 65 64 20 73 70 61 63 65 20 69 6e 20  alized space in 
b200: 7a 42 75 66 20 2d 20 62 75 74 20 76 61 6c 67 72  zBuf - but valgr
b210: 69 6e 64 20 65 72 72 6f 72 73 20 74 65 6e 64 20  ind errors tend 
b220: 74 6f 20 77 6f 72 72 79 0a 20 20 2a 2a 20 73 6f  to worry.  ** so
b230: 6d 65 20 75 73 65 72 73 2e 20 20 52 61 74 68 65  me users.  Rathe
b240: 72 20 74 68 61 6e 20 61 72 67 75 65 2c 20 69 74  r than argue, it
b250: 20 73 65 65 6d 73 20 65 61 73 69 65 72 20 6a 75   seems easier ju
b260: 73 74 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65  st to initialize
b270: 0a 20 20 2a 2a 20 74 68 65 20 77 68 6f 6c 65 20  .  ** the whole 
b280: 61 72 72 61 79 20 61 6e 64 20 73 69 6c 65 6e 63  array and silenc
b290: 65 20 76 61 6c 67 72 69 6e 64 2c 20 65 76 65 6e  e valgrind, even
b2a0: 20 69 66 20 74 68 61 74 20 6d 65 61 6e 73 20 6c   if that means l
b2b0: 65 73 73 20 72 61 6e 64 6f 6d 6e 65 73 73 0a 20  ess randomness. 
b2c0: 20 2a 2a 20 69 6e 20 74 68 65 20 72 61 6e 64 6f   ** in the rando
b2d0: 6d 20 73 65 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a  m seed..  **.  *
b2e0: 2a 20 57 68 65 6e 20 74 65 73 74 69 6e 67 2c 20  * When testing, 
b2f0: 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 7a 42 75  initializing zBu
b300: 66 5b 5d 20 74 6f 20 7a 65 72 6f 20 69 73 20 61  f[] to zero is a
b310: 6c 6c 20 77 65 20 64 6f 2e 20 20 54 68 61 74 20  ll we do.  That 
b320: 6d 65 61 6e 73 0a 20 20 2a 2a 20 74 68 61 74 20  means.  ** that 
b330: 77 65 20 61 6c 77 61 79 73 20 75 73 65 20 74 68  we always use th
b340: 65 20 73 61 6d 65 20 72 61 6e 64 6f 6d 20 6e 75  e same random nu
b350: 6d 62 65 72 20 73 65 71 75 65 6e 63 65 2e 2a 20  mber sequence.* 
b360: 54 68 69 73 20 6d 61 6b 65 73 20 74 68 65 0a 20  This makes the. 
b370: 20 2a 2a 20 74 65 73 74 73 20 72 65 70 65 61 74   ** tests repeat
b380: 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d  able..  */.  mem
b390: 73 65 74 28 7a 42 75 66 2c 20 30 2c 20 32 35 36  set(zBuf, 0, 256
b3a0: 29 3b 0a 23 69 66 20 4f 53 5f 55 4e 49 58 20 26  );.#if OS_UNIX &
b3b0: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
b3c0: 45 5f 54 45 53 54 29 0a 20 20 7b 0a 20 20 20 20  E_TEST).  {.    
b3d0: 69 6e 74 20 70 69 64 3b 0a 20 20 20 20 74 69 6d  int pid;.    tim
b3e0: 65 28 28 74 69 6d 65 5f 74 2a 29 7a 42 75 66 29  e((time_t*)zBuf)
b3f0: 3b 0a 20 20 20 20 70 69 64 20 3d 20 67 65 74 70  ;.    pid = getp
b400: 69 64 28 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  id();.    memcpy
b410: 28 26 7a 42 75 66 5b 73 69 7a 65 6f 66 28 74 69  (&zBuf[sizeof(ti
b420: 6d 65 5f 74 29 5d 2c 20 26 70 69 64 2c 20 73 69  me_t)], &pid, si
b430: 7a 65 6f 66 28 70 69 64 29 29 3b 0a 20 20 7d 0a  zeof(pid));.  }.
b440: 23 65 6e 64 69 66 0a 23 69 66 20 4f 53 5f 57 49  #endif.#if OS_WI
b450: 4e 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  N && !defined(SQ
b460: 4c 49 54 45 5f 54 45 53 54 29 0a 20 20 47 65 74  LITE_TEST).  Get
b470: 53 79 73 74 65 6d 54 69 6d 65 28 28 4c 50 53 59  SystemTime((LPSY
b480: 53 54 45 4d 54 49 4d 45 29 7a 42 75 66 29 3b 0a  STEMTIME)zBuf);.
b490: 23 65 6e 64 69 66 0a 23 69 66 20 4f 53 5f 4d 41  #endif.#if OS_MA
b4a0: 43 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 70 69  C.  {.    int pi
b4b0: 64 3b 0a 20 20 20 20 4d 69 63 72 6f 73 65 63 6f  d;.    Microseco
b4c0: 6e 64 73 28 28 55 6e 73 69 67 6e 65 64 57 69 64  nds((UnsignedWid
b4d0: 65 2a 29 7a 42 75 66 29 3b 0a 20 20 20 20 70 69  e*)zBuf);.    pi
b4e0: 64 20 3d 20 67 65 74 70 69 64 28 29 3b 0a 20 20  d = getpid();.  
b4f0: 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 73    memcpy(&zBuf[s
b500: 69 7a 65 6f 66 28 55 6e 73 69 67 6e 65 64 57 69  izeof(UnsignedWi
b510: 64 65 29 5d 2c 20 26 70 69 64 2c 20 73 69 7a 65  de)], &pid, size
b520: 6f 66 28 70 69 64 29 29 3b 0a 20 20 7d 0a 23 65  of(pid));.  }.#e
b530: 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51  ndif.  return SQ
b540: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
b550: 2a 20 53 6c 65 65 70 20 66 6f 72 20 61 20 6c 69  * Sleep for a li
b560: 74 74 6c 65 20 77 68 69 6c 65 2e 20 20 52 65 74  ttle while.  Ret
b570: 75 72 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f  urn the amount o
b580: 66 20 74 69 6d 65 20 73 6c 65 70 74 2e 0a 2a 2f  f time slept..*/
b590: 0a 69 6e 74 20 73 71 6c 69 74 65 4f 73 53 6c 65  .int sqliteOsSle
b5a0: 65 70 28 69 6e 74 20 6d 73 29 7b 0a 23 69 66 20  ep(int ms){.#if 
b5b0: 4f 53 5f 55 4e 49 58 0a 23 69 66 20 64 65 66 69  OS_UNIX.#if defi
b5c0: 6e 65 64 28 48 41 56 45 5f 55 53 4c 45 45 50 29  ned(HAVE_USLEEP)
b5d0: 20 26 26 20 48 41 56 45 5f 55 53 4c 45 45 50 0a   && HAVE_USLEEP.
b5e0: 20 20 75 73 6c 65 65 70 28 6d 73 2a 31 30 30 30    usleep(ms*1000
b5f0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 6d 73 3b 0a  );.  return ms;.
b600: 23 65 6c 73 65 0a 20 20 73 6c 65 65 70 28 28 6d  #else.  sleep((m
b610: 73 2b 39 39 39 29 2f 31 30 30 30 29 3b 0a 20 20  s+999)/1000);.  
b620: 72 65 74 75 72 6e 20 31 30 30 30 2a 28 28 6d 73  return 1000*((ms
b630: 2b 39 39 39 29 2f 31 30 30 30 29 3b 0a 23 65 6e  +999)/1000);.#en
b640: 64 69 66 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f  dif.#endif.#if O
b650: 53 5f 57 49 4e 0a 20 20 53 6c 65 65 70 28 6d 73  S_WIN.  Sleep(ms
b660: 29 3b 0a 20 20 72 65 74 75 72 6e 20 6d 73 3b 0a  );.  return ms;.
b670: 23 65 6e 64 69 66 0a 23 69 66 20 4f 53 5f 4d 41  #endif.#if OS_MA
b680: 43 0a 20 20 55 49 6e 74 33 32 20 66 69 6e 61 6c  C.  UInt32 final
b690: 54 69 63 6b 73 3b 0a 20 20 55 49 6e 74 33 32 20  Ticks;.  UInt32 
b6a0: 74 69 63 6b 73 20 3d 20 28 28 28 55 49 6e 74 33  ticks = (((UInt3
b6b0: 32 29 6d 73 2b 31 36 29 2a 33 29 2f 35 30 3b 20  2)ms+16)*3)/50; 
b6c0: 20 2f 2a 20 31 2f 36 30 20 73 65 63 20 70 65 72   /* 1/60 sec per
b6d0: 20 74 69 63 6b 20 2a 2f 0a 20 20 44 65 6c 61 79   tick */.  Delay
b6e0: 28 74 69 63 6b 73 2c 20 26 66 69 6e 61 6c 54 69  (ticks, &finalTi
b6f0: 63 6b 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  cks);.  return (
b700: 69 6e 74 29 28 28 74 69 63 6b 73 2a 35 30 29 2f  int)((ticks*50)/
b710: 33 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a  3);.#endif.}../*
b720: 0a 2a 2a 20 53 74 61 74 69 63 20 76 61 72 69 61  .** Static varia
b730: 62 6c 65 73 20 75 73 65 64 20 66 6f 72 20 74 68  bles used for th
b740: 72 65 61 64 20 73 79 6e 63 68 72 6f 6e 69 7a 61  read synchroniza
b750: 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  tion.*/.static i
b760: 6e 74 20 69 6e 4d 75 74 65 78 20 3d 20 30 3b 0a  nt inMutex = 0;.
b770: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 55 4e  #ifdef SQLITE_UN
b780: 49 58 5f 54 48 52 45 41 44 53 0a 20 20 73 74 61  IX_THREADS.  sta
b790: 74 69 63 20 70 74 68 72 65 61 64 5f 6d 75 74 65  tic pthread_mute
b7a0: 78 5f 74 20 6d 75 74 65 78 20 3d 20 50 54 48 52  x_t mutex = PTHR
b7b0: 45 41 44 5f 4d 55 54 45 58 5f 49 4e 49 54 49 41  EAD_MUTEX_INITIA
b7c0: 4c 49 5a 45 52 3b 0a 23 65 6e 64 69 66 0a 23 69  LIZER;.#endif.#i
b7d0: 66 64 65 66 20 53 51 4c 49 54 45 5f 57 33 32 5f  fdef SQLITE_W32_
b7e0: 54 48 52 45 41 44 53 0a 20 20 73 74 61 74 69 63  THREADS.  static
b7f0: 20 43 52 49 54 49 43 41 4c 5f 53 45 43 54 49 4f   CRITICAL_SECTIO
b800: 4e 20 63 73 3b 0a 23 65 6e 64 69 66 0a 23 69 66  N cs;.#endif.#if
b810: 64 65 66 20 53 51 4c 49 54 45 5f 4d 41 43 4f 53  def SQLITE_MACOS
b820: 5f 4d 55 4c 54 49 54 41 53 4b 49 4e 47 0a 20 20  _MULTITASKING.  
b830: 73 74 61 74 69 63 20 4d 50 43 72 69 74 69 63 61  static MPCritica
b840: 6c 52 65 67 69 6f 6e 49 44 20 63 72 69 74 69 63  lRegionID critic
b850: 61 6c 52 65 67 69 6f 6e 3b 0a 23 65 6e 64 69 66  alRegion;.#endif
b860: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
b870: 6f 77 69 6e 67 20 70 61 69 72 20 6f 66 20 72 6f  owing pair of ro
b880: 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 20  utine implement 
b890: 6d 75 74 75 61 6c 20 65 78 63 6c 75 73 69 6f 6e  mutual exclusion
b8a0: 20 66 6f 72 0a 2a 2a 20 6d 75 6c 74 69 2d 74 68   for.** multi-th
b8b0: 72 65 61 64 65 64 20 70 72 6f 63 65 73 73 65 73  readed processes
b8c0: 2e 20 20 4f 6e 6c 79 20 61 20 73 69 6e 67 6c 65  .  Only a single
b8d0: 20 74 68 72 65 61 64 20 69 73 20 61 6c 6c 6f 77   thread is allow
b8e0: 65 64 20 74 6f 0a 2a 2a 20 65 78 65 63 75 74 65  ed to.** execute
b8f0: 64 20 63 6f 64 65 20 74 68 61 74 20 69 73 20 73  d code that is s
b900: 75 72 72 6f 75 6e 64 65 64 20 62 79 20 45 6e 74  urrounded by Ent
b910: 65 72 4d 75 74 65 78 28 29 20 61 6e 64 20 4c 65  erMutex() and Le
b920: 61 76 65 4d 75 74 65 78 28 29 2e 0a 2a 2a 0a 2a  aveMutex()..**.*
b930: 2a 20 53 51 4c 69 74 65 20 75 73 65 73 20 6f 6e  * SQLite uses on
b940: 6c 79 20 61 20 73 69 6e 67 6c 65 20 4d 75 74 65  ly a single Mute
b950: 78 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f 74  x.  There is not
b960: 20 6d 75 63 68 20 63 72 69 74 69 63 61 6c 0a 2a   much critical.*
b970: 2a 20 63 6f 64 65 20 61 6e 64 20 77 68 61 74 20  * code and what 
b980: 6c 69 74 74 6c 65 20 74 68 65 72 65 20 69 73 20  little there is 
b990: 65 78 65 63 75 74 65 73 20 71 75 69 63 6b 6c 79  executes quickly
b9a0: 20 61 6e 64 20 77 69 74 68 6f 75 74 20 62 6c 6f   and without blo
b9b0: 63 6b 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20 73  cking..*/.void s
b9c0: 71 6c 69 74 65 4f 73 45 6e 74 65 72 4d 75 74 65  qliteOsEnterMute
b9d0: 78 28 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  x(){.#ifdef SQLI
b9e0: 54 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 0a  TE_UNIX_THREADS.
b9f0: 20 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f    pthread_mutex_
ba00: 6c 6f 63 6b 28 26 6d 75 74 65 78 29 3b 0a 23 65  lock(&mutex);.#e
ba10: 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
ba20: 54 45 5f 57 33 32 5f 54 48 52 45 41 44 53 0a 20  TE_W32_THREADS. 
ba30: 20 73 74 61 74 69 63 20 69 6e 74 20 69 73 49 6e   static int isIn
ba40: 69 74 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28  it = 0;.  while(
ba50: 20 21 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20   !isInit ){.    
ba60: 73 74 61 74 69 63 20 6c 6f 6e 67 20 6c 6f 63 6b  static long lock
ba70: 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 49 6e   = 0;.    if( In
ba80: 74 65 72 6c 6f 63 6b 65 64 49 6e 63 72 65 6d 65  terlockedIncreme
ba90: 6e 74 28 26 6c 6f 63 6b 29 3d 3d 31 20 29 7b 0a  nt(&lock)==1 ){.
baa0: 20 20 20 20 20 20 49 6e 69 74 69 61 6c 69 7a 65        Initialize
bab0: 43 72 69 74 69 63 61 6c 53 65 63 74 69 6f 6e 28  CriticalSection(
bac0: 26 63 73 29 3b 0a 20 20 20 20 20 20 69 73 49 6e  &cs);.      isIn
bad0: 69 74 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  it = 1;.    }els
bae0: 65 7b 0a 20 20 20 20 20 20 53 6c 65 65 70 28 31  e{.      Sleep(1
baf0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 45  );.    }.  }.  E
bb00: 6e 74 65 72 43 72 69 74 69 63 61 6c 53 65 63 74  nterCriticalSect
bb10: 69 6f 6e 28 26 63 73 29 3b 0a 23 65 6e 64 69 66  ion(&cs);.#endif
bb20: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4d  .#ifdef SQLITE_M
bb30: 41 43 4f 53 5f 4d 55 4c 54 49 54 41 53 4b 49 4e  ACOS_MULTITASKIN
bb40: 47 0a 20 20 73 74 61 74 69 63 20 76 6f 6c 61 74  G.  static volat
bb50: 69 6c 65 20 69 6e 74 20 6e 6f 74 49 6e 69 74 20  ile int notInit 
bb60: 3d 20 31 3b 0a 20 20 69 66 28 20 6e 6f 74 49 6e  = 1;.  if( notIn
bb70: 69 74 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 6f  it ){.    if( no
bb80: 74 49 6e 69 74 20 3d 3d 20 32 20 29 20 2f 2a 20  tInit == 2 ) /* 
bb90: 61 73 20 63 6c 6f 73 65 20 61 73 20 79 6f 75 20  as close as you 
bba0: 63 61 6e 20 67 65 74 20 74 6f 20 74 68 72 65 61  can get to threa
bbb0: 64 20 73 61 66 65 20 69 6e 69 74 20 2a 2f 0a 20  d safe init */. 
bbc0: 20 20 20 20 20 4d 50 59 69 65 6c 64 28 29 3b 0a       MPYield();.
bbd0: 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20      else{.      
bbe0: 6e 6f 74 49 6e 69 74 20 3d 20 32 3b 0a 20 20 20  notInit = 2;.   
bbf0: 20 20 20 4d 50 43 72 65 61 74 65 43 72 69 74 69     MPCreateCriti
bc00: 63 61 6c 52 65 67 69 6f 6e 28 26 63 72 69 74 69  calRegion(&criti
bc10: 63 61 6c 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20  calRegion);.    
bc20: 20 20 6e 6f 74 49 6e 69 74 20 3d 20 30 3b 0a 20    notInit = 0;. 
bc30: 20 20 20 7d 0a 20 20 7d 0a 20 20 4d 50 45 6e 74     }.  }.  MPEnt
bc40: 65 72 43 72 69 74 69 63 61 6c 52 65 67 69 6f 6e  erCriticalRegion
bc50: 28 63 72 69 74 69 63 61 6c 52 65 67 69 6f 6e 2c  (criticalRegion,
bc60: 20 6b 44 75 72 61 74 69 6f 6e 46 6f 72 65 76 65   kDurationForeve
bc70: 72 29 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73  r);.#endif.  ass
bc80: 65 72 74 28 20 21 69 6e 4d 75 74 65 78 20 29 3b  ert( !inMutex );
bc90: 0a 20 20 69 6e 4d 75 74 65 78 20 3d 20 31 3b 0a  .  inMutex = 1;.
bca0: 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 4f 73 4c  }.void sqliteOsL
bcb0: 65 61 76 65 4d 75 74 65 78 28 29 7b 0a 20 20 61  eaveMutex(){.  a
bcc0: 73 73 65 72 74 28 20 69 6e 4d 75 74 65 78 20 29  ssert( inMutex )
bcd0: 3b 0a 20 20 69 6e 4d 75 74 65 78 20 3d 20 30 3b  ;.  inMutex = 0;
bce0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 55  .#ifdef SQLITE_U
bcf0: 4e 49 58 5f 54 48 52 45 41 44 53 0a 20 20 70 74  NIX_THREADS.  pt
bd00: 68 72 65 61 64 5f 6d 75 74 65 78 5f 75 6e 6c 6f  hread_mutex_unlo
bd10: 63 6b 28 26 6d 75 74 65 78 29 3b 0a 23 65 6e 64  ck(&mutex);.#end
bd20: 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  if.#ifdef SQLITE
bd30: 5f 57 33 32 5f 54 48 52 45 41 44 53 0a 20 20 4c  _W32_THREADS.  L
bd40: 65 61 76 65 43 72 69 74 69 63 61 6c 53 65 63 74  eaveCriticalSect
bd50: 69 6f 6e 28 26 63 73 29 3b 0a 23 65 6e 64 69 66  ion(&cs);.#endif
bd60: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4d  .#ifdef SQLITE_M
bd70: 41 43 4f 53 5f 4d 55 4c 54 49 54 41 53 4b 49 4e  ACOS_MULTITASKIN
bd80: 47 0a 20 20 4d 50 45 78 69 74 43 72 69 74 69 63  G.  MPExitCritic
bd90: 61 6c 52 65 67 69 6f 6e 28 63 72 69 74 69 63 61  alRegion(critica
bda0: 6c 52 65 67 69 6f 6e 29 3b 0a 23 65 6e 64 69 66  lRegion);.#endif
bdb0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 61  .}../*.** Turn a
bdc0: 20 72 65 6c 61 74 69 76 65 20 70 61 74 68 6e 61   relative pathna
bdd0: 6d 65 20 69 6e 74 6f 20 61 20 66 75 6c 6c 20 70  me into a full p
bde0: 61 74 68 6e 61 6d 65 2e 20 20 52 65 74 75 72 6e  athname.  Return
bdf0: 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f   a pointer.** to
be00: 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61   the full pathna
be10: 6d 65 20 73 74 6f 72 65 64 20 69 6e 20 73 70 61  me stored in spa
be20: 63 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ce obtained from
be30: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 2e   sqliteMalloc().
be40: 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67 20  .** The calling 
be50: 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 73 70  function is resp
be60: 6f 6e 73 69 62 6c 65 20 66 6f 72 20 66 72 65 65  onsible for free
be70: 69 6e 67 20 74 68 69 73 20 73 70 61 63 65 20 6f  ing this space o
be80: 6e 63 65 20 69 74 0a 2a 2a 20 69 73 20 6e 6f 20  nce it.** is no 
be90: 6c 6f 6e 67 65 72 20 6e 65 65 64 65 64 2e 0a 2a  longer needed..*
bea0: 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 4f 73  /.char *sqliteOs
beb0: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 63 6f 6e  FullPathname(con
bec0: 73 74 20 63 68 61 72 20 2a 7a 52 65 6c 61 74 69  st char *zRelati
bed0: 76 65 29 7b 0a 23 69 66 20 4f 53 5f 55 4e 49 58  ve){.#if OS_UNIX
bee0: 0a 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 20 3d  .  char *zFull =
bef0: 20 30 3b 0a 20 20 69 66 28 20 7a 52 65 6c 61 74   0;.  if( zRelat
bf00: 69 76 65 5b 30 5d 3d 3d 27 2f 27 20 29 7b 0a 20  ive[0]=='/' ){. 
bf10: 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69     sqliteSetStri
bf20: 6e 67 28 26 7a 46 75 6c 6c 2c 20 7a 52 65 6c 61  ng(&zFull, zRela
bf30: 74 69 76 65 2c 20 28 63 68 61 72 2a 29 30 29 3b  tive, (char*)0);
bf40: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68  .  }else{.    ch
bf50: 61 72 20 7a 42 75 66 5b 35 30 30 30 5d 3b 0a 20  ar zBuf[5000];. 
bf60: 20 20 20 73 71 6c 69 74 65 53 65 74 53 74 72 69     sqliteSetStri
bf70: 6e 67 28 26 7a 46 75 6c 6c 2c 20 67 65 74 63 77  ng(&zFull, getcw
bf80: 64 28 7a 42 75 66 2c 20 73 69 7a 65 6f 66 28 7a  d(zBuf, sizeof(z
bf90: 42 75 66 29 29 2c 20 22 2f 22 2c 20 7a 52 65 6c  Buf)), "/", zRel
bfa0: 61 74 69 76 65 2c 0a 20 20 20 20 20 20 20 20 20  ative,.         
bfb0: 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
bfc0: 2a 29 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  *)0);.  }.  retu
bfd0: 72 6e 20 7a 46 75 6c 6c 3b 0a 23 65 6e 64 69 66  rn zFull;.#endif
bfe0: 0a 23 69 66 20 4f 53 5f 57 49 4e 0a 20 20 63 68  .#if OS_WIN.  ch
bff0: 61 72 20 2a 7a 4e 6f 74 55 73 65 64 3b 0a 20 20  ar *zNotUsed;.  
c000: 63 68 61 72 20 2a 7a 46 75 6c 6c 3b 0a 20 20 69  char *zFull;.  i
c010: 6e 74 20 6e 42 79 74 65 3b 0a 20 20 6e 42 79 74  nt nByte;.  nByt
c020: 65 20 3d 20 47 65 74 46 75 6c 6c 50 61 74 68 4e  e = GetFullPathN
c030: 61 6d 65 28 7a 52 65 6c 61 74 69 76 65 2c 20 30  ame(zRelative, 0
c040: 2c 20 30 2c 20 26 7a 4e 6f 74 55 73 65 64 29 20  , 0, &zNotUsed) 
c050: 2b 20 31 3b 0a 20 20 7a 46 75 6c 6c 20 3d 20 73  + 1;.  zFull = s
c060: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 6e 42 79  qliteMalloc( nBy
c070: 74 65 20 29 3b 0a 20 20 69 66 28 20 7a 46 75 6c  te );.  if( zFul
c080: 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  l==0 ) return 0;
c090: 0a 20 20 47 65 74 46 75 6c 6c 50 61 74 68 4e 61  .  GetFullPathNa
c0a0: 6d 65 28 7a 52 65 6c 61 74 69 76 65 2c 20 6e 42  me(zRelative, nB
c0b0: 79 74 65 2c 20 7a 46 75 6c 6c 2c 20 26 7a 4e 6f  yte, zFull, &zNo
c0c0: 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e  tUsed);.  return
c0d0: 20 7a 46 75 6c 6c 3b 0a 23 65 6e 64 69 66 0a 23   zFull;.#endif.#
c0e0: 69 66 20 4f 53 5f 4d 41 43 0a 20 20 63 68 61 72  if OS_MAC.  char
c0f0: 20 2a 7a 46 75 6c 6c 20 3d 20 30 3b 0a 20 20 69   *zFull = 0;.  i
c100: 66 28 20 7a 52 65 6c 61 74 69 76 65 5b 30 5d 3d  f( zRelative[0]=
c110: 3d 27 3a 27 20 29 7b 0a 20 20 20 20 63 68 61 72  =':' ){.    char
c120: 20 7a 42 75 66 5b 5f 4d 41 58 5f 50 41 54 48 2b   zBuf[_MAX_PATH+
c130: 31 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 53 65  1];.    sqliteSe
c140: 74 53 74 72 69 6e 67 28 26 7a 46 75 6c 6c 2c 20  tString(&zFull, 
c150: 67 65 74 63 77 64 28 7a 42 75 66 2c 20 73 69 7a  getcwd(zBuf, siz
c160: 65 6f 66 28 7a 42 75 66 29 29 2c 20 26 28 7a 52  eof(zBuf)), &(zR
c170: 65 6c 61 74 69 76 65 5b 31 5d 29 2c 0a 20 20 20  elative[1]),.   
c180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c190: 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 7d 65   (char*)0);.  }e
c1a0: 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 73 74 72  lse{.    if( str
c1b0: 63 68 72 28 7a 52 65 6c 61 74 69 76 65 2c 20 27  chr(zRelative, '
c1c0: 3a 27 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  :') ){.      sql
c1d0: 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 7a 46  iteSetString(&zF
c1e0: 75 6c 6c 2c 20 7a 52 65 6c 61 74 69 76 65 2c 20  ull, zRelative, 
c1f0: 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 7d  (char*)0);.    }
c200: 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 7a  else{.    char z
c210: 42 75 66 5b 5f 4d 41 58 5f 50 41 54 48 2b 31 5d  Buf[_MAX_PATH+1]
c220: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 53 65  ;.      sqliteSe
c230: 74 53 74 72 69 6e 67 28 26 7a 46 75 6c 6c 2c 20  tString(&zFull, 
c240: 67 65 74 63 77 64 28 7a 42 75 66 2c 20 73 69 7a  getcwd(zBuf, siz
c250: 65 6f 66 28 7a 42 75 66 29 29 2c 20 7a 52 65 6c  eof(zBuf)), zRel
c260: 61 74 69 76 65 2c 20 28 63 68 61 72 2a 29 30 29  ative, (char*)0)
c270: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
c280: 74 75 72 6e 20 7a 46 75 6c 6c 3b 0a 23 65 6e 64  turn zFull;.#end
c290: 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  if.}../*.** The 
c2a0: 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62  following variab
c2b0: 6c 65 2c 20 69 66 20 73 65 74 20 74 6f 20 61 20  le, if set to a 
c2c0: 6e 6f 77 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20  now-zero value, 
c2d0: 62 65 63 6f 6d 65 20 74 68 65 20 72 65 73 75 6c  become the resul
c2e0: 74 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 66 72  t.** returned fr
c2f0: 6f 6d 20 73 71 6c 69 74 65 4f 73 43 75 72 72 65  om sqliteOsCurre
c300: 6e 74 54 69 6d 65 28 29 2e 20 20 54 68 69 73 20  ntTime().  This 
c310: 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74  is used for test
c320: 69 6e 67 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ing..*/.#ifdef S
c330: 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73  QLITE_TEST.int s
c340: 71 6c 69 74 65 5f 63 75 72 72 65 6e 74 5f 74 69  qlite_current_ti
c350: 6d 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  me = 0;.#endif..
c360: 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 63  /*.** Find the c
c370: 75 72 72 65 6e 74 20 74 69 6d 65 20 28 69 6e 20  urrent time (in 
c380: 55 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72 64 69  Universal Coordi
c390: 6e 61 74 65 64 20 54 69 6d 65 29 2e 20 20 57 72  nated Time).  Wr
c3a0: 69 74 65 20 74 68 65 0a 2a 2a 20 63 75 72 72 65  ite the.** curre
c3b0: 6e 74 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65  nt time and date
c3c0: 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61 79   as a Julian Day
c3d0: 20 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70 72   number into *pr
c3e0: 4e 6f 77 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72  Now and.** retur
c3f0: 6e 20 30 2e 20 20 52 65 74 75 72 6e 20 31 20 69  n 0.  Return 1 i
c400: 66 20 74 68 65 20 74 69 6d 65 20 61 6e 64 20 64  f the time and d
c410: 61 74 65 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f  ate cannot be fo
c420: 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  und..*/.int sqli
c430: 74 65 4f 73 43 75 72 72 65 6e 74 54 69 6d 65 28  teOsCurrentTime(
c440: 64 6f 75 62 6c 65 20 2a 70 72 4e 6f 77 29 7b 0a  double *prNow){.
c450: 23 69 66 20 4f 53 5f 55 4e 49 58 0a 20 20 74 69  #if OS_UNIX.  ti
c460: 6d 65 5f 74 20 74 3b 0a 20 20 74 69 6d 65 28 26  me_t t;.  time(&
c470: 74 29 3b 0a 20 20 2a 70 72 4e 6f 77 20 3d 20 74  t);.  *prNow = t
c480: 2f 38 36 34 30 30 2e 30 20 2b 20 32 34 34 30 35  /86400.0 + 24405
c490: 38 37 2e 35 3b 0a 23 65 6e 64 69 66 0a 23 69 66  87.5;.#endif.#if
c4a0: 20 4f 53 5f 57 49 4e 0a 20 20 46 49 4c 45 54 49   OS_WIN.  FILETI
c4b0: 4d 45 20 66 74 3b 0a 20 20 2f 2a 20 46 49 4c 45  ME ft;.  /* FILE
c4c0: 54 49 4d 45 20 73 74 72 75 63 74 75 72 65 20 69  TIME structure i
c4d0: 73 20 61 20 36 34 2d 62 69 74 20 76 61 6c 75 65  s a 64-bit value
c4e0: 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20 74 68   representing th
c4f0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 0a 20 20 20  e number of .   
c500: 20 20 31 30 30 2d 6e 61 6e 6f 73 65 63 6f 6e 64    100-nanosecond
c510: 20 69 6e 74 65 72 76 61 6c 73 20 73 69 6e 63 65   intervals since
c520: 20 4a 61 6e 75 61 72 79 20 31 2c 20 31 36 30 31   January 1, 1601
c530: 20 28 3d 20 4a 44 20 32 33 30 35 38 31 33 2e 35   (= JD 2305813.5
c540: 29 2e 20 0a 20 20 2a 2f 0a 20 20 64 6f 75 62 6c  ). .  */.  doubl
c550: 65 20 6e 6f 77 3b 0a 20 20 47 65 74 53 79 73 74  e now;.  GetSyst
c560: 65 6d 54 69 6d 65 41 73 46 69 6c 65 54 69 6d 65  emTimeAsFileTime
c570: 28 20 26 66 74 20 29 3b 0a 20 20 6e 6f 77 20 3d  ( &ft );.  now =
c580: 20 28 28 64 6f 75 62 6c 65 29 66 74 2e 64 77 48   ((double)ft.dwH
c590: 69 67 68 44 61 74 65 54 69 6d 65 29 20 2a 20 34  ighDateTime) * 4
c5a0: 32 39 34 39 36 37 32 39 36 2e 30 3b 20 0a 20 20  294967296.0; .  
c5b0: 2a 70 72 4e 6f 77 20 3d 20 28 6e 6f 77 20 2b 20  *prNow = (now + 
c5c0: 66 74 2e 64 77 4c 6f 77 44 61 74 65 54 69 6d 65  ft.dwLowDateTime
c5d0: 29 2f 38 36 34 30 30 30 30 30 30 30 30 30 2e 30  )/864000000000.0
c5e0: 20 2b 20 32 33 30 35 38 31 33 2e 35 3b 0a 23 65   + 2305813.5;.#e
c5f0: 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
c600: 54 45 5f 54 45 53 54 0a 20 20 69 66 28 20 73 71  TE_TEST.  if( sq
c610: 6c 69 74 65 5f 63 75 72 72 65 6e 74 5f 74 69 6d  lite_current_tim
c620: 65 20 29 7b 0a 20 20 20 20 2a 70 72 4e 6f 77 20  e ){.    *prNow 
c630: 3d 20 73 71 6c 69 74 65 5f 63 75 72 72 65 6e 74  = sqlite_current
c640: 5f 74 69 6d 65 2f 38 36 34 30 30 2e 30 20 2b 20  _time/86400.0 + 
c650: 32 34 34 30 35 38 37 2e 35 3b 0a 20 20 7d 0a 23  2440587.5;.  }.#
c660: 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 30  endif.  return 0
c670: 3b 0a 7d 0a                                      ;.}.