/ Hex Artifact Content
Login

Artifact 5f11382733805d4529ec2a30800e117f30995ea8:


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 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  c unsigned char 
5b50: 7a 43 68 61 72 73 5b 5d 20 3d 0a 20 20 20 20 22  zChars[] =.    "
5b60: 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70  abcdefghijklmnop
5b70: 71 72 73 74 75 76 77 78 79 7a 22 0a 20 20 20 20  qrstuvwxyz".    
5b80: 22 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f  "ABCDEFGHIJKLMNO
5b90: 50 51 52 53 54 55 56 57 58 59 5a 22 0a 20 20 20  PQRSTUVWXYZ".   
5ba0: 20 22 30 31 32 33 34 35 36 37 38 39 22 3b 0a 20   "0123456789";. 
5bb0: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 74 72   int i, j;.  str
5bc0: 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20  uct stat buf;.  
5bd0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 69 72  const char *zDir
5be0: 20 3d 20 22 2e 22 3b 0a 20 20 66 6f 72 28 69 3d   = ".";.  for(i=
5bf0: 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 7a 44 69  0; i<sizeof(azDi
5c00: 72 73 29 2f 73 69 7a 65 6f 66 28 61 7a 44 69 72  rs)/sizeof(azDir
5c10: 73 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  s[0]); i++){.   
5c20: 20 69 66 28 20 73 74 61 74 28 61 7a 44 69 72 73   if( stat(azDirs
5c30: 5b 69 5d 2c 20 26 62 75 66 29 20 29 20 63 6f 6e  [i], &buf) ) con
5c40: 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 21  tinue;.    if( !
5c50: 53 5f 49 53 44 49 52 28 62 75 66 2e 73 74 5f 6d  S_ISDIR(buf.st_m
5c60: 6f 64 65 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ode) ) continue;
5c70: 0a 20 20 20 20 69 66 28 20 61 63 63 65 73 73 28  .    if( access(
5c80: 61 7a 44 69 72 73 5b 69 5d 2c 20 30 37 29 20 29  azDirs[i], 07) )
5c90: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7a   continue;.    z
5ca0: 44 69 72 20 3d 20 61 7a 44 69 72 73 5b 69 5d 3b  Dir = azDirs[i];
5cb0: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
5cc0: 20 20 64 6f 7b 0a 20 20 20 20 73 70 72 69 6e 74    do{.    sprint
5cd0: 66 28 7a 42 75 66 2c 20 22 25 73 2f 22 54 45 4d  f(zBuf, "%s/"TEM
5ce0: 50 5f 46 49 4c 45 5f 50 52 45 46 49 58 2c 20 7a  P_FILE_PREFIX, z
5cf0: 44 69 72 29 3b 0a 20 20 20 20 6a 20 3d 20 73 74  Dir);.    j = st
5d00: 72 6c 65 6e 28 7a 42 75 66 29 3b 0a 20 20 20 20  rlen(zBuf);.    
5d10: 73 71 6c 69 74 65 52 61 6e 64 6f 6d 6e 65 73 73  sqliteRandomness
5d20: 28 31 35 2c 20 26 7a 42 75 66 5b 6a 5d 29 3b 0a  (15, &zBuf[j]);.
5d30: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31      for(i=0; i<1
5d40: 35 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20  5; i++, j++){.  
5d50: 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 28 63      zBuf[j] = (c
5d60: 68 61 72 29 7a 43 68 61 72 73 5b 20 28 28 75 6e  har)zChars[ ((un
5d70: 73 69 67 6e 65 64 20 63 68 61 72 29 7a 42 75 66  signed char)zBuf
5d80: 5b 6a 5d 29 25 28 73 69 7a 65 6f 66 28 7a 43 68  [j])%(sizeof(zCh
5d90: 61 72 73 29 2d 31 29 20 5d 3b 0a 20 20 20 20 7d  ars)-1) ];.    }
5da0: 0a 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 30  .    zBuf[j] = 0
5db0: 3b 0a 20 20 7d 77 68 69 6c 65 28 20 61 63 63 65  ;.  }while( acce
5dc0: 73 73 28 7a 42 75 66 2c 30 29 3d 3d 30 20 29 3b  ss(zBuf,0)==0 );
5dd0: 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f 53 5f 57  .#endif.#if OS_W
5de0: 49 4e 0a 20 20 73 74 61 74 69 63 20 63 68 61 72  IN.  static char
5df0: 20 7a 43 68 61 72 73 5b 5d 20 3d 0a 20 20 20 20   zChars[] =.    
5e00: 22 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f  "abcdefghijklmno
5e10: 70 71 72 73 74 75 76 77 78 79 7a 22 0a 20 20 20  pqrstuvwxyz".   
5e20: 20 22 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e   "ABCDEFGHIJKLMN
5e30: 4f 50 51 52 53 54 55 56 57 58 59 5a 22 0a 20 20  OPQRSTUVWXYZ".  
5e40: 20 20 22 30 31 32 33 34 35 36 37 38 39 22 3b 0a    "0123456789";.
5e50: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 63 68    int i, j;.  ch
5e60: 61 72 20 7a 54 65 6d 70 50 61 74 68 5b 53 51 4c  ar zTempPath[SQL
5e70: 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a  ITE_TEMPNAME_SIZ
5e80: 45 5d 3b 0a 20 20 47 65 74 54 65 6d 70 50 61 74  E];.  GetTempPat
5e90: 68 28 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d  h(SQLITE_TEMPNAM
5ea0: 45 5f 53 49 5a 45 2d 33 30 2c 20 7a 54 65 6d 70  E_SIZE-30, zTemp
5eb0: 50 61 74 68 29 3b 0a 20 20 66 6f 72 28 69 3d 73  Path);.  for(i=s
5ec0: 74 72 6c 65 6e 28 7a 54 65 6d 70 50 61 74 68 29  trlen(zTempPath)
5ed0: 3b 20 69 3e 30 20 26 26 20 7a 54 65 6d 70 50 61  ; i>0 && zTempPa
5ee0: 74 68 5b 69 2d 31 5d 3d 3d 27 5c 5c 27 3b 20 69  th[i-1]=='\\'; i
5ef0: 2d 2d 29 7b 7d 0a 20 20 7a 54 65 6d 70 50 61 74  --){}.  zTempPat
5f00: 68 5b 69 5d 20 3d 20 30 3b 0a 20 20 66 6f 72 28  h[i] = 0;.  for(
5f10: 3b 3b 29 7b 0a 20 20 20 20 73 70 72 69 6e 74 66  ;;){.    sprintf
5f20: 28 7a 42 75 66 2c 20 22 25 73 5c 5c 22 54 45 4d  (zBuf, "%s\\"TEM
5f30: 50 5f 46 49 4c 45 5f 50 52 45 46 49 58 2c 20 7a  P_FILE_PREFIX, z
5f40: 54 65 6d 70 50 61 74 68 29 3b 0a 20 20 20 20 6a  TempPath);.    j
5f50: 20 3d 20 73 74 72 6c 65 6e 28 7a 42 75 66 29 3b   = strlen(zBuf);
5f60: 0a 20 20 20 20 73 71 6c 69 74 65 52 61 6e 64 6f  .    sqliteRando
5f70: 6d 6e 65 73 73 28 31 35 2c 20 26 7a 42 75 66 5b  mness(15, &zBuf[
5f80: 6a 5d 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  j]);.    for(i=0
5f90: 3b 20 69 3c 31 35 3b 20 69 2b 2b 2c 20 6a 2b 2b  ; i<15; i++, j++
5fa0: 29 7b 0a 20 20 20 20 20 20 7a 42 75 66 5b 6a 5d  ){.      zBuf[j]
5fb0: 20 3d 20 28 63 68 61 72 29 7a 43 68 61 72 73 5b   = (char)zChars[
5fc0: 20 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72   ((unsigned char
5fd0: 29 7a 42 75 66 5b 6a 5d 29 25 28 73 69 7a 65 6f  )zBuf[j])%(sizeo
5fe0: 66 28 7a 43 68 61 72 73 29 2d 31 29 20 5d 3b 0a  f(zChars)-1) ];.
5ff0: 20 20 20 20 7d 0a 20 20 20 20 7a 42 75 66 5b 6a      }.    zBuf[j
6000: 5d 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 21  ] = 0;.    if( !
6010: 73 71 6c 69 74 65 4f 73 46 69 6c 65 45 78 69 73  sqliteOsFileExis
6020: 74 73 28 7a 42 75 66 29 20 29 20 62 72 65 61 6b  ts(zBuf) ) break
6030: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66  ;.  }.#endif.#if
6040: 20 4f 53 5f 4d 41 43 0a 20 20 73 74 61 74 69 63   OS_MAC.  static
6050: 20 63 68 61 72 20 7a 43 68 61 72 73 5b 5d 20 3d   char zChars[] =
6060: 0a 20 20 20 20 22 61 62 63 64 65 66 67 68 69 6a  .    "abcdefghij
6070: 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a  klmnopqrstuvwxyz
6080: 22 0a 20 20 20 20 22 41 42 43 44 45 46 47 48 49  ".    "ABCDEFGHI
6090: 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59  JKLMNOPQRSTUVWXY
60a0: 5a 22 0a 20 20 20 20 22 30 31 32 33 34 35 36 37  Z".    "01234567
60b0: 38 39 22 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  89";.  int i, j;
60c0: 0a 20 20 63 68 61 72 20 7a 54 65 6d 70 50 61 74  .  char zTempPat
60d0: 68 5b 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d  h[SQLITE_TEMPNAM
60e0: 45 5f 53 49 5a 45 5d 3b 0a 20 20 63 68 61 72 20  E_SIZE];.  char 
60f0: 7a 64 69 72 4e 61 6d 65 5b 33 32 5d 3b 0a 20 20  zdirName[32];.  
6100: 43 49 6e 66 6f 50 42 52 65 63 20 69 6e 66 6f 52  CInfoPBRec infoR
6110: 65 63 3b 0a 20 20 53 74 72 33 31 20 64 69 72 4e  ec;.  Str31 dirN
6120: 61 6d 65 3b 0a 20 20 6d 65 6d 73 65 74 28 26 69  ame;.  memset(&i
6130: 6e 66 6f 52 65 63 2c 20 30 2c 20 73 69 7a 65 6f  nfoRec, 0, sizeo
6140: 66 28 69 6e 66 6f 52 65 63 29 29 3b 0a 20 20 6d  f(infoRec));.  m
6150: 65 6d 73 65 74 28 7a 54 65 6d 70 50 61 74 68 2c  emset(zTempPath,
6160: 20 30 2c 20 53 51 4c 49 54 45 5f 54 45 4d 50 4e   0, SQLITE_TEMPN
6170: 41 4d 45 5f 53 49 5a 45 29 3b 0a 20 20 69 66 28  AME_SIZE);.  if(
6180: 20 46 69 6e 64 46 6f 6c 64 65 72 28 6b 4f 6e 53   FindFolder(kOnS
6190: 79 73 74 65 6d 44 69 73 6b 2c 20 6b 54 65 6d 70  ystemDisk, kTemp
61a0: 6f 72 61 72 79 46 6f 6c 64 65 72 54 79 70 65 2c  oraryFolderType,
61b0: 20 20 6b 43 72 65 61 74 65 46 6f 6c 64 65 72 2c    kCreateFolder,
61c0: 0a 20 20 20 20 20 20 20 26 28 69 6e 66 6f 52 65  .       &(infoRe
61d0: 63 2e 64 69 72 49 6e 66 6f 2e 69 6f 56 52 65 66  c.dirInfo.ioVRef
61e0: 4e 75 6d 29 2c 20 26 28 69 6e 66 6f 52 65 63 2e  Num), &(infoRec.
61f0: 64 69 72 49 6e 66 6f 2e 69 6f 44 72 50 61 72 49  dirInfo.ioDrParI
6200: 44 29 29 20 3d 3d 20 6e 6f 45 72 72 20 29 7b 0a  D)) == noErr ){.
6210: 20 20 20 20 69 6e 66 6f 52 65 63 2e 64 69 72 49      infoRec.dirI
6220: 6e 66 6f 2e 69 6f 4e 61 6d 65 50 74 72 20 3d 20  nfo.ioNamePtr = 
6230: 64 69 72 4e 61 6d 65 3b 0a 20 20 20 20 64 6f 7b  dirName;.    do{
6240: 0a 20 20 20 20 20 20 69 6e 66 6f 52 65 63 2e 64  .      infoRec.d
6250: 69 72 49 6e 66 6f 2e 69 6f 46 44 69 72 49 6e 64  irInfo.ioFDirInd
6260: 65 78 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 69  ex = -1;.      i
6270: 6e 66 6f 52 65 63 2e 64 69 72 49 6e 66 6f 2e 69  nfoRec.dirInfo.i
6280: 6f 44 72 44 69 72 49 44 20 3d 20 69 6e 66 6f 52  oDrDirID = infoR
6290: 65 63 2e 64 69 72 49 6e 66 6f 2e 69 6f 44 72 50  ec.dirInfo.ioDrP
62a0: 61 72 49 44 3b 0a 20 20 20 20 20 20 69 66 28 20  arID;.      if( 
62b0: 50 42 47 65 74 43 61 74 49 6e 66 6f 53 79 6e 63  PBGetCatInfoSync
62c0: 28 26 69 6e 66 6f 52 65 63 29 20 3d 3d 20 6e 6f  (&infoRec) == no
62d0: 45 72 72 20 29 7b 0a 20 20 20 20 20 20 20 20 43  Err ){.        C
62e0: 6f 70 79 50 61 73 63 61 6c 53 74 72 69 6e 67 54  opyPascalStringT
62f0: 6f 43 28 64 69 72 4e 61 6d 65 2c 20 7a 64 69 72  oC(dirName, zdir
6300: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Name);.        i
6310: 20 3d 20 73 74 72 6c 65 6e 28 7a 64 69 72 4e 61   = strlen(zdirNa
6320: 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  me);.        mem
6330: 6d 6f 76 65 28 26 28 7a 54 65 6d 70 50 61 74 68  move(&(zTempPath
6340: 5b 69 2b 31 5d 29 2c 20 7a 54 65 6d 70 50 61 74  [i+1]), zTempPat
6350: 68 2c 20 73 74 72 6c 65 6e 28 7a 54 65 6d 70 50  h, strlen(zTempP
6360: 61 74 68 29 29 3b 0a 20 20 20 20 20 20 20 20 73  ath));.        s
6370: 74 72 63 70 79 28 7a 54 65 6d 70 50 61 74 68 2c  trcpy(zTempPath,
6380: 20 7a 64 69 72 4e 61 6d 65 29 3b 0a 20 20 20 20   zdirName);.    
6390: 20 20 20 20 7a 54 65 6d 70 50 61 74 68 5b 69 5d      zTempPath[i]
63a0: 20 3d 20 27 3a 27 3b 0a 20 20 20 20 20 20 7d 65   = ':';.      }e
63b0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2a 7a 54  lse{.        *zT
63c0: 65 6d 70 50 61 74 68 20 3d 20 30 3b 0a 20 20 20  empPath = 0;.   
63d0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
63e0: 20 20 7d 0a 20 20 20 20 7d 20 77 68 69 6c 65 28    }.    } while(
63f0: 20 69 6e 66 6f 52 65 63 2e 64 69 72 49 6e 66 6f   infoRec.dirInfo
6400: 2e 69 6f 44 72 44 69 72 49 44 20 21 3d 20 66 73  .ioDrDirID != fs
6410: 52 74 44 69 72 49 44 20 29 3b 0a 20 20 7d 0a 20  RtDirID );.  }. 
6420: 20 69 66 28 20 2a 7a 54 65 6d 70 50 61 74 68 20   if( *zTempPath 
6430: 3d 3d 20 30 20 29 0a 20 20 20 20 67 65 74 63 77  == 0 ).    getcw
6440: 64 28 7a 54 65 6d 70 50 61 74 68 2c 20 53 51 4c  d(zTempPath, SQL
6450: 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a  ITE_TEMPNAME_SIZ
6460: 45 2d 32 34 29 3b 0a 20 20 66 6f 72 28 3b 3b 29  E-24);.  for(;;)
6470: 7b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42  {.    sprintf(zB
6480: 75 66 2c 20 22 25 73 22 54 45 4d 50 5f 46 49 4c  uf, "%s"TEMP_FIL
6490: 45 5f 50 52 45 46 49 58 2c 20 7a 54 65 6d 70 50  E_PREFIX, zTempP
64a0: 61 74 68 29 3b 0a 20 20 20 20 6a 20 3d 20 73 74  ath);.    j = st
64b0: 72 6c 65 6e 28 7a 42 75 66 29 3b 0a 20 20 20 20  rlen(zBuf);.    
64c0: 73 71 6c 69 74 65 52 61 6e 64 6f 6d 6e 65 73 73  sqliteRandomness
64d0: 28 31 35 2c 20 26 7a 42 75 66 5b 6a 5d 29 3b 0a  (15, &zBuf[j]);.
64e0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31      for(i=0; i<1
64f0: 35 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20  5; i++, j++){.  
6500: 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 28 63      zBuf[j] = (c
6510: 68 61 72 29 7a 43 68 61 72 73 5b 20 28 28 75 6e  har)zChars[ ((un
6520: 73 69 67 6e 65 64 20 63 68 61 72 29 7a 42 75 66  signed char)zBuf
6530: 5b 6a 5d 29 25 28 73 69 7a 65 6f 66 28 7a 43 68  [j])%(sizeof(zCh
6540: 61 72 73 29 2d 31 29 20 5d 3b 0a 20 20 20 20 7d  ars)-1) ];.    }
6550: 0a 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 30  .    zBuf[j] = 0
6560: 3b 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69 74  ;.    if( !sqlit
6570: 65 4f 73 46 69 6c 65 45 78 69 73 74 73 28 7a 42  eOsFileExists(zB
6580: 75 66 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  uf) ) break;.  }
6590: 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
65a0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 0a 7d 0a 0a   SQLITE_OK; .}..
65b0: 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69  /*.** Close a fi
65c0: 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  le..*/.int sqlit
65d0: 65 4f 73 43 6c 6f 73 65 28 4f 73 46 69 6c 65 20  eOsClose(OsFile 
65e0: 2a 69 64 29 7b 0a 23 69 66 20 4f 53 5f 55 4e 49  *id){.#if OS_UNI
65f0: 58 0a 20 20 73 71 6c 69 74 65 4f 73 55 6e 6c 6f  X.  sqliteOsUnlo
6600: 63 6b 28 69 64 29 3b 0a 20 20 69 66 28 20 69 64  ck(id);.  if( id
6610: 2d 3e 64 69 72 66 64 3e 3d 30 20 29 20 63 6c 6f  ->dirfd>=0 ) clo
6620: 73 65 28 69 64 2d 3e 64 69 72 66 64 29 3b 0a 20  se(id->dirfd);. 
6630: 20 69 64 2d 3e 64 69 72 66 64 20 3d 20 2d 31 3b   id->dirfd = -1;
6640: 0a 20 20 73 71 6c 69 74 65 4f 73 45 6e 74 65 72  .  sqliteOsEnter
6650: 4d 75 74 65 78 28 29 3b 0a 20 20 69 66 28 20 69  Mutex();.  if( i
6660: 64 2d 3e 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 20  d->pOpen->nLock 
6670: 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ){.    /* If the
6680: 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69  re are outstandi
6690: 6e 67 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74  ng locks, do not
66a0: 20 61 63 74 75 61 6c 6c 79 20 63 6c 6f 73 65 20   actually close 
66b0: 74 68 65 20 66 69 6c 65 20 6a 75 73 74 0a 20 20  the file just.  
66c0: 20 20 2a 2a 20 79 65 74 20 62 65 63 61 75 73 65    ** yet because
66d0: 20 74 68 61 74 20 77 6f 75 6c 64 20 63 6c 65 61   that would clea
66e0: 72 20 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 20  r those locks.  
66f0: 49 6e 73 74 65 61 64 2c 20 61 64 64 20 74 68 65  Instead, add the
6700: 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 64 65 73   file.    ** des
6710: 63 72 69 70 74 6f 72 20 74 6f 20 70 4f 70 65 6e  criptor to pOpen
6720: 2d 3e 61 50 65 6e 64 69 6e 67 2e 20 20 49 74 20  ->aPending.  It 
6730: 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74 69  will be automati
6740: 63 61 6c 6c 79 20 63 6c 6f 73 65 64 20 77 68 65  cally closed whe
6750: 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 61 73  n.    ** the las
6760: 74 20 6c 6f 63 6b 20 69 73 20 63 6c 65 61 72 65  t lock is cleare
6770: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e  d..    */.    in
6780: 74 20 2a 61 4e 65 77 3b 0a 20 20 20 20 73 74 72  t *aNew;.    str
6790: 75 63 74 20 6f 70 65 6e 43 6e 74 20 2a 70 4f 70  uct openCnt *pOp
67a0: 65 6e 20 3d 20 69 64 2d 3e 70 4f 70 65 6e 3b 0a  en = id->pOpen;.
67b0: 20 20 20 20 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64      pOpen->nPend
67c0: 69 6e 67 2b 2b 3b 0a 20 20 20 20 61 4e 65 77 20  ing++;.    aNew 
67d0: 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28  = sqliteRealloc(
67e0: 20 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67   pOpen->aPending
67f0: 2c 20 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e  , pOpen->nPendin
6800: 67 2a 73 69 7a 65 6f 66 28 69 6e 74 29 20 29 3b  g*sizeof(int) );
6810: 0a 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30  .    if( aNew==0
6820: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
6830: 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 2c 20  a malloc fails, 
6840: 6a 75 73 74 20 6c 65 61 6b 20 74 68 65 20 66 69  just leak the fi
6850: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f  le descriptor */
6860: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
6870: 20 20 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e    pOpen->aPendin
6880: 67 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20 20 20  g = aNew;.      
6890: 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e 67 5b  pOpen->aPending[
68a0: 70 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67 2d  pOpen->nPending-
68b0: 31 5d 20 3d 20 69 64 2d 3e 66 64 3b 0a 20 20 20  1] = id->fd;.   
68c0: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
68d0: 2f 2a 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20  /* There are no 
68e0: 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b  outstanding lock
68f0: 73 20 73 6f 20 77 65 20 63 61 6e 20 63 6c 6f 73  s so we can clos
6900: 65 20 74 68 65 20 66 69 6c 65 20 69 6d 6d 65 64  e the file immed
6910: 69 61 74 65 6c 79 20 2a 2f 0a 20 20 20 20 63 6c  iately */.    cl
6920: 6f 73 65 28 69 64 2d 3e 66 64 29 3b 0a 20 20 7d  ose(id->fd);.  }
6930: 0a 20 20 72 65 6c 65 61 73 65 4c 6f 63 6b 49 6e  .  releaseLockIn
6940: 66 6f 28 69 64 2d 3e 70 4c 6f 63 6b 29 3b 0a 20  fo(id->pLock);. 
6950: 20 72 65 6c 65 61 73 65 4f 70 65 6e 43 6e 74 28   releaseOpenCnt(
6960: 69 64 2d 3e 70 4f 70 65 6e 29 3b 0a 20 20 73 71  id->pOpen);.  sq
6970: 6c 69 74 65 4f 73 4c 65 61 76 65 4d 75 74 65 78  liteOsLeaveMutex
6980: 28 29 3b 0a 20 20 54 52 41 43 45 32 28 22 43 4c  ();.  TRACE2("CL
6990: 4f 53 45 20 20 20 25 2d 33 64 5c 6e 22 2c 20 69  OSE   %-3d\n", i
69a0: 64 2d 3e 66 64 29 3b 0a 20 20 4f 70 65 6e 43 6f  d->fd);.  OpenCo
69b0: 75 6e 74 65 72 28 2d 31 29 3b 0a 20 20 72 65 74  unter(-1);.  ret
69c0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23  urn SQLITE_OK;.#
69d0: 65 6e 64 69 66 0a 23 69 66 20 4f 53 5f 57 49 4e  endif.#if OS_WIN
69e0: 0a 20 20 43 6c 6f 73 65 48 61 6e 64 6c 65 28 69  .  CloseHandle(i
69f0: 64 2d 3e 68 29 3b 0a 20 20 4f 70 65 6e 43 6f 75  d->h);.  OpenCou
6a00: 6e 74 65 72 28 2d 31 29 3b 0a 20 20 72 65 74 75  nter(-1);.  retu
6a10: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65  rn SQLITE_OK;.#e
6a20: 6e 64 69 66 0a 23 69 66 20 4f 53 5f 4d 41 43 0a  ndif.#if OS_MAC.
6a30: 20 20 69 66 28 20 69 64 2d 3e 72 65 66 4e 75 6d    if( id->refNum
6a40: 52 46 21 3d 2d 31 20 29 0a 20 20 20 20 46 53 43  RF!=-1 ).    FSC
6a50: 6c 6f 73 65 28 69 64 2d 3e 72 65 66 4e 75 6d 52  lose(id->refNumR
6a60: 46 29 3b 0a 23 20 69 66 64 65 66 20 5f 4c 41 52  F);.# ifdef _LAR
6a70: 47 45 5f 46 49 4c 45 0a 20 20 46 53 43 6c 6f 73  GE_FILE.  FSClos
6a80: 65 46 6f 72 6b 28 69 64 2d 3e 72 65 66 4e 75 6d  eFork(id->refNum
6a90: 29 3b 0a 23 20 65 6c 73 65 0a 20 20 46 53 43 6c  );.# else.  FSCl
6aa0: 6f 73 65 28 69 64 2d 3e 72 65 66 4e 75 6d 29 3b  ose(id->refNum);
6ab0: 0a 23 20 65 6e 64 69 66 0a 20 20 69 66 28 20 69  .# endif.  if( i
6ac0: 64 2d 3e 64 65 6c 4f 6e 43 6c 6f 73 65 20 29 7b  d->delOnClose ){
6ad0: 0a 20 20 20 20 75 6e 6c 69 6e 6b 28 69 64 2d 3e  .    unlink(id->
6ae0: 70 61 74 68 54 6f 44 65 6c 29 3b 0a 20 20 20 20  pathToDel);.    
6af0: 73 71 6c 69 74 65 46 72 65 65 28 69 64 2d 3e 70  sqliteFree(id->p
6b00: 61 74 68 54 6f 44 65 6c 29 3b 0a 20 20 7d 0a 20  athToDel);.  }. 
6b10: 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2d 31 29   OpenCounter(-1)
6b20: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
6b30: 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  E_OK;.#endif.}..
6b40: 2f 2a 0a 2a 2a 20 52 65 61 64 20 64 61 74 61 20  /*.** Read data 
6b50: 66 72 6f 6d 20 61 20 66 69 6c 65 20 69 6e 74 6f  from a file into
6b60: 20 61 20 62 75 66 66 65 72 2e 20 20 52 65 74 75   a buffer.  Retu
6b70: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  rn SQLITE_OK if 
6b80: 61 6c 6c 0a 2a 2a 20 62 79 74 65 73 20 77 65 72  all.** bytes wer
6b90: 65 20 72 65 61 64 20 73 75 63 63 65 73 73 66 75  e read successfu
6ba0: 6c 6c 79 20 61 6e 64 20 53 51 4c 49 54 45 5f 49  lly and SQLITE_I
6bb0: 4f 45 52 52 20 69 66 20 61 6e 79 74 68 69 6e 67  OERR if anything
6bc0: 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 0a   goes.** wrong..
6bd0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 4f 73 52  */.int sqliteOsR
6be0: 65 61 64 28 4f 73 46 69 6c 65 20 2a 69 64 2c 20  ead(OsFile *id, 
6bf0: 76 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e 74 20  void *pBuf, int 
6c00: 61 6d 74 29 7b 0a 23 69 66 20 4f 53 5f 55 4e 49  amt){.#if OS_UNI
6c10: 58 0a 20 20 69 6e 74 20 67 6f 74 3b 0a 20 20 53  X.  int got;.  S
6c20: 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 53  imulateIOError(S
6c30: 51 4c 49 54 45 5f 49 4f 45 52 52 29 3b 0a 20 20  QLITE_IOERR);.  
6c40: 54 49 4d 45 52 5f 53 54 41 52 54 3b 0a 20 20 67  TIMER_START;.  g
6c50: 6f 74 20 3d 20 72 65 61 64 28 69 64 2d 3e 66 64  ot = read(id->fd
6c60: 2c 20 70 42 75 66 2c 20 61 6d 74 29 3b 0a 20 20  , pBuf, amt);.  
6c70: 54 49 4d 45 52 5f 45 4e 44 3b 0a 20 20 54 52 41  TIMER_END;.  TRA
6c80: 43 45 34 28 22 52 45 41 44 20 20 20 20 25 2d 33  CE4("READ    %-3
6c90: 64 20 25 37 64 20 25 64 5c 6e 22 2c 20 69 64 2d  d %7d %d\n", id-
6ca0: 3e 66 64 2c 20 6c 61 73 74 5f 70 61 67 65 2c 20  >fd, last_page, 
6cb0: 65 6c 61 70 73 65 29 3b 0a 20 20 53 45 45 4b 28  elapse);.  SEEK(
6cc0: 30 29 3b 0a 20 20 2f 2a 20 69 66 28 20 67 6f 74  0);.  /* if( got
6cd0: 3c 30 20 29 20 67 6f 74 20 3d 20 30 3b 20 2a 2f  <0 ) got = 0; */
6ce0: 0a 20 20 69 66 28 20 67 6f 74 3d 3d 61 6d 74 20  .  if( got==amt 
6cf0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
6d00: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
6d10: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
6d20: 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 7d 0a 23  ITE_IOERR;.  }.#
6d30: 65 6e 64 69 66 0a 23 69 66 20 4f 53 5f 57 49 4e  endif.#if OS_WIN
6d40: 0a 20 20 44 57 4f 52 44 20 67 6f 74 3b 0a 20 20  .  DWORD got;.  
6d50: 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
6d60: 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 3b 0a 20  SQLITE_IOERR);. 
6d70: 20 54 52 41 43 45 32 28 22 52 45 41 44 20 25 64   TRACE2("READ %d
6d80: 5c 6e 22 2c 20 6c 61 73 74 5f 70 61 67 65 29 3b  \n", last_page);
6d90: 0a 20 20 69 66 28 20 21 52 65 61 64 46 69 6c 65  .  if( !ReadFile
6da0: 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 61 6d  (id->h, pBuf, am
6db0: 74 2c 20 26 67 6f 74 2c 20 30 29 20 29 7b 0a 20  t, &got, 0) ){. 
6dc0: 20 20 20 67 6f 74 20 3d 20 30 3b 0a 20 20 7d 0a     got = 0;.  }.
6dd0: 20 20 69 66 28 20 67 6f 74 3d 3d 28 44 57 4f 52    if( got==(DWOR
6de0: 44 29 61 6d 74 20 29 7b 0a 20 20 20 20 72 65 74  D)amt ){.    ret
6df0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
6e00: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
6e10: 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b  rn SQLITE_IOERR;
6e20: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20  .  }.#endif.#if 
6e30: 4f 53 5f 4d 41 43 0a 20 20 69 6e 74 20 67 6f 74  OS_MAC.  int got
6e40: 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
6e50: 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
6e60: 29 3b 0a 20 20 54 52 41 43 45 32 28 22 52 45 41  );.  TRACE2("REA
6e70: 44 20 25 64 5c 6e 22 2c 20 6c 61 73 74 5f 70 61  D %d\n", last_pa
6e80: 67 65 29 3b 0a 23 20 69 66 64 65 66 20 5f 4c 41  ge);.# ifdef _LA
6e90: 52 47 45 5f 46 49 4c 45 0a 20 20 46 53 52 65 61  RGE_FILE.  FSRea
6ea0: 64 46 6f 72 6b 28 69 64 2d 3e 72 65 66 4e 75 6d  dFork(id->refNum
6eb0: 2c 20 66 73 41 74 4d 61 72 6b 2c 20 30 2c 20 28  , fsAtMark, 0, (
6ec0: 42 79 74 65 43 6f 75 6e 74 29 61 6d 74 2c 20 70  ByteCount)amt, p
6ed0: 42 75 66 2c 20 28 42 79 74 65 43 6f 75 6e 74 2a  Buf, (ByteCount*
6ee0: 29 26 67 6f 74 29 3b 0a 23 20 65 6c 73 65 0a 20  )&got);.# else. 
6ef0: 20 67 6f 74 20 3d 20 61 6d 74 3b 0a 20 20 46 53   got = amt;.  FS
6f00: 52 65 61 64 28 69 64 2d 3e 72 65 66 4e 75 6d 2c  Read(id->refNum,
6f10: 20 26 67 6f 74 2c 20 70 42 75 66 29 3b 0a 23 20   &got, pBuf);.# 
6f20: 65 6e 64 69 66 0a 20 20 69 66 28 20 67 6f 74 3d  endif.  if( got=
6f30: 3d 61 6d 74 20 29 7b 0a 20 20 20 20 72 65 74 75  =amt ){.    retu
6f40: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
6f50: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
6f60: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a  n SQLITE_IOERR;.
6f70: 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a    }.#endif.}../*
6f80: 0a 2a 2a 20 57 72 69 74 65 20 64 61 74 61 20 66  .** Write data f
6f90: 72 6f 6d 20 61 20 62 75 66 66 65 72 20 69 6e 74  rom a buffer int
6fa0: 6f 20 61 20 66 69 6c 65 2e 20 20 52 65 74 75 72  o a file.  Retur
6fb0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
6fc0: 75 63 63 65 73 73 0a 2a 2a 20 6f 72 20 73 6f 6d  uccess.** or som
6fd0: 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f  e other error co
6fe0: 64 65 20 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a  de on failure..*
6ff0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 4f 73 57 72  /.int sqliteOsWr
7000: 69 74 65 28 4f 73 46 69 6c 65 20 2a 69 64 2c 20  ite(OsFile *id, 
7010: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 75 66  const void *pBuf
7020: 2c 20 69 6e 74 20 61 6d 74 29 7b 0a 23 69 66 20  , int amt){.#if 
7030: 4f 53 5f 55 4e 49 58 0a 20 20 69 6e 74 20 77 72  OS_UNIX.  int wr
7040: 6f 74 65 20 3d 20 30 3b 0a 20 20 53 69 6d 75 6c  ote = 0;.  Simul
7050: 61 74 65 49 4f 45 72 72 6f 72 28 53 51 4c 49 54  ateIOError(SQLIT
7060: 45 5f 49 4f 45 52 52 29 3b 0a 20 20 54 49 4d 45  E_IOERR);.  TIME
7070: 52 5f 53 54 41 52 54 3b 0a 20 20 77 68 69 6c 65  R_START;.  while
7080: 28 20 61 6d 74 3e 30 20 26 26 20 28 77 72 6f 74  ( amt>0 && (wrot
7090: 65 20 3d 20 77 72 69 74 65 28 69 64 2d 3e 66 64  e = write(id->fd
70a0: 2c 20 70 42 75 66 2c 20 61 6d 74 29 29 3e 30 20  , pBuf, amt))>0 
70b0: 29 7b 0a 20 20 20 20 61 6d 74 20 2d 3d 20 77 72  ){.    amt -= wr
70c0: 6f 74 65 3b 0a 20 20 20 20 70 42 75 66 20 3d 20  ote;.    pBuf = 
70d0: 26 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b 77  &((char*)pBuf)[w
70e0: 72 6f 74 65 5d 3b 0a 20 20 7d 0a 20 20 54 49 4d  rote];.  }.  TIM
70f0: 45 52 5f 45 4e 44 3b 0a 20 20 54 52 41 43 45 34  ER_END;.  TRACE4
7100: 28 22 57 52 49 54 45 20 20 20 25 2d 33 64 20 25  ("WRITE   %-3d %
7110: 37 64 20 25 64 5c 6e 22 2c 20 69 64 2d 3e 66 64  7d %d\n", id->fd
7120: 2c 20 6c 61 73 74 5f 70 61 67 65 2c 20 65 6c 61  , last_page, ela
7130: 70 73 65 29 3b 0a 20 20 53 45 45 4b 28 30 29 3b  pse);.  SEEK(0);
7140: 0a 20 20 69 66 28 20 61 6d 74 3e 30 20 29 7b 0a  .  if( amt>0 ){.
7150: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
7160: 45 5f 46 55 4c 4c 3b 0a 20 20 7d 0a 20 20 72 65  E_FULL;.  }.  re
7170: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
7180: 23 65 6e 64 69 66 0a 23 69 66 20 4f 53 5f 57 49  #endif.#if OS_WI
7190: 4e 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 44 57  N.  int rc;.  DW
71a0: 4f 52 44 20 77 72 6f 74 65 3b 0a 20 20 53 69 6d  ORD wrote;.  Sim
71b0: 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 53 51 4c  ulateIOError(SQL
71c0: 49 54 45 5f 49 4f 45 52 52 29 3b 0a 20 20 54 52  ITE_IOERR);.  TR
71d0: 41 43 45 32 28 22 57 52 49 54 45 20 25 64 5c 6e  ACE2("WRITE %d\n
71e0: 22 2c 20 6c 61 73 74 5f 70 61 67 65 29 3b 0a 20  ", last_page);. 
71f0: 20 77 68 69 6c 65 28 20 61 6d 74 3e 30 20 26 26   while( amt>0 &&
7200: 20 28 72 63 20 3d 20 57 72 69 74 65 46 69 6c 65   (rc = WriteFile
7210: 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 61 6d  (id->h, pBuf, am
7220: 74 2c 20 26 77 72 6f 74 65 2c 20 30 29 29 21 3d  t, &wrote, 0))!=
7230: 30 20 26 26 20 77 72 6f 74 65 3e 30 20 29 7b 0a  0 && wrote>0 ){.
7240: 20 20 20 20 61 6d 74 20 2d 3d 20 77 72 6f 74 65      amt -= wrote
7250: 3b 0a 20 20 20 20 70 42 75 66 20 3d 20 26 28 28  ;.    pBuf = &((
7260: 63 68 61 72 2a 29 70 42 75 66 29 5b 77 72 6f 74  char*)pBuf)[wrot
7270: 65 5d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 72  e];.  }.  if( !r
7280: 63 20 7c 7c 20 61 6d 74 3e 28 69 6e 74 29 77 72  c || amt>(int)wr
7290: 6f 74 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ote ){.    retur
72a0: 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20  n SQLITE_FULL;. 
72b0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
72c0: 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 23 69  TE_OK;.#endif.#i
72d0: 66 20 4f 53 5f 4d 41 43 0a 20 20 4f 53 45 72 72  f OS_MAC.  OSErr
72e0: 20 6f 73 65 72 72 3b 0a 20 20 69 6e 74 20 77 72   oserr;.  int wr
72f0: 6f 74 65 20 3d 20 30 3b 0a 20 20 53 69 6d 75 6c  ote = 0;.  Simul
7300: 61 74 65 49 4f 45 72 72 6f 72 28 53 51 4c 49 54  ateIOError(SQLIT
7310: 45 5f 49 4f 45 52 52 29 3b 0a 20 20 54 52 41 43  E_IOERR);.  TRAC
7320: 45 32 28 22 57 52 49 54 45 20 25 64 5c 6e 22 2c  E2("WRITE %d\n",
7330: 20 6c 61 73 74 5f 70 61 67 65 29 3b 0a 20 20 77   last_page);.  w
7340: 68 69 6c 65 28 20 61 6d 74 3e 30 20 29 7b 0a 23  hile( amt>0 ){.#
7350: 20 69 66 64 65 66 20 5f 4c 41 52 47 45 5f 46 49   ifdef _LARGE_FI
7360: 4c 45 0a 20 20 20 20 6f 73 65 72 72 20 3d 20 46  LE.    oserr = F
7370: 53 57 72 69 74 65 46 6f 72 6b 28 69 64 2d 3e 72  SWriteFork(id->r
7380: 65 66 4e 75 6d 2c 20 66 73 41 74 4d 61 72 6b 2c  efNum, fsAtMark,
7390: 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
73a0: 20 20 20 20 20 20 20 20 20 20 20 20 28 42 79 74              (Byt
73b0: 65 43 6f 75 6e 74 29 61 6d 74 2c 20 70 42 75 66  eCount)amt, pBuf
73c0: 2c 20 28 42 79 74 65 43 6f 75 6e 74 2a 29 26 77  , (ByteCount*)&w
73d0: 72 6f 74 65 29 3b 0a 23 20 65 6c 73 65 0a 20 20  rote);.# else.  
73e0: 20 20 77 72 6f 74 65 20 3d 20 61 6d 74 3b 0a 20    wrote = amt;. 
73f0: 20 20 20 6f 73 65 72 72 20 3d 20 46 53 57 72 69     oserr = FSWri
7400: 74 65 28 69 64 2d 3e 72 65 66 4e 75 6d 2c 20 26  te(id->refNum, &
7410: 77 72 6f 74 65 2c 20 70 42 75 66 29 3b 0a 23 20  wrote, pBuf);.# 
7420: 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 77 72  endif.    if( wr
7430: 6f 74 65 20 3d 3d 20 30 20 7c 7c 20 6f 73 65 72  ote == 0 || oser
7440: 72 20 21 3d 20 6e 6f 45 72 72 29 0a 20 20 20 20  r != noErr).    
7450: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 61 6d 74    break;.    amt
7460: 20 2d 3d 20 77 72 6f 74 65 3b 0a 20 20 20 20 70   -= wrote;.    p
7470: 42 75 66 20 3d 20 26 28 28 63 68 61 72 2a 29 70  Buf = &((char*)p
7480: 42 75 66 29 5b 77 72 6f 74 65 5d 3b 0a 20 20 7d  Buf)[wrote];.  }
7490: 0a 20 20 69 66 28 20 6f 73 65 72 72 20 21 3d 20  .  if( oserr != 
74a0: 6e 6f 45 72 72 20 7c 7c 20 61 6d 74 3e 77 72 6f  noErr || amt>wro
74b0: 74 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  te ){.    return
74c0: 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20   SQLITE_FULL;.  
74d0: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
74e0: 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  E_OK;.#endif.}..
74f0: 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 72  /*.** Move the r
7500: 65 61 64 2f 77 72 69 74 65 20 70 6f 69 6e 74 65  ead/write pointe
7510: 72 20 69 6e 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a  r in a file..*/.
7520: 69 6e 74 20 73 71 6c 69 74 65 4f 73 53 65 65 6b  int sqliteOsSeek
7530: 28 4f 73 46 69 6c 65 20 2a 69 64 2c 20 6f 66 66  (OsFile *id, off
7540: 5f 74 20 6f 66 66 73 65 74 29 7b 0a 20 20 53 45  _t offset){.  SE
7550: 45 4b 28 6f 66 66 73 65 74 2f 31 30 32 34 20 2b  EK(offset/1024 +
7560: 20 31 29 3b 0a 23 69 66 20 4f 53 5f 55 4e 49 58   1);.#if OS_UNIX
7570: 0a 20 20 6c 73 65 65 6b 28 69 64 2d 3e 66 64 2c  .  lseek(id->fd,
7580: 20 6f 66 66 73 65 74 2c 20 53 45 45 4b 5f 53 45   offset, SEEK_SE
7590: 54 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  T);.  return SQL
75a0: 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 23  ITE_OK;.#endif.#
75b0: 69 66 20 4f 53 5f 57 49 4e 0a 20 20 7b 0a 20 20  if OS_WIN.  {.  
75c0: 20 20 4c 4f 4e 47 20 75 70 70 65 72 42 69 74 73    LONG upperBits
75d0: 20 3d 20 6f 66 66 73 65 74 3e 3e 33 32 3b 0a 20   = offset>>32;. 
75e0: 20 20 20 4c 4f 4e 47 20 6c 6f 77 65 72 42 69 74     LONG lowerBit
75f0: 73 20 3d 20 6f 66 66 73 65 74 20 26 20 30 78 66  s = offset & 0xf
7600: 66 66 66 66 66 66 66 3b 0a 20 20 20 20 44 57 4f  fffffff;.    DWO
7610: 52 44 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20  RD rc;.    rc = 
7620: 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 28 69  SetFilePointer(i
7630: 64 2d 3e 68 2c 20 6c 6f 77 65 72 42 69 74 73 2c  d->h, lowerBits,
7640: 20 26 75 70 70 65 72 42 69 74 73 2c 20 46 49 4c   &upperBits, FIL
7650: 45 5f 42 45 47 49 4e 29 3b 0a 20 20 20 20 2f 2a  E_BEGIN);.    /*
7660: 20 54 52 41 43 45 33 28 22 53 45 45 4b 20 72 63   TRACE3("SEEK rc
7670: 3d 30 78 25 78 20 75 70 70 65 72 3d 30 78 25 78  =0x%x upper=0x%x
7680: 5c 6e 22 2c 20 72 63 2c 20 75 70 70 65 72 42 69  \n", rc, upperBi
7690: 74 73 29 3b 20 2a 2f 0a 20 20 7d 0a 20 20 72 65  ts); */.  }.  re
76a0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
76b0: 23 65 6e 64 69 66 0a 23 69 66 20 4f 53 5f 4d 41  #endif.#if OS_MA
76c0: 43 0a 20 20 7b 0a 20 20 20 20 6f 66 66 5f 74 20  C.  {.    off_t 
76d0: 63 75 72 53 69 7a 65 3b 0a 20 20 20 20 69 66 28  curSize;.    if(
76e0: 20 73 71 6c 69 74 65 4f 73 46 69 6c 65 53 69 7a   sqliteOsFileSiz
76f0: 65 28 69 64 2c 20 26 63 75 72 53 69 7a 65 29 20  e(id, &curSize) 
7700: 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  != SQLITE_OK ){.
7710: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
7720: 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 7d  ITE_IOERR;.    }
7730: 0a 20 20 20 20 69 66 28 20 6f 66 66 73 65 74 20  .    if( offset 
7740: 3e 3d 20 63 75 72 53 69 7a 65 20 29 7b 0a 20 20  >= curSize ){.  
7750: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 4f 73      if( sqliteOs
7760: 54 72 75 6e 63 61 74 65 28 69 64 2c 20 6f 66 66  Truncate(id, off
7770: 73 65 74 2b 31 29 20 21 3d 20 53 51 4c 49 54 45  set+1) != SQLITE
7780: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
7790: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
77a0: 52 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  RR;.      }.    
77b0: 7d 0a 23 20 69 66 64 65 66 20 5f 4c 41 52 47 45  }.# ifdef _LARGE
77c0: 5f 46 49 4c 45 0a 20 20 20 20 69 66 28 20 46 53  _FILE.    if( FS
77d0: 53 65 74 46 6f 72 6b 50 6f 73 69 74 69 6f 6e 28  SetForkPosition(
77e0: 69 64 2d 3e 72 65 66 4e 75 6d 2c 20 66 73 46 72  id->refNum, fsFr
77f0: 6f 6d 53 74 61 72 74 2c 20 6f 66 66 73 65 74 29  omStart, offset)
7800: 20 21 3d 20 6e 6f 45 72 72 20 29 7b 0a 23 20 65   != noErr ){.# e
7810: 6c 73 65 0a 20 20 20 20 69 66 28 20 53 65 74 46  lse.    if( SetF
7820: 50 6f 73 28 69 64 2d 3e 72 65 66 4e 75 6d 2c 20  Pos(id->refNum, 
7830: 66 73 46 72 6f 6d 53 74 61 72 74 2c 20 6f 66 66  fsFromStart, off
7840: 73 65 74 29 20 21 3d 20 6e 6f 45 72 72 20 29 7b  set) != noErr ){
7850: 0a 23 20 65 6e 64 69 66 0a 20 20 20 20 20 20 72  .# endif.      r
7860: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
7870: 52 52 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  RR;.    }else{. 
7880: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
7890: 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  TE_OK;.    }.  }
78a0: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
78b0: 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 77   Make sure all w
78c0: 72 69 74 65 73 20 74 6f 20 61 20 70 61 72 74 69  rites to a parti
78d0: 63 75 6c 61 72 20 66 69 6c 65 20 61 72 65 20 63  cular file are c
78e0: 6f 6d 6d 69 74 74 65 64 20 74 6f 20 64 69 73 6b  ommitted to disk
78f0: 2e 0a 2a 2a 0a 2a 2a 20 55 6e 64 65 72 20 55 6e  ..**.** Under Un
7900: 69 78 2c 20 61 6c 73 6f 20 6d 61 6b 65 20 73 75  ix, also make su
7910: 72 65 20 74 68 61 74 20 74 68 65 20 64 69 72 65  re that the dire
7920: 63 74 6f 72 79 20 65 6e 74 72 79 20 66 6f 72 20  ctory entry for 
7930: 74 68 65 20 66 69 6c 65 0a 2a 2a 20 68 61 73 20  the file.** has 
7940: 62 65 65 6e 20 63 72 65 61 74 65 64 20 62 79 20  been created by 
7950: 66 73 79 6e 63 2d 69 6e 67 20 74 68 65 20 64 69  fsync-ing the di
7960: 72 65 63 74 6f 72 79 20 74 68 61 74 20 63 6f 6e  rectory that con
7970: 74 61 69 6e 73 20 74 68 65 20 66 69 6c 65 2e 0a  tains the file..
7980: 2a 2a 20 49 66 20 77 65 20 64 6f 20 6e 6f 74 20  ** If we do not 
7990: 64 6f 20 74 68 69 73 20 61 6e 64 20 77 65 20 65  do this and we e
79a0: 6e 63 6f 75 6e 74 65 72 20 61 20 70 6f 77 65 72  ncounter a power
79b0: 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20 64 69   failure, the di
79c0: 72 65 63 74 6f 72 79 0a 2a 2a 20 65 6e 74 72 79  rectory.** entry
79d0: 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c   for the journal
79e0: 20 6d 69 67 68 74 20 6e 6f 74 20 65 78 69 73 74   might not exist
79f0: 20 61 66 74 65 72 20 77 65 20 72 65 62 6f 6f 74   after we reboot
7a00: 2e 20 20 54 68 65 20 6e 65 78 74 0a 2a 2a 20 53  .  The next.** S
7a10: 51 4c 69 74 65 20 74 6f 20 61 63 63 65 73 73 20  QLite to access 
7a20: 74 68 65 20 66 69 6c 65 20 77 69 6c 6c 20 6e 6f  the file will no
7a30: 74 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20  t know that the 
7a40: 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 20 28  journal exists (
7a50: 62 65 63 61 75 73 65 0a 2a 2a 20 74 68 65 20 64  because.** the d
7a60: 69 72 65 63 74 6f 72 79 20 65 6e 74 72 79 20 66  irectory entry f
7a70: 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77  or the journal w
7a80: 61 73 20 6e 65 76 65 72 20 63 72 65 61 74 65 64  as never created
7a90: 29 20 61 6e 64 20 74 68 65 20 74 72 61 6e 73 61  ) and the transa
7aa0: 63 74 69 6f 6e 0a 2a 2a 20 77 69 6c 6c 20 6e 6f  ction.** will no
7ab0: 74 20 72 6f 6c 6c 20 62 61 63 6b 20 2d 20 70 6f  t roll back - po
7ac0: 73 73 69 62 6c 79 20 6c 65 61 64 69 6e 67 20 74  ssibly leading t
7ad0: 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75  o database corru
7ae0: 70 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ption..*/.int sq
7af0: 6c 69 74 65 4f 73 53 79 6e 63 28 4f 73 46 69 6c  liteOsSync(OsFil
7b00: 65 20 2a 69 64 29 7b 0a 23 69 66 20 4f 53 5f 55  e *id){.#if OS_U
7b10: 4e 49 58 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  NIX.  SimulateIO
7b20: 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
7b30: 52 52 29 3b 0a 20 20 54 52 41 43 45 32 28 22 53  RR);.  TRACE2("S
7b40: 59 4e 43 20 20 20 20 25 2d 33 64 5c 6e 22 2c 20  YNC    %-3d\n", 
7b50: 69 64 2d 3e 66 64 29 3b 0a 20 20 69 66 28 20 66  id->fd);.  if( f
7b60: 73 79 6e 63 28 69 64 2d 3e 66 64 29 20 29 7b 0a  sync(id->fd) ){.
7b70: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
7b80: 45 5f 49 4f 45 52 52 3b 0a 20 20 7d 65 6c 73 65  E_IOERR;.  }else
7b90: 7b 0a 20 20 20 20 69 66 28 20 69 64 2d 3e 64 69  {.    if( id->di
7ba0: 72 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  rfd>=0 ){.      
7bb0: 54 52 41 43 45 32 28 22 44 49 52 53 59 4e 43 20  TRACE2("DIRSYNC 
7bc0: 25 2d 33 64 5c 6e 22 2c 20 69 64 2d 3e 64 69 72  %-3d\n", id->dir
7bd0: 66 64 29 3b 0a 20 20 20 20 20 20 66 73 79 6e 63  fd);.      fsync
7be0: 28 69 64 2d 3e 64 69 72 66 64 29 3b 0a 20 20 20  (id->dirfd);.   
7bf0: 20 20 20 63 6c 6f 73 65 28 69 64 2d 3e 64 69 72     close(id->dir
7c00: 66 64 29 3b 20 20 2f 2a 20 4f 6e 6c 79 20 6e 65  fd);  /* Only ne
7c10: 65 64 20 74 6f 20 73 79 6e 63 20 6f 6e 63 65 2c  ed to sync once,
7c20: 20 73 6f 20 63 6c 6f 73 65 20 74 68 65 20 64 69   so close the di
7c30: 72 65 63 74 6f 72 79 20 2a 2f 0a 20 20 20 20 20  rectory */.     
7c40: 20 69 64 2d 3e 64 69 72 66 64 20 3d 20 2d 31 3b   id->dirfd = -1;
7c50: 20 20 20 20 2f 2a 20 77 68 65 6e 20 77 65 20 61      /* when we a
7c60: 72 65 20 64 6f 6e 65 2e 20 2a 2f 0a 20 20 20 20  re done. */.    
7c70: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  }.    return SQL
7c80: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 23 65 6e 64  ITE_OK;.  }.#end
7c90: 69 66 0a 23 69 66 20 4f 53 5f 57 49 4e 0a 20 20  if.#if OS_WIN.  
7ca0: 69 66 28 20 46 6c 75 73 68 46 69 6c 65 42 75 66  if( FlushFileBuf
7cb0: 66 65 72 73 28 69 64 2d 3e 68 29 20 29 7b 0a 20  fers(id->h) ){. 
7cc0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
7cd0: 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _OK;.  }else{.  
7ce0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
7cf0: 49 4f 45 52 52 3b 0a 20 20 7d 0a 23 65 6e 64 69  IOERR;.  }.#endi
7d00: 66 0a 23 69 66 20 4f 53 5f 4d 41 43 0a 23 20 69  f.#if OS_MAC.# i
7d10: 66 64 65 66 20 5f 4c 41 52 47 45 5f 46 49 4c 45  fdef _LARGE_FILE
7d20: 0a 20 20 69 66 28 20 46 53 46 6c 75 73 68 46 6f  .  if( FSFlushFo
7d30: 72 6b 28 69 64 2d 3e 72 65 66 4e 75 6d 29 20 21  rk(id->refNum) !
7d40: 3d 20 6e 6f 45 72 72 20 29 7b 0a 23 20 65 6c 73  = noErr ){.# els
7d50: 65 0a 20 20 50 61 72 61 6d 42 6c 6f 63 6b 52 65  e.  ParamBlockRe
7d60: 63 20 70 61 72 61 6d 73 3b 0a 20 20 6d 65 6d 73  c params;.  mems
7d70: 65 74 28 26 70 61 72 61 6d 73 2c 20 30 2c 20 73  et(&params, 0, s
7d80: 69 7a 65 6f 66 28 50 61 72 61 6d 42 6c 6f 63 6b  izeof(ParamBlock
7d90: 52 65 63 29 29 3b 0a 20 20 70 61 72 61 6d 73 2e  Rec));.  params.
7da0: 69 6f 50 61 72 61 6d 2e 69 6f 52 65 66 4e 75 6d  ioParam.ioRefNum
7db0: 20 3d 20 69 64 2d 3e 72 65 66 4e 75 6d 3b 0a 20   = id->refNum;. 
7dc0: 20 69 66 28 20 50 42 46 6c 75 73 68 46 69 6c 65   if( PBFlushFile
7dd0: 53 79 6e 63 28 26 70 61 72 61 6d 73 29 20 21 3d  Sync(&params) !=
7de0: 20 6e 6f 45 72 72 20 29 7b 0a 23 20 65 6e 64 69   noErr ){.# endi
7df0: 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  f.    return SQL
7e00: 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 7d 65 6c  ITE_IOERR;.  }el
7e10: 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  se{.    return S
7e20: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 23 65  QLITE_OK;.  }.#e
7e30: 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72  ndif.}../*.** Tr
7e40: 75 6e 63 61 74 65 20 61 6e 20 6f 70 65 6e 20 66  uncate an open f
7e50: 69 6c 65 20 74 6f 20 61 20 73 70 65 63 69 66 69  ile to a specifi
7e60: 65 64 20 73 69 7a 65 0a 2a 2f 0a 69 6e 74 20 73  ed size.*/.int s
7e70: 71 6c 69 74 65 4f 73 54 72 75 6e 63 61 74 65 28  qliteOsTruncate(
7e80: 4f 73 46 69 6c 65 20 2a 69 64 2c 20 6f 66 66 5f  OsFile *id, off_
7e90: 74 20 6e 42 79 74 65 29 7b 0a 20 20 53 69 6d 75  t nByte){.  Simu
7ea0: 6c 61 74 65 49 4f 45 72 72 6f 72 28 53 51 4c 49  lateIOError(SQLI
7eb0: 54 45 5f 49 4f 45 52 52 29 3b 0a 23 69 66 20 4f  TE_IOERR);.#if O
7ec0: 53 5f 55 4e 49 58 0a 20 20 72 65 74 75 72 6e 20  S_UNIX.  return 
7ed0: 66 74 72 75 6e 63 61 74 65 28 69 64 2d 3e 66 64  ftruncate(id->fd
7ee0: 2c 20 6e 42 79 74 65 29 3d 3d 30 20 3f 20 53 51  , nByte)==0 ? SQ
7ef0: 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c 49 54 45  LITE_OK : SQLITE
7f00: 5f 49 4f 45 52 52 3b 0a 23 65 6e 64 69 66 0a 23  _IOERR;.#endif.#
7f10: 69 66 20 4f 53 5f 57 49 4e 0a 20 20 7b 0a 20 20  if OS_WIN.  {.  
7f20: 20 20 4c 4f 4e 47 20 75 70 70 65 72 42 69 74 73    LONG upperBits
7f30: 20 3d 20 6e 42 79 74 65 3e 3e 33 32 3b 0a 20 20   = nByte>>32;.  
7f40: 20 20 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72    SetFilePointer
7f50: 28 69 64 2d 3e 68 2c 20 6e 42 79 74 65 2c 20 26  (id->h, nByte, &
7f60: 75 70 70 65 72 42 69 74 73 2c 20 46 49 4c 45 5f  upperBits, FILE_
7f70: 42 45 47 49 4e 29 3b 0a 20 20 20 20 53 65 74 45  BEGIN);.    SetE
7f80: 6e 64 4f 66 46 69 6c 65 28 69 64 2d 3e 68 29 3b  ndOfFile(id->h);
7f90: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
7fa0: 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a  LITE_OK;.#endif.
7fb0: 23 69 66 20 4f 53 5f 4d 41 43 0a 23 20 69 66 64  #if OS_MAC.# ifd
7fc0: 65 66 20 5f 4c 41 52 47 45 5f 46 49 4c 45 0a 20  ef _LARGE_FILE. 
7fd0: 20 69 66 28 20 46 53 53 65 74 46 6f 72 6b 53 69   if( FSSetForkSi
7fe0: 7a 65 28 69 64 2d 3e 72 65 66 4e 75 6d 2c 20 66  ze(id->refNum, f
7ff0: 73 46 72 6f 6d 53 74 61 72 74 2c 20 6e 42 79 74  sFromStart, nByt
8000: 65 29 20 21 3d 20 6e 6f 45 72 72 29 7b 0a 23 20  e) != noErr){.# 
8010: 65 6c 73 65 0a 20 20 69 66 28 20 53 65 74 45 4f  else.  if( SetEO
8020: 46 28 69 64 2d 3e 72 65 66 4e 75 6d 2c 20 6e 42  F(id->refNum, nB
8030: 79 74 65 29 20 21 3d 20 6e 6f 45 72 72 20 29 7b  yte) != noErr ){
8040: 0a 23 20 65 6e 64 69 66 0a 20 20 20 20 72 65 74  .# endif.    ret
8050: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
8060: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
8070: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
8080: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  .  }.#endif.}../
8090: 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 74  *.** Determine t
80a0: 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20  he current size 
80b0: 6f 66 20 61 20 66 69 6c 65 20 69 6e 20 62 79 74  of a file in byt
80c0: 65 73 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  es.*/.int sqlite
80d0: 4f 73 46 69 6c 65 53 69 7a 65 28 4f 73 46 69 6c  OsFileSize(OsFil
80e0: 65 20 2a 69 64 2c 20 6f 66 66 5f 74 20 2a 70 53  e *id, off_t *pS
80f0: 69 7a 65 29 7b 0a 23 69 66 20 4f 53 5f 55 4e 49  ize){.#if OS_UNI
8100: 58 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20  X.  struct stat 
8110: 62 75 66 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49  buf;.  SimulateI
8120: 4f 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  OError(SQLITE_IO
8130: 45 52 52 29 3b 0a 20 20 69 66 28 20 66 73 74 61  ERR);.  if( fsta
8140: 74 28 69 64 2d 3e 66 64 2c 20 26 62 75 66 29 21  t(id->fd, &buf)!
8150: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
8160: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20   SQLITE_IOERR;. 
8170: 20 7d 0a 20 20 2a 70 53 69 7a 65 20 3d 20 62 75   }.  *pSize = bu
8180: 66 2e 73 74 5f 73 69 7a 65 3b 0a 20 20 72 65 74  f.st_size;.  ret
8190: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23  urn SQLITE_OK;.#
81a0: 65 6e 64 69 66 0a 23 69 66 20 4f 53 5f 57 49 4e  endif.#if OS_WIN
81b0: 0a 20 20 44 57 4f 52 44 20 75 70 70 65 72 42 69  .  DWORD upperBi
81c0: 74 73 2c 20 6c 6f 77 65 72 42 69 74 73 3b 0a 20  ts, lowerBits;. 
81d0: 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
81e0: 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 3b 0a  (SQLITE_IOERR);.
81f0: 20 20 6c 6f 77 65 72 42 69 74 73 20 3d 20 47 65    lowerBits = Ge
8200: 74 46 69 6c 65 53 69 7a 65 28 69 64 2d 3e 68 2c  tFileSize(id->h,
8210: 20 26 75 70 70 65 72 42 69 74 73 29 3b 0a 20 20   &upperBits);.  
8220: 2a 70 53 69 7a 65 20 3d 20 28 28 28 6f 66 66 5f  *pSize = (((off_
8230: 74 29 75 70 70 65 72 42 69 74 73 29 3c 3c 33 32  t)upperBits)<<32
8240: 29 20 2b 20 6c 6f 77 65 72 42 69 74 73 3b 0a 20  ) + lowerBits;. 
8250: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
8260: 4b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f 53  K;.#endif.#if OS
8270: 5f 4d 41 43 0a 23 20 69 66 64 65 66 20 5f 4c 41  _MAC.# ifdef _LA
8280: 52 47 45 5f 46 49 4c 45 0a 20 20 69 66 28 20 46  RGE_FILE.  if( F
8290: 53 47 65 74 46 6f 72 6b 53 69 7a 65 28 69 64 2d  SGetForkSize(id-
82a0: 3e 72 65 66 4e 75 6d 2c 20 70 53 69 7a 65 29 20  >refNum, pSize) 
82b0: 21 3d 20 6e 6f 45 72 72 29 7b 0a 23 20 65 6c 73  != noErr){.# els
82c0: 65 0a 20 20 69 66 28 20 47 65 74 45 4f 46 28 69  e.  if( GetEOF(i
82d0: 64 2d 3e 72 65 66 4e 75 6d 2c 20 70 53 69 7a 65  d->refNum, pSize
82e0: 29 20 21 3d 20 6e 6f 45 72 72 20 29 7b 0a 23 20  ) != noErr ){.# 
82f0: 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e  endif.    return
8300: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20   SQLITE_IOERR;. 
8310: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
8320: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
8330: 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23 69 66 20  }.#endif.}..#if 
8340: 4f 53 5f 57 49 4e 0a 2f 2a 0a 2a 2a 20 52 65 74  OS_WIN./*.** Ret
8350: 75 72 6e 20 74 72 75 65 20 28 6e 6f 6e 2d 7a 65  urn true (non-ze
8360: 72 6f 29 20 69 66 20 77 65 20 61 72 65 20 72 75  ro) if we are ru
8370: 6e 6e 69 6e 67 20 75 6e 64 65 72 20 57 69 6e 4e  nning under WinN
8380: 54 2c 20 57 69 6e 32 4b 20 6f 72 20 57 69 6e 58  T, Win2K or WinX
8390: 50 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 66 61 6c  P..** Return fal
83a0: 73 65 20 28 7a 65 72 6f 29 20 66 6f 72 20 57 69  se (zero) for Wi
83b0: 6e 39 35 2c 20 57 69 6e 39 38 2c 20 6f 72 20 57  n95, Win98, or W
83c0: 69 6e 4d 45 2e 0a 2a 2a 0a 2a 2a 20 48 65 72 65  inME..**.** Here
83d0: 20 69 73 20 61 6e 20 69 6e 74 65 72 65 73 74 69   is an interesti
83e0: 6e 67 20 6f 62 73 65 72 76 61 74 69 6f 6e 3a 20  ng observation: 
83f0: 20 57 69 6e 39 35 2c 20 57 69 6e 39 38 2c 20 61   Win95, Win98, a
8400: 6e 64 20 57 69 6e 4d 45 20 6c 61 63 6b 0a 2a 2a  nd WinME lack.**
8410: 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 45 78 28   the LockFileEx(
8420: 29 20 41 50 49 2e 20 20 42 75 74 20 77 65 20 63  ) API.  But we c
8430: 61 6e 20 73 74 69 6c 6c 20 73 74 61 74 69 63 61  an still statica
8440: 6c 6c 79 20 6c 69 6e 6b 20 61 67 61 69 6e 73 74  lly link against
8450: 20 74 68 61 74 0a 2a 2a 20 41 50 49 20 61 73 20   that.** API as 
8460: 6c 6f 6e 67 20 61 73 20 77 65 20 64 6f 6e 27 74  long as we don't
8470: 20 63 61 6c 6c 20 69 74 20 77 69 6e 20 72 75 6e   call it win run
8480: 6e 69 6e 67 20 57 69 6e 39 35 2f 39 38 2f 4d 45  ning Win95/98/ME
8490: 2e 20 20 41 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20  .  A call to.** 
84a0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
84b0: 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e  used to determin
84c0: 65 20 69 66 20 74 68 65 20 68 6f 73 74 20 69 73  e if the host is
84d0: 20 57 69 6e 39 35 2f 39 38 2f 4d 45 20 6f 72 0a   Win95/98/ME or.
84e0: 2a 2a 20 57 69 6e 4e 54 2f 32 4b 2f 58 50 20 73  ** WinNT/2K/XP s
84f0: 6f 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20 6b  o that we will k
8500: 6e 6f 77 20 77 68 65 74 68 65 72 20 6f 72 20 6e  now whether or n
8510: 6f 74 20 77 65 20 63 61 6e 20 73 61 66 65 6c 79  ot we can safely
8520: 20 63 61 6c 6c 0a 2a 2a 20 74 68 65 20 4c 6f 63   call.** the Loc
8530: 6b 46 69 6c 65 45 78 28 29 20 41 50 49 2e 0a 2a  kFileEx() API..*
8540: 2f 0a 69 6e 74 20 69 73 4e 54 28 76 6f 69 64 29  /.int isNT(void)
8550: 7b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 6f  {.  static int o
8560: 73 54 79 70 65 20 3d 20 30 3b 20 20 20 2f 2a 20  sType = 0;   /* 
8570: 30 3d 75 6e 6b 6e 6f 77 6e 20 31 3d 77 69 6e 39  0=unknown 1=win9
8580: 35 20 32 3d 77 69 6e 4e 54 20 2a 2f 0a 20 20 69  5 2=winNT */.  i
8590: 66 28 20 6f 73 54 79 70 65 3d 3d 30 20 29 7b 0a  f( osType==0 ){.
85a0: 20 20 20 20 4f 53 56 45 52 53 49 4f 4e 49 4e 46      OSVERSIONINF
85b0: 4f 20 73 49 6e 66 6f 3b 0a 20 20 20 20 73 49 6e  O sInfo;.    sIn
85c0: 66 6f 2e 64 77 4f 53 56 65 72 73 69 6f 6e 49 6e  fo.dwOSVersionIn
85d0: 66 6f 53 69 7a 65 20 3d 20 73 69 7a 65 6f 66 28  foSize = sizeof(
85e0: 73 49 6e 66 6f 29 3b 0a 20 20 20 20 47 65 74 56  sInfo);.    GetV
85f0: 65 72 73 69 6f 6e 45 78 28 26 73 49 6e 66 6f 29  ersionEx(&sInfo)
8600: 3b 0a 20 20 20 20 6f 73 54 79 70 65 20 3d 20 73  ;.    osType = s
8610: 49 6e 66 6f 2e 64 77 50 6c 61 74 66 6f 72 6d 49  Info.dwPlatformI
8620: 64 3d 3d 56 45 52 5f 50 4c 41 54 46 4f 52 4d 5f  d==VER_PLATFORM_
8630: 57 49 4e 33 32 5f 4e 54 20 3f 20 32 20 3a 20 31  WIN32_NT ? 2 : 1
8640: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6f  ;.  }.  return o
8650: 73 54 79 70 65 3d 3d 32 3b 0a 7d 0a 23 65 6e 64  sType==2;.}.#end
8660: 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 69 6e 64 6f 77  if../*.** Window
8670: 73 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 6e  s file locking n
8680: 6f 74 65 73 3a 20 20 5b 73 69 6d 69 6c 61 72 20  otes:  [similar 
8690: 69 73 73 75 65 73 20 61 70 70 6c 79 20 74 6f 20  issues apply to 
86a0: 4d 61 63 4f 53 5d 0a 2a 2a 0a 2a 2a 20 57 65 20  MacOS].**.** We 
86b0: 63 61 6e 6e 6f 74 20 75 73 65 20 4c 6f 63 6b 46  cannot use LockF
86c0: 69 6c 65 45 78 28 29 20 6f 72 20 55 6e 6c 6f 63  ileEx() or Unloc
86d0: 6b 46 69 6c 65 45 78 28 29 20 6f 6e 20 57 69 6e  kFileEx() on Win
86e0: 39 35 2f 39 38 2f 4d 45 20 62 65 63 61 75 73 65  95/98/ME because
86f0: 0a 2a 2a 20 74 68 6f 73 65 20 66 75 6e 63 74 69  .** those functi
8700: 6f 6e 73 20 61 72 65 20 6e 6f 74 20 61 76 61 69  ons are not avai
8710: 6c 61 62 6c 65 2e 20 20 53 6f 20 77 65 20 75 73  lable.  So we us
8720: 65 20 6f 6e 6c 79 20 4c 6f 63 6b 46 69 6c 65 28  e only LockFile(
8730: 29 20 61 6e 64 0a 2a 2a 20 55 6e 6c 6f 63 6b 46  ) and.** UnlockF
8740: 69 6c 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 4c 6f 63  ile()..**.** Loc
8750: 6b 46 69 6c 65 28 29 20 70 72 65 76 65 6e 74 73  kFile() prevents
8760: 20 6e 6f 74 20 6a 75 73 74 20 77 72 69 74 69 6e   not just writin
8770: 67 20 62 75 74 20 61 6c 73 6f 20 72 65 61 64 69  g but also readi
8780: 6e 67 20 62 79 20 6f 74 68 65 72 20 70 72 6f 63  ng by other proc
8790: 65 73 73 65 73 2e 0a 2a 2a 20 28 54 68 69 73 20  esses..** (This 
87a0: 69 73 20 61 20 64 65 73 69 67 6e 20 65 72 72 6f  is a design erro
87b0: 72 20 6f 6e 20 74 68 65 20 70 61 72 74 20 6f 66  r on the part of
87c0: 20 57 69 6e 64 6f 77 73 2c 20 62 75 74 20 74 68   Windows, but th
87d0: 65 72 65 20 69 73 20 6e 6f 74 68 69 6e 67 0a 2a  ere is nothing.*
87e0: 2a 20 77 65 20 63 61 6e 20 64 6f 20 61 62 6f 75  * we can do abou
87f0: 74 20 74 68 61 74 2e 29 20 20 53 6f 20 74 68 65  t that.)  So the
8800: 20 72 65 67 69 6f 6e 20 75 73 65 64 20 66 6f 72   region used for
8810: 20 6c 6f 63 6b 69 6e 67 20 69 73 20 61 74 20 74   locking is at t
8820: 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65  he.** end of the
8830: 20 66 69 6c 65 20 77 68 65 72 65 20 69 74 20 69   file where it i
8840: 73 20 75 6e 6c 69 6b 65 6c 79 20 74 6f 20 65 76  s unlikely to ev
8850: 65 72 20 69 6e 74 65 72 66 65 72 65 20 77 69 74  er interfere wit
8860: 68 20 61 6e 0a 2a 2a 20 61 63 74 75 61 6c 20 72  h an.** actual r
8870: 65 61 64 20 61 74 74 65 6d 70 74 2e 0a 2a 2a 0a  ead attempt..**.
8880: 2a 2a 20 41 20 64 61 74 61 62 61 73 65 20 72 65  ** A database re
8890: 61 64 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69  ad lock is obtai
88a0: 6e 65 64 20 62 79 20 6c 6f 63 6b 69 6e 67 20 61  ned by locking a
88b0: 20 73 69 6e 67 6c 65 20 72 61 6e 64 6f 6d 6c 79   single randomly
88c0: 2d 63 68 6f 73 65 6e 20 0a 2a 2a 20 62 79 74 65  -chosen .** byte
88d0: 20 6f 75 74 20 6f 66 20 61 20 73 70 65 63 69 66   out of a specif
88e0: 69 63 20 72 61 6e 67 65 20 6f 66 20 62 79 74 65  ic range of byte
88f0: 73 2e 20 54 68 65 20 6c 6f 63 6b 20 62 79 74 65  s. The lock byte
8900: 20 69 73 20 6f 62 74 61 69 6e 65 64 20 61 74 20   is obtained at 
8910: 0a 2a 2a 20 72 61 6e 64 6f 6d 20 73 6f 20 74 77  .** random so tw
8920: 6f 20 73 65 70 61 72 61 74 65 20 72 65 61 64 65  o separate reade
8930: 72 73 20 63 61 6e 20 70 72 6f 62 61 62 6c 79 20  rs can probably 
8940: 61 63 63 65 73 73 20 74 68 65 20 66 69 6c 65 20  access the file 
8950: 61 74 20 74 68 65 20 0a 2a 2a 20 73 61 6d 65 20  at the .** same 
8960: 74 69 6d 65 2c 20 75 6e 6c 65 73 73 20 74 68 65  time, unless the
8970: 79 20 61 72 65 20 75 6e 6c 75 63 6b 79 20 61 6e  y are unlucky an
8980: 64 20 63 68 6f 6f 73 65 20 74 68 65 20 73 61 6d  d choose the sam
8990: 65 20 6c 6f 63 6b 20 62 79 74 65 2e 0a 2a 2a 20  e lock byte..** 
89a0: 41 20 64 61 74 61 62 61 73 65 20 77 72 69 74 65  A database write
89b0: 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65   lock is obtaine
89c0: 64 20 62 79 20 6c 6f 63 6b 69 6e 67 20 61 6c 6c  d by locking all
89d0: 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 72 61   bytes in the ra
89e0: 6e 67 65 2e 0a 2a 2a 20 54 68 65 72 65 20 63 61  nge..** There ca
89f0: 6e 20 6f 6e 6c 79 20 62 65 20 6f 6e 65 20 77 72  n only be one wr
8a00: 69 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 20 6c 6f  iter..**.** A lo
8a10: 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20 6f  ck is obtained o
8a20: 6e 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65  n the first byte
8a30: 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20 72 61 6e   of the lock ran
8a40: 67 65 20 62 65 66 6f 72 65 20 61 63 71 75 69 72  ge before acquir
8a50: 69 6e 67 0a 2a 2a 20 65 69 74 68 65 72 20 61 20  ing.** either a 
8a60: 72 65 61 64 20 6c 6f 63 6b 20 6f 72 20 61 20 77  read lock or a w
8a70: 72 69 74 65 20 6c 6f 63 6b 2e 20 20 54 68 69 73  rite lock.  This
8a80: 20 70 72 65 76 65 6e 74 73 20 74 77 6f 20 70 72   prevents two pr
8a90: 6f 63 65 73 73 65 73 20 66 72 6f 6d 0a 2a 2a 20  ocesses from.** 
8aa0: 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 67 65  attempting to ge
8ab0: 74 20 61 20 6c 6f 63 6b 20 61 74 20 61 20 73 61  t a lock at a sa
8ac0: 6d 65 20 74 69 6d 65 2e 20 20 54 68 65 20 73 65  me time.  The se
8ad0: 6d 61 6e 74 69 63 73 20 6f 66 20 0a 2a 2a 20 73  mantics of .** s
8ae0: 71 6c 69 74 65 4f 73 52 65 61 64 4c 6f 63 6b 28  qliteOsReadLock(
8af0: 29 20 72 65 71 75 69 72 65 20 74 68 61 74 20 69  ) require that i
8b00: 66 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61  f there is alrea
8b10: 64 79 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 2c  dy a write lock,
8b20: 20 74 68 61 74 0a 2a 2a 20 6c 6f 63 6b 20 69 73   that.** lock is
8b30: 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20   converted into 
8b40: 61 20 72 65 61 64 20 6c 6f 63 6b 20 61 74 6f 6d  a read lock atom
8b50: 69 63 61 6c 6c 79 2e 20 20 54 68 65 20 6c 6f 63  ically.  The loc
8b60: 6b 20 6f 6e 20 74 68 65 20 66 69 72 73 74 0a 2a  k on the first.*
8b70: 2a 20 62 79 74 65 20 61 6c 6c 6f 77 73 20 75 73  * byte allows us
8b80: 20 74 6f 20 64 72 6f 70 20 74 68 65 20 6f 6c 64   to drop the old
8b90: 20 77 72 69 74 65 20 6c 6f 63 6b 20 61 6e 64 20   write lock and 
8ba0: 67 65 74 20 74 68 65 20 72 65 61 64 20 6c 6f 63  get the read loc
8bb0: 6b 20 77 69 74 68 6f 75 74 0a 2a 2a 20 61 6e 6f  k without.** ano
8bc0: 74 68 65 72 20 70 72 6f 63 65 73 73 20 6a 75 6d  ther process jum
8bd0: 70 69 6e 67 20 69 6e 74 6f 20 74 68 65 20 6d 69  ping into the mi
8be0: 64 64 6c 65 20 61 6e 64 20 6d 65 73 73 69 6e 67  ddle and messing
8bf0: 20 75 73 20 75 70 2e 20 20 54 68 65 20 73 61 6d   us up.  The sam
8c00: 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 61 70  e.** argument ap
8c10: 70 6c 69 65 73 20 74 6f 20 73 71 6c 69 74 65 4f  plies to sqliteO
8c20: 73 57 72 69 74 65 4c 6f 63 6b 28 29 2e 0a 2a 2a  sWriteLock()..**
8c30: 0a 2a 2a 20 4f 6e 20 57 69 6e 4e 54 2f 32 4b 2f  .** On WinNT/2K/
8c40: 58 50 20 73 79 73 74 65 6d 73 2c 20 4c 6f 63 6b  XP systems, Lock
8c50: 46 69 6c 65 45 78 28 29 20 61 6e 64 20 55 6e 6c  FileEx() and Unl
8c60: 6f 63 6b 46 69 6c 65 45 78 28 29 20 61 72 65 20  ockFileEx() are 
8c70: 61 76 61 69 6c 61 62 6c 65 2c 0a 2a 2a 20 77 68  available,.** wh
8c80: 69 63 68 20 6d 65 61 6e 73 20 77 65 20 63 61 6e  ich means we can
8c90: 20 75 73 65 20 72 65 61 64 65 72 2f 77 72 69 74   use reader/writ
8ca0: 65 72 20 6c 6f 63 6b 73 2e 20 20 57 68 65 6e 20  er locks.  When 
8cb0: 72 65 61 64 65 72 20 77 72 69 74 65 72 20 6c 6f  reader writer lo
8cc0: 63 6b 73 0a 2a 2a 20 61 72 65 20 75 73 65 64 2c  cks.** are used,
8cd0: 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 70 6c 61   the lock is pla
8ce0: 63 65 64 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  ced on the same 
8cf0: 72 61 6e 67 65 20 6f 66 20 62 79 74 65 73 20 74  range of bytes t
8d00: 68 61 74 20 69 73 20 75 73 65 64 0a 2a 2a 20 66  hat is used.** f
8d10: 6f 72 20 70 72 6f 62 61 62 69 6c 69 73 74 69 63  or probabilistic
8d20: 20 6c 6f 63 6b 69 6e 67 20 69 6e 20 57 69 6e 39   locking in Win9
8d30: 35 2f 39 38 2f 4d 45 2e 20 20 48 65 6e 63 65 2c  5/98/ME.  Hence,
8d40: 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 73 63 68   the locking sch
8d50: 65 6d 65 0a 2a 2a 20 77 69 6c 6c 20 73 75 70 70  eme.** will supp
8d60: 6f 72 74 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20  ort two or more 
8d70: 57 69 6e 39 35 20 72 65 61 64 65 72 73 20 6f 72  Win95 readers or
8d80: 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 57 69 6e   two or more Win
8d90: 4e 54 20 72 65 61 64 65 72 73 2e 0a 2a 2a 20 42  NT readers..** B
8da0: 75 74 20 61 20 73 69 6e 67 6c 65 20 57 69 6e 39  ut a single Win9
8db0: 35 20 72 65 61 64 65 72 20 77 69 6c 6c 20 6c 6f  5 reader will lo
8dc0: 63 6b 20 6f 75 74 20 61 6c 6c 20 57 69 6e 4e 54  ck out all WinNT
8dd0: 20 72 65 61 64 65 72 73 20 61 6e 64 20 61 20 73   readers and a s
8de0: 69 6e 67 6c 65 0a 2a 2a 20 57 69 6e 4e 54 20 72  ingle.** WinNT r
8df0: 65 61 64 65 72 20 77 69 6c 6c 20 6c 6f 63 6b 20  eader will lock 
8e00: 6f 75 74 20 61 6c 6c 20 6f 74 68 65 72 20 57 69  out all other Wi
8e10: 6e 39 35 20 72 65 61 64 65 72 73 2e 0a 2a 2a 0a  n95 readers..**.
8e20: 2a 2a 20 4e 6f 74 65 3a 20 4f 6e 20 4d 61 63 4f  ** Note: On MacO
8e30: 53 20 77 65 20 75 73 65 20 74 68 65 20 72 65 73  S we use the res
8e40: 6f 75 72 63 65 20 66 6f 72 6b 20 66 6f 72 20 6c  ource fork for l
8e50: 6f 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  ocking..**.** Th
8e60: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 23 64 65 66  e following #def
8e70: 69 6e 65 73 20 73 70 65 63 69 66 79 20 74 68 65  ines specify the
8e80: 20 72 61 6e 67 65 20 6f 66 20 62 79 74 65 73 20   range of bytes 
8e90: 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67  used for locking
8ea0: 2e 0a 2a 2a 20 4e 5f 4c 4f 43 4b 42 59 54 45 20  ..** N_LOCKBYTE 
8eb0: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
8ec0: 20 62 79 74 65 73 20 61 76 61 69 6c 61 62 6c 65   bytes available
8ed0: 20 66 6f 72 20 64 6f 69 6e 67 20 74 68 65 20 6c   for doing the l
8ee0: 6f 63 6b 69 6e 67 2e 0a 2a 2a 20 54 68 65 20 66  ocking..** The f
8ef0: 69 72 73 74 20 62 79 74 65 20 75 73 65 64 20 74  irst byte used t
8f00: 6f 20 68 6f 6c 64 20 74 68 65 20 6c 6f 63 6b 20  o hold the lock 
8f10: 77 68 69 6c 65 20 74 68 65 20 6c 6f 63 6b 20 69  while the lock i
8f20: 73 20 63 68 61 6e 67 69 6e 67 20 64 6f 65 73 0a  s changing does.
8f30: 2a 2a 20 6e 6f 74 20 63 6f 75 6e 74 20 74 6f 77  ** not count tow
8f40: 61 72 64 20 74 68 69 73 20 6e 75 6d 62 65 72 2e  ard this number.
8f50: 20 20 46 49 52 53 54 5f 4c 4f 43 4b 42 59 54 45    FIRST_LOCKBYTE
8f60: 20 69 73 20 74 68 65 20 61 64 64 72 65 73 73 20   is the address 
8f70: 6f 66 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  of.** the first 
8f80: 62 79 74 65 20 69 6e 20 74 68 65 20 72 61 6e 67  byte in the rang
8f90: 65 20 6f 66 20 62 79 74 65 73 20 75 73 65 64 20  e of bytes used 
8fa0: 66 6f 72 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a  for locking..*/.
8fb0: 23 64 65 66 69 6e 65 20 4e 5f 4c 4f 43 4b 42 59  #define N_LOCKBY
8fc0: 54 45 20 20 20 20 20 20 20 31 30 32 33 39 0a 23  TE       10239.#
8fd0: 69 66 20 4f 53 5f 4d 41 43 0a 23 20 64 65 66 69  if OS_MAC.# defi
8fe0: 6e 65 20 46 49 52 53 54 5f 4c 4f 43 4b 42 59 54  ne FIRST_LOCKBYT
8ff0: 45 20 20 20 28 30 78 30 30 30 66 66 66 66 66 20  E   (0x000fffff 
9000: 2d 20 4e 5f 4c 4f 43 4b 42 59 54 45 29 0a 23 65  - N_LOCKBYTE).#e
9010: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 46 49 52  lse.# define FIR
9020: 53 54 5f 4c 4f 43 4b 42 59 54 45 20 20 20 28 30  ST_LOCKBYTE   (0
9030: 78 66 66 66 66 66 66 66 66 20 2d 20 4e 5f 4c 4f  xffffffff - N_LO
9040: 43 4b 42 59 54 45 29 0a 23 65 6e 64 69 66 0a 0a  CKBYTE).#endif..
9050: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
9060: 20 73 74 61 74 75 73 20 6f 66 20 74 68 65 20 6c   status of the l
9070: 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 20  ock on the file 
9080: 22 69 64 22 20 74 6f 20 62 65 20 61 20 72 65 61  "id" to be a rea
9090: 64 6c 6f 63 6b 2e 0a 2a 2a 20 49 66 20 74 68 65  dlock..** If the
90a0: 20 66 69 6c 65 20 77 61 73 20 77 72 69 74 65 20   file was write 
90b0: 6c 6f 63 6b 65 64 2c 20 74 68 65 6e 20 74 68 69  locked, then thi
90c0: 73 20 72 65 64 75 63 65 73 20 74 68 65 20 6c 6f  s reduces the lo
90d0: 63 6b 20 74 6f 20 61 20 72 65 61 64 2e 0a 2a 2a  ck to a read..**
90e0: 20 49 66 20 74 68 65 20 66 69 6c 65 20 77 61 73   If the file was
90f0: 20 72 65 61 64 20 6c 6f 63 6b 65 64 2c 20 74 68   read locked, th
9100: 65 6e 20 74 68 69 73 20 61 63 71 75 69 72 65 73  en this acquires
9110: 20 61 20 6e 65 77 20 72 65 61 64 20 6c 6f 63 6b   a new read lock
9120: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
9130: 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
9140: 65 73 73 20 61 6e 64 20 53 51 4c 49 54 45 5f 42  ess and SQLITE_B
9150: 55 53 59 20 6f 6e 20 66 61 69 6c 75 72 65 2e 20  USY on failure. 
9160: 20 49 66 20 74 68 69 73 0a 2a 2a 20 6c 69 62 72   If this.** libr
9170: 61 72 79 20 77 61 73 20 63 6f 6d 70 69 6c 65 64  ary was compiled
9180: 20 77 69 74 68 20 6c 61 72 67 65 20 66 69 6c 65   with large file
9190: 20 73 75 70 70 6f 72 74 20 28 4c 46 53 29 20 62   support (LFS) b
91a0: 75 74 20 4c 46 53 20 69 73 20 6e 6f 74 0a 2a 2a  ut LFS is not.**
91b0: 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 74 68   available on th
91c0: 65 20 68 6f 73 74 2c 20 74 68 65 6e 20 61 6e 20  e host, then an 
91d0: 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 20 69 73 20  SQLITE_NOLFS is 
91e0: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74  returned..*/.int
91f0: 20 73 71 6c 69 74 65 4f 73 52 65 61 64 4c 6f 63   sqliteOsReadLoc
9200: 6b 28 4f 73 46 69 6c 65 20 2a 69 64 29 7b 0a 23  k(OsFile *id){.#
9210: 69 66 20 4f 53 5f 55 4e 49 58 0a 20 20 69 6e 74  if OS_UNIX.  int
9220: 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 4f 73 45   rc;.  sqliteOsE
9230: 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 69  nterMutex();.  i
9240: 66 28 20 69 64 2d 3e 70 4c 6f 63 6b 2d 3e 63 6e  f( id->pLock->cn
9250: 74 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 21  t>0 ){.    if( !
9260: 69 64 2d 3e 6c 6f 63 6b 65 64 20 29 7b 0a 20 20  id->locked ){.  
9270: 20 20 20 20 69 64 2d 3e 70 4c 6f 63 6b 2d 3e 63      id->pLock->c
9280: 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 69 64 2d 3e  nt++;.      id->
9290: 6c 6f 63 6b 65 64 20 3d 20 31 3b 0a 20 20 20 20  locked = 1;.    
92a0: 20 20 69 64 2d 3e 70 4f 70 65 6e 2d 3e 6e 4c 6f    id->pOpen->nLo
92b0: 63 6b 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ck++;.    }.    
92c0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
92d0: 20 20 7d 65 6c 73 65 20 69 66 28 20 69 64 2d 3e    }else if( id->
92e0: 6c 6f 63 6b 65 64 20 7c 7c 20 69 64 2d 3e 70 4c  locked || id->pL
92f0: 6f 63 6b 2d 3e 63 6e 74 3d 3d 30 20 29 7b 0a 20  ock->cnt==0 ){. 
9300: 20 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20     struct flock 
9310: 6c 6f 63 6b 3b 0a 20 20 20 20 69 6e 74 20 73 3b  lock;.    int s;
9320: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65  .    lock.l_type
9330: 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 20 20   = F_RDLCK;.    
9340: 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20  lock.l_whence = 
9350: 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 6c 6f  SEEK_SET;.    lo
9360: 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 6c 6f 63  ck.l_start = loc
9370: 6b 2e 6c 5f 6c 65 6e 20 3d 20 30 4c 3b 0a 20 20  k.l_len = 0L;.  
9380: 20 20 73 20 3d 20 66 63 6e 74 6c 28 69 64 2d 3e    s = fcntl(id->
9390: 66 64 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f  fd, F_SETLK, &lo
93a0: 63 6b 29 3b 0a 20 20 20 20 69 66 28 20 73 21 3d  ck);.    if( s!=
93b0: 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
93c0: 28 65 72 72 6e 6f 3d 3d 45 49 4e 56 41 4c 29 20  (errno==EINVAL) 
93d0: 3f 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 20 3a  ? SQLITE_NOLFS :
93e0: 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
93f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
9400: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
9410: 20 20 20 20 20 69 66 28 20 21 69 64 2d 3e 6c 6f       if( !id->lo
9420: 63 6b 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20  cked ){.        
9430: 69 64 2d 3e 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b  id->pOpen->nLock
9440: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 64 2d 3e  ++;.        id->
9450: 6c 6f 63 6b 65 64 20 3d 20 31 3b 0a 20 20 20 20  locked = 1;.    
9460: 20 20 7d 0a 20 20 20 20 20 20 69 64 2d 3e 70 4c    }.      id->pL
9470: 6f 63 6b 2d 3e 63 6e 74 20 3d 20 31 3b 0a 20 20  ock->cnt = 1;.  
9480: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
9490: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
94a0: 59 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 4f  Y;.  }.  sqliteO
94b0: 73 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  sLeaveMutex();. 
94c0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64   return rc;.#end
94d0: 69 66 0a 23 69 66 20 4f 53 5f 57 49 4e 0a 20 20  if.#if OS_WIN.  
94e0: 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 69 64  int rc;.  if( id
94f0: 2d 3e 6c 6f 63 6b 65 64 3e 30 20 29 7b 0a 20 20  ->locked>0 ){.  
9500: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
9510: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
9520: 6e 74 20 6c 6b 3b 0a 20 20 20 20 69 6e 74 20 72  nt lk;.    int r
9530: 65 73 3b 0a 20 20 20 20 69 6e 74 20 63 6e 74 20  es;.    int cnt 
9540: 3d 20 31 30 30 3b 0a 20 20 20 20 73 71 6c 69 74  = 100;.    sqlit
9550: 65 52 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65  eRandomness(size
9560: 6f 66 28 6c 6b 29 2c 20 26 6c 6b 29 3b 0a 20 20  of(lk), &lk);.  
9570: 20 20 6c 6b 20 3d 20 28 6c 6b 20 26 20 30 78 37    lk = (lk & 0x7
9580: 66 66 66 66 66 66 66 29 25 4e 5f 4c 4f 43 4b 42  fffffff)%N_LOCKB
9590: 59 54 45 20 2b 20 31 3b 0a 20 20 20 20 77 68 69  YTE + 1;.    whi
95a0: 6c 65 28 20 63 6e 74 2d 2d 3e 30 20 26 26 20 28  le( cnt-->0 && (
95b0: 72 65 73 20 3d 20 4c 6f 63 6b 46 69 6c 65 28 69  res = LockFile(i
95c0: 64 2d 3e 68 2c 20 46 49 52 53 54 5f 4c 4f 43 4b  d->h, FIRST_LOCK
95d0: 42 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 29 3d  BYTE, 0, 1, 0))=
95e0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 53 6c 65 65  =0 ){.      Slee
95f0: 70 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  p(1);.    }.    
9600: 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20  if( res ){.     
9610: 20 55 6e 6c 6f 63 6b 46 69 6c 65 28 69 64 2d 3e   UnlockFile(id->
9620: 68 2c 20 46 49 52 53 54 5f 4c 4f 43 4b 42 59 54  h, FIRST_LOCKBYT
9630: 45 2b 31 2c 20 30 2c 20 4e 5f 4c 4f 43 4b 42 59  E+1, 0, N_LOCKBY
9640: 54 45 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  TE, 0);.      if
9650: 28 20 69 73 4e 54 28 29 20 29 7b 0a 20 20 20 20  ( isNT() ){.    
9660: 20 20 20 20 4f 56 45 52 4c 41 50 50 45 44 20 6f      OVERLAPPED o
9670: 76 6c 70 3b 0a 20 20 20 20 20 20 20 20 6f 76 6c  vlp;.        ovl
9680: 70 2e 4f 66 66 73 65 74 20 3d 20 46 49 52 53 54  p.Offset = FIRST
9690: 5f 4c 4f 43 4b 42 59 54 45 2b 31 3b 0a 20 20 20  _LOCKBYTE+1;.   
96a0: 20 20 20 20 20 6f 76 6c 70 2e 4f 66 66 73 65 74       ovlp.Offset
96b0: 48 69 67 68 20 3d 20 30 3b 0a 20 20 20 20 20 20  High = 0;.      
96c0: 20 20 6f 76 6c 70 2e 68 45 76 65 6e 74 20 3d 20    ovlp.hEvent = 
96d0: 30 3b 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d  0;.        res =
96e0: 20 4c 6f 63 6b 46 69 6c 65 45 78 28 69 64 2d 3e   LockFileEx(id->
96f0: 68 2c 20 4c 4f 43 4b 46 49 4c 45 5f 46 41 49 4c  h, LOCKFILE_FAIL
9700: 5f 49 4d 4d 45 44 49 41 54 45 4c 59 2c 20 0a 20  _IMMEDIATELY, . 
9710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9720: 20 20 20 20 20 20 20 20 20 30 2c 20 4e 5f 4c 4f           0, N_LO
9730: 43 4b 42 59 54 45 2c 20 30 2c 20 26 6f 76 6c 70  CKBYTE, 0, &ovlp
9740: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
9750: 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 4c 6f          res = Lo
9760: 63 6b 46 69 6c 65 28 69 64 2d 3e 68 2c 20 46 49  ckFile(id->h, FI
9770: 52 53 54 5f 4c 4f 43 4b 42 59 54 45 2b 6c 6b 2c  RST_LOCKBYTE+lk,
9780: 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20   0, 1, 0);.     
9790: 20 7d 0a 20 20 20 20 20 20 55 6e 6c 6f 63 6b 46   }.      UnlockF
97a0: 69 6c 65 28 69 64 2d 3e 68 2c 20 46 49 52 53 54  ile(id->h, FIRST
97b0: 5f 4c 4f 43 4b 42 59 54 45 2c 20 30 2c 20 31 2c  _LOCKBYTE, 0, 1,
97c0: 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   0);.    }.    i
97d0: 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20  f( res ){.      
97e0: 69 64 2d 3e 6c 6f 63 6b 65 64 20 3d 20 6c 6b 3b  id->locked = lk;
97f0: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
9800: 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65  TE_OK;.    }else
9810: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
9820: 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a  ITE_BUSY;.    }.
9830: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
9840: 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f 53 5f 4d  .#endif.#if OS_M
9850: 41 43 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  AC.  int rc;.  i
9860: 66 28 20 69 64 2d 3e 6c 6f 63 6b 65 64 3e 30 20  f( id->locked>0 
9870: 7c 7c 20 69 64 2d 3e 72 65 66 4e 75 6d 52 46 20  || id->refNumRF 
9880: 3d 3d 20 2d 31 20 29 7b 0a 20 20 20 20 72 63 20  == -1 ){.    rc 
9890: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  = SQLITE_OK;.  }
98a0: 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6c 6b  else{.    int lk
98b0: 3b 0a 20 20 20 20 4f 53 45 72 72 20 72 65 73 3b  ;.    OSErr res;
98c0: 0a 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 35  .    int cnt = 5
98d0: 3b 0a 20 20 20 20 50 61 72 61 6d 42 6c 6f 63 6b  ;.    ParamBlock
98e0: 52 65 63 20 70 61 72 61 6d 73 3b 0a 20 20 20 20  Rec params;.    
98f0: 73 71 6c 69 74 65 52 61 6e 64 6f 6d 6e 65 73 73  sqliteRandomness
9900: 28 73 69 7a 65 6f 66 28 6c 6b 29 2c 20 26 6c 6b  (sizeof(lk), &lk
9910: 29 3b 0a 20 20 20 20 6c 6b 20 3d 20 28 6c 6b 20  );.    lk = (lk 
9920: 26 20 30 78 37 66 66 66 66 66 66 66 29 25 4e 5f  & 0x7fffffff)%N_
9930: 4c 4f 43 4b 42 59 54 45 20 2b 20 31 3b 0a 20 20  LOCKBYTE + 1;.  
9940: 20 20 6d 65 6d 73 65 74 28 26 70 61 72 61 6d 73    memset(&params
9950: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 61 72 61  , 0, sizeof(para
9960: 6d 73 29 29 3b 0a 20 20 20 20 70 61 72 61 6d 73  ms));.    params
9970: 2e 69 6f 50 61 72 61 6d 2e 69 6f 52 65 66 4e 75  .ioParam.ioRefNu
9980: 6d 20 3d 20 69 64 2d 3e 72 65 66 4e 75 6d 52 46  m = id->refNumRF
9990: 3b 0a 20 20 20 20 70 61 72 61 6d 73 2e 69 6f 50  ;.    params.ioP
99a0: 61 72 61 6d 2e 69 6f 50 6f 73 4d 6f 64 65 20 3d  aram.ioPosMode =
99b0: 20 66 73 46 72 6f 6d 53 74 61 72 74 3b 0a 20 20   fsFromStart;.  
99c0: 20 20 70 61 72 61 6d 73 2e 69 6f 50 61 72 61 6d    params.ioParam
99d0: 2e 69 6f 50 6f 73 4f 66 66 73 65 74 20 3d 20 46  .ioPosOffset = F
99e0: 49 52 53 54 5f 4c 4f 43 4b 42 59 54 45 3b 0a 20  IRST_LOCKBYTE;. 
99f0: 20 20 20 70 61 72 61 6d 73 2e 69 6f 50 61 72 61     params.ioPara
9a00: 6d 2e 69 6f 52 65 71 43 6f 75 6e 74 20 3d 20 31  m.ioReqCount = 1
9a10: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 63 6e 74  ;.    while( cnt
9a20: 2d 2d 3e 30 20 26 26 20 28 72 65 73 20 3d 20 50  -->0 && (res = P
9a30: 42 4c 6f 63 6b 52 61 6e 67 65 53 79 6e 63 28 26  BLockRangeSync(&
9a40: 70 61 72 61 6d 73 29 29 21 3d 6e 6f 45 72 72 20  params))!=noErr 
9a50: 29 7b 0a 20 20 20 20 20 20 55 49 6e 74 33 32 20  ){.      UInt32 
9a60: 66 69 6e 61 6c 54 69 63 6b 73 3b 0a 20 20 20 20  finalTicks;.    
9a70: 20 20 44 65 6c 61 79 28 31 2c 20 26 66 69 6e 61    Delay(1, &fina
9a80: 6c 54 69 63 6b 73 29 3b 20 2f 2a 20 31 2f 36 30  lTicks); /* 1/60
9a90: 20 73 65 63 20 2a 2f 0a 20 20 20 20 7d 0a 20 20   sec */.    }.  
9aa0: 20 20 69 66 28 20 72 65 73 20 3d 3d 20 6e 6f 45    if( res == noE
9ab0: 72 72 20 29 7b 0a 20 20 20 20 20 20 70 61 72 61  rr ){.      para
9ac0: 6d 73 2e 69 6f 50 61 72 61 6d 2e 69 6f 50 6f 73  ms.ioParam.ioPos
9ad0: 4f 66 66 73 65 74 20 3d 20 46 49 52 53 54 5f 4c  Offset = FIRST_L
9ae0: 4f 43 4b 42 59 54 45 2b 31 3b 0a 20 20 20 20 20  OCKBYTE+1;.     
9af0: 20 70 61 72 61 6d 73 2e 69 6f 50 61 72 61 6d 2e   params.ioParam.
9b00: 69 6f 52 65 71 43 6f 75 6e 74 20 3d 20 4e 5f 4c  ioReqCount = N_L
9b10: 4f 43 4b 42 59 54 45 3b 0a 20 20 20 20 20 20 50  OCKBYTE;.      P
9b20: 42 55 6e 6c 6f 63 6b 52 61 6e 67 65 53 79 6e 63  BUnlockRangeSync
9b30: 28 26 70 61 72 61 6d 73 29 3b 0a 20 20 20 20 20  (&params);.     
9b40: 20 70 61 72 61 6d 73 2e 69 6f 50 61 72 61 6d 2e   params.ioParam.
9b50: 69 6f 50 6f 73 4f 66 66 73 65 74 20 3d 20 46 49  ioPosOffset = FI
9b60: 52 53 54 5f 4c 4f 43 4b 42 59 54 45 2b 6c 6b 3b  RST_LOCKBYTE+lk;
9b70: 0a 20 20 20 20 20 20 70 61 72 61 6d 73 2e 69 6f  .      params.io
9b80: 50 61 72 61 6d 2e 69 6f 52 65 71 43 6f 75 6e 74  Param.ioReqCount
9b90: 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 65 73 20   = 1;.      res 
9ba0: 3d 20 50 42 4c 6f 63 6b 52 61 6e 67 65 53 79 6e  = PBLockRangeSyn
9bb0: 63 28 26 70 61 72 61 6d 73 29 3b 0a 20 20 20 20  c(&params);.    
9bc0: 20 20 70 61 72 61 6d 73 2e 69 6f 50 61 72 61 6d    params.ioParam
9bd0: 2e 69 6f 50 6f 73 4f 66 66 73 65 74 20 3d 20 46  .ioPosOffset = F
9be0: 49 52 53 54 5f 4c 4f 43 4b 42 59 54 45 3b 0a 20  IRST_LOCKBYTE;. 
9bf0: 20 20 20 20 20 70 61 72 61 6d 73 2e 69 6f 50 61       params.ioPa
9c00: 72 61 6d 2e 69 6f 52 65 71 43 6f 75 6e 74 20 3d  ram.ioReqCount =
9c10: 20 31 3b 0a 20 20 20 20 20 20 50 42 55 6e 6c 6f   1;.      PBUnlo
9c20: 63 6b 52 61 6e 67 65 53 79 6e 63 28 26 70 61 72  ckRangeSync(&par
9c30: 61 6d 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ams);.    }.    
9c40: 69 66 28 20 72 65 73 20 3d 3d 20 6e 6f 45 72 72  if( res == noErr
9c50: 20 29 7b 0a 20 20 20 20 20 20 69 64 2d 3e 6c 6f   ){.      id->lo
9c60: 63 6b 65 64 20 3d 20 6c 6b 3b 0a 20 20 20 20 20  cked = lk;.     
9c70: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
9c80: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
9c90: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
9ca0: 53 59 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  SY;.    }.  }.  
9cb0: 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69  return rc;.#endi
9cc0: 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  f.}../*.** Chang
9cd0: 65 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 75  e the lock statu
9ce0: 73 20 74 6f 20 62 65 20 61 6e 20 65 78 63 6c 75  s to be an exclu
9cf0: 73 69 76 65 20 6f 72 20 77 72 69 74 65 20 6c 6f  sive or write lo
9d00: 63 6b 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 53  ck.  Return.** S
9d10: 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
9d20: 65 73 73 20 61 6e 64 20 53 51 4c 49 54 45 5f 42  ess and SQLITE_B
9d30: 55 53 59 20 6f 6e 20 61 20 66 61 69 6c 75 72 65  USY on a failure
9d40: 2e 20 20 49 66 20 74 68 69 73 0a 2a 2a 20 6c 69  .  If this.** li
9d50: 62 72 61 72 79 20 77 61 73 20 63 6f 6d 70 69 6c  brary was compil
9d60: 65 64 20 77 69 74 68 20 6c 61 72 67 65 20 66 69  ed with large fi
9d70: 6c 65 20 73 75 70 70 6f 72 74 20 28 4c 46 53 29  le support (LFS)
9d80: 20 62 75 74 20 4c 46 53 20 69 73 20 6e 6f 74 0a   but LFS is not.
9d90: 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20  ** available on 
9da0: 74 68 65 20 68 6f 73 74 2c 20 74 68 65 6e 20 61  the host, then a
9db0: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 20 69  n SQLITE_NOLFS i
9dc0: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69  s returned..*/.i
9dd0: 6e 74 20 73 71 6c 69 74 65 4f 73 57 72 69 74 65  nt sqliteOsWrite
9de0: 4c 6f 63 6b 28 4f 73 46 69 6c 65 20 2a 69 64 29  Lock(OsFile *id)
9df0: 7b 0a 23 69 66 20 4f 53 5f 55 4e 49 58 0a 20 20  {.#if OS_UNIX.  
9e00: 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
9e10: 4f 73 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  OsEnterMutex();.
9e20: 20 20 69 66 28 20 69 64 2d 3e 70 4c 6f 63 6b 2d    if( id->pLock-
9e30: 3e 63 6e 74 3d 3d 30 20 7c 7c 20 28 69 64 2d 3e  >cnt==0 || (id->
9e40: 70 4c 6f 63 6b 2d 3e 63 6e 74 3d 3d 31 20 26 26  pLock->cnt==1 &&
9e50: 20 69 64 2d 3e 6c 6f 63 6b 65 64 3d 3d 31 29 20   id->locked==1) 
9e60: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 66 6c  ){.    struct fl
9e70: 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 20 20 69 6e  ock lock;.    in
9e80: 74 20 73 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  t s;.    lock.l_
9e90: 74 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a  type = F_WRLCK;.
9ea0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63      lock.l_whenc
9eb0: 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
9ec0: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
9ed0: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 30 4c   lock.l_len = 0L
9ee0: 3b 0a 20 20 20 20 73 20 3d 20 66 63 6e 74 6c 28  ;.    s = fcntl(
9ef0: 69 64 2d 3e 66 64 2c 20 46 5f 53 45 54 4c 4b 2c  id->fd, F_SETLK,
9f00: 20 26 6c 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28   &lock);.    if(
9f10: 20 73 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72   s!=0 ){.      r
9f20: 63 20 3d 20 28 65 72 72 6e 6f 3d 3d 45 49 4e 56  c = (errno==EINV
9f30: 41 4c 29 20 3f 20 53 51 4c 49 54 45 5f 4e 4f 4c  AL) ? SQLITE_NOL
9f40: 46 53 20 3a 20 53 51 4c 49 54 45 5f 42 55 53 59  FS : SQLITE_BUSY
9f50: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
9f60: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
9f70: 4b 3b 0a 20 20 20 20 20 20 69 66 28 20 21 69 64  K;.      if( !id
9f80: 2d 3e 6c 6f 63 6b 65 64 20 29 7b 0a 20 20 20 20  ->locked ){.    
9f90: 20 20 20 20 69 64 2d 3e 70 4f 70 65 6e 2d 3e 6e      id->pOpen->n
9fa0: 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 20 20 20 20  Lock++;.        
9fb0: 69 64 2d 3e 6c 6f 63 6b 65 64 20 3d 20 31 3b 0a  id->locked = 1;.
9fc0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 64        }.      id
9fd0: 2d 3e 70 4c 6f 63 6b 2d 3e 63 6e 74 20 3d 20 2d  ->pLock->cnt = -
9fe0: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  1;.    }.  }else
9ff0: 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
a000: 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 20 20 73 71  E_BUSY;.  }.  sq
a010: 6c 69 74 65 4f 73 4c 65 61 76 65 4d 75 74 65 78  liteOsLeaveMutex
a020: 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ();.  return rc;
a030: 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f 53 5f 57  .#endif.#if OS_W
a040: 49 4e 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  IN.  int rc;.  i
a050: 66 28 20 69 64 2d 3e 6c 6f 63 6b 65 64 3c 30 20  f( id->locked<0 
a060: 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
a070: 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  TE_OK;.  }else{.
a080: 20 20 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 20      int res;.   
a090: 20 69 6e 74 20 63 6e 74 20 3d 20 31 30 30 3b 0a   int cnt = 100;.
a0a0: 20 20 20 20 77 68 69 6c 65 28 20 63 6e 74 2d 2d      while( cnt--
a0b0: 3e 30 20 26 26 20 28 72 65 73 20 3d 20 4c 6f 63  >0 && (res = Loc
a0c0: 6b 46 69 6c 65 28 69 64 2d 3e 68 2c 20 46 49 52  kFile(id->h, FIR
a0d0: 53 54 5f 4c 4f 43 4b 42 59 54 45 2c 20 30 2c 20  ST_LOCKBYTE, 0, 
a0e0: 31 2c 20 30 29 29 3d 3d 30 20 29 7b 0a 20 20 20  1, 0))==0 ){.   
a0f0: 20 20 20 53 6c 65 65 70 28 31 29 3b 0a 20 20 20     Sleep(1);.   
a100: 20 7d 0a 20 20 20 20 69 66 28 20 72 65 73 20 29   }.    if( res )
a110: 7b 0a 20 20 20 20 20 20 69 66 28 20 69 64 2d 3e  {.      if( id->
a120: 6c 6f 63 6b 65 64 3e 30 20 29 7b 0a 20 20 20 20  locked>0 ){.    
a130: 20 20 20 20 69 66 28 20 69 73 4e 54 28 29 20 29      if( isNT() )
a140: 7b 0a 20 20 20 20 20 20 20 20 20 20 55 6e 6c 6f  {.          Unlo
a150: 63 6b 46 69 6c 65 28 69 64 2d 3e 68 2c 20 46 49  ckFile(id->h, FI
a160: 52 53 54 5f 4c 4f 43 4b 42 59 54 45 2b 31 2c 20  RST_LOCKBYTE+1, 
a170: 30 2c 20 4e 5f 4c 4f 43 4b 42 59 54 45 2c 20 30  0, N_LOCKBYTE, 0
a180: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
a190: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 73 20  {.          res 
a1a0: 3d 20 55 6e 6c 6f 63 6b 46 69 6c 65 28 69 64 2d  = UnlockFile(id-
a1b0: 3e 68 2c 20 46 49 52 53 54 5f 4c 4f 43 4b 42 59  >h, FIRST_LOCKBY
a1c0: 54 45 20 2b 20 69 64 2d 3e 6c 6f 63 6b 65 64 2c  TE + id->locked,
a1d0: 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20   0, 1, 0);.     
a1e0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
a1f0: 20 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20     if( res ){.  
a200: 20 20 20 20 20 20 72 65 73 20 3d 20 4c 6f 63 6b        res = Lock
a210: 46 69 6c 65 28 69 64 2d 3e 68 2c 20 46 49 52 53  File(id->h, FIRS
a220: 54 5f 4c 4f 43 4b 42 59 54 45 2b 31 2c 20 30 2c  T_LOCKBYTE+1, 0,
a230: 20 4e 5f 4c 4f 43 4b 42 59 54 45 2c 20 30 29 3b   N_LOCKBYTE, 0);
a240: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
a250: 20 20 20 20 20 20 72 65 73 20 3d 20 30 3b 0a 20        res = 0;. 
a260: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 55 6e 6c       }.      Unl
a270: 6f 63 6b 46 69 6c 65 28 69 64 2d 3e 68 2c 20 46  ockFile(id->h, F
a280: 49 52 53 54 5f 4c 4f 43 4b 42 59 54 45 2c 20 30  IRST_LOCKBYTE, 0
a290: 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  , 1, 0);.    }. 
a2a0: 20 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20     if( res ){.  
a2b0: 20 20 20 20 69 64 2d 3e 6c 6f 63 6b 65 64 20 3d      id->locked =
a2c0: 20 2d 31 3b 0a 20 20 20 20 20 20 72 63 20 3d 20   -1;.      rc = 
a2d0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
a2e0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
a2f0: 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
a300: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
a310: 20 72 63 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20   rc;.#endif.#if 
a320: 4f 53 5f 4d 41 43 0a 20 20 69 6e 74 20 72 63 3b  OS_MAC.  int rc;
a330: 0a 20 20 69 66 28 20 69 64 2d 3e 6c 6f 63 6b 65  .  if( id->locke
a340: 64 3c 30 20 7c 7c 20 69 64 2d 3e 72 65 66 4e 75  d<0 || id->refNu
a350: 6d 52 46 20 3d 3d 20 2d 31 20 29 7b 0a 20 20 20  mRF == -1 ){.   
a360: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
a370: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 4f 53  .  }else{.    OS
a380: 45 72 72 20 72 65 73 3b 0a 20 20 20 20 69 6e 74  Err res;.    int
a390: 20 63 6e 74 20 3d 20 35 3b 0a 20 20 20 20 50 61   cnt = 5;.    Pa
a3a0: 72 61 6d 42 6c 6f 63 6b 52 65 63 20 70 61 72 61  ramBlockRec para
a3b0: 6d 73 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26  ms;.    memset(&
a3c0: 70 61 72 61 6d 73 2c 20 30 2c 20 73 69 7a 65 6f  params, 0, sizeo
a3d0: 66 28 70 61 72 61 6d 73 29 29 3b 0a 20 20 20 20  f(params));.    
a3e0: 70 61 72 61 6d 73 2e 69 6f 50 61 72 61 6d 2e 69  params.ioParam.i
a3f0: 6f 52 65 66 4e 75 6d 20 3d 20 69 64 2d 3e 72 65  oRefNum = id->re
a400: 66 4e 75 6d 52 46 3b 0a 20 20 20 20 70 61 72 61  fNumRF;.    para
a410: 6d 73 2e 69 6f 50 61 72 61 6d 2e 69 6f 50 6f 73  ms.ioParam.ioPos
a420: 4d 6f 64 65 20 3d 20 66 73 46 72 6f 6d 53 74 61  Mode = fsFromSta
a430: 72 74 3b 0a 20 20 20 20 70 61 72 61 6d 73 2e 69  rt;.    params.i
a440: 6f 50 61 72 61 6d 2e 69 6f 50 6f 73 4f 66 66 73  oParam.ioPosOffs
a450: 65 74 20 3d 20 46 49 52 53 54 5f 4c 4f 43 4b 42  et = FIRST_LOCKB
a460: 59 54 45 3b 0a 20 20 20 20 70 61 72 61 6d 73 2e  YTE;.    params.
a470: 69 6f 50 61 72 61 6d 2e 69 6f 52 65 71 43 6f 75  ioParam.ioReqCou
a480: 6e 74 20 3d 20 31 3b 0a 20 20 20 20 77 68 69 6c  nt = 1;.    whil
a490: 65 28 20 63 6e 74 2d 2d 3e 30 20 26 26 20 28 72  e( cnt-->0 && (r
a4a0: 65 73 20 3d 20 50 42 4c 6f 63 6b 52 61 6e 67 65  es = PBLockRange
a4b0: 53 79 6e 63 28 26 70 61 72 61 6d 73 29 29 21 3d  Sync(&params))!=
a4c0: 6e 6f 45 72 72 20 29 7b 0a 20 20 20 20 20 20 55  noErr ){.      U
a4d0: 49 6e 74 33 32 20 66 69 6e 61 6c 54 69 63 6b 73  Int32 finalTicks
a4e0: 3b 0a 20 20 20 20 20 20 44 65 6c 61 79 28 31 2c  ;.      Delay(1,
a4f0: 20 26 66 69 6e 61 6c 54 69 63 6b 73 29 3b 20 2f   &finalTicks); /
a500: 2a 20 31 2f 36 30 20 73 65 63 20 2a 2f 0a 20 20  * 1/60 sec */.  
a510: 20 20 7d 0a 20 20 20 20 69 66 28 20 72 65 73 20    }.    if( res 
a520: 3d 3d 20 6e 6f 45 72 72 20 29 7b 0a 20 20 20 20  == noErr ){.    
a530: 20 20 70 61 72 61 6d 73 2e 69 6f 50 61 72 61 6d    params.ioParam
a540: 2e 69 6f 50 6f 73 4f 66 66 73 65 74 20 3d 20 46  .ioPosOffset = F
a550: 49 52 53 54 5f 4c 4f 43 4b 42 59 54 45 20 2b 20  IRST_LOCKBYTE + 
a560: 69 64 2d 3e 6c 6f 63 6b 65 64 3b 0a 20 20 20 20  id->locked;.    
a570: 20 20 70 61 72 61 6d 73 2e 69 6f 50 61 72 61 6d    params.ioParam
a580: 2e 69 6f 52 65 71 43 6f 75 6e 74 20 3d 20 31 3b  .ioReqCount = 1;
a590: 0a 20 20 20 20 20 20 69 66 28 20 69 64 2d 3e 6c  .      if( id->l
a5a0: 6f 63 6b 65 64 3d 3d 30 20 0a 20 20 20 20 20 20  ocked==0 .      
a5b0: 20 20 20 20 20 20 7c 7c 20 50 42 55 6e 6c 6f 63        || PBUnloc
a5c0: 6b 52 61 6e 67 65 53 79 6e 63 28 26 70 61 72 61  kRangeSync(&para
a5d0: 6d 73 29 3d 3d 6e 6f 45 72 72 20 29 7b 0a 20 20  ms)==noErr ){.  
a5e0: 20 20 20 20 20 20 70 61 72 61 6d 73 2e 69 6f 50        params.ioP
a5f0: 61 72 61 6d 2e 69 6f 50 6f 73 4f 66 66 73 65 74  aram.ioPosOffset
a600: 20 3d 20 46 49 52 53 54 5f 4c 4f 43 4b 42 59 54   = FIRST_LOCKBYT
a610: 45 2b 31 3b 0a 20 20 20 20 20 20 20 20 70 61 72  E+1;.        par
a620: 61 6d 73 2e 69 6f 50 61 72 61 6d 2e 69 6f 52 65  ams.ioParam.ioRe
a630: 71 43 6f 75 6e 74 20 3d 20 4e 5f 4c 4f 43 4b 42  qCount = N_LOCKB
a640: 59 54 45 3b 0a 20 20 20 20 20 20 20 20 72 65 73  YTE;.        res
a650: 20 3d 20 50 42 4c 6f 63 6b 52 61 6e 67 65 53 79   = PBLockRangeSy
a660: 6e 63 28 26 70 61 72 61 6d 73 29 3b 0a 20 20 20  nc(&params);.   
a670: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
a680: 20 20 72 65 73 20 3d 20 61 66 70 52 61 6e 67 65    res = afpRange
a690: 4e 6f 74 4c 6f 63 6b 65 64 3b 0a 20 20 20 20 20  NotLocked;.     
a6a0: 20 7d 0a 20 20 20 20 20 20 70 61 72 61 6d 73 2e   }.      params.
a6b0: 69 6f 50 61 72 61 6d 2e 69 6f 50 6f 73 4f 66 66  ioParam.ioPosOff
a6c0: 73 65 74 20 3d 20 46 49 52 53 54 5f 4c 4f 43 4b  set = FIRST_LOCK
a6d0: 42 59 54 45 3b 0a 20 20 20 20 20 20 70 61 72 61  BYTE;.      para
a6e0: 6d 73 2e 69 6f 50 61 72 61 6d 2e 69 6f 52 65 71  ms.ioParam.ioReq
a6f0: 43 6f 75 6e 74 20 3d 20 31 3b 0a 20 20 20 20 20  Count = 1;.     
a700: 20 50 42 55 6e 6c 6f 63 6b 52 61 6e 67 65 53 79   PBUnlockRangeSy
a710: 6e 63 28 26 70 61 72 61 6d 73 29 3b 0a 20 20 20  nc(&params);.   
a720: 20 7d 0a 20 20 20 20 69 66 28 20 72 65 73 20 3d   }.    if( res =
a730: 3d 20 6e 6f 45 72 72 20 29 7b 0a 20 20 20 20 20  = noErr ){.     
a740: 20 69 64 2d 3e 6c 6f 63 6b 65 64 20 3d 20 2d 31   id->locked = -1
a750: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ;.      rc = SQL
a760: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73  ITE_OK;.    }els
a770: 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  e{.      rc = SQ
a780: 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d  LITE_BUSY;.    }
a790: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
a7a0: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
a7b0: 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 67 69 76  * Unlock the giv
a7c0: 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  en file descript
a7d0: 6f 72 2e 20 20 49 66 20 74 68 65 20 66 69 6c 65  or.  If the file
a7e0: 20 64 65 73 63 72 69 70 74 6f 72 20 77 61 73 0a   descriptor was.
a7f0: 2a 2a 20 6e 6f 74 20 70 72 65 76 69 6f 75 73 6c  ** not previousl
a800: 79 20 6c 6f 63 6b 65 64 2c 20 74 68 65 6e 20 74  y locked, then t
a810: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
a820: 20 6e 6f 2d 6f 70 2e 20 20 49 66 20 74 68 69 73   no-op.  If this
a830: 0a 2a 2a 20 6c 69 62 72 61 72 79 20 77 61 73 20  .** library was 
a840: 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 6c 61  compiled with la
a850: 72 67 65 20 66 69 6c 65 20 73 75 70 70 6f 72 74  rge file support
a860: 20 28 4c 46 53 29 20 62 75 74 20 4c 46 53 20 69   (LFS) but LFS i
a870: 73 20 6e 6f 74 0a 2a 2a 20 61 76 61 69 6c 61 62  s not.** availab
a880: 6c 65 20 6f 6e 20 74 68 65 20 68 6f 73 74 2c 20  le on the host, 
a890: 74 68 65 6e 20 61 6e 20 53 51 4c 49 54 45 5f 4e  then an SQLITE_N
a8a0: 4f 4c 46 53 20 69 73 20 72 65 74 75 72 6e 65 64  OLFS is returned
a8b0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 4f  ..*/.int sqliteO
a8c0: 73 55 6e 6c 6f 63 6b 28 4f 73 46 69 6c 65 20 2a  sUnlock(OsFile *
a8d0: 69 64 29 7b 0a 23 69 66 20 4f 53 5f 55 4e 49 58  id){.#if OS_UNIX
a8e0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28  .  int rc;.  if(
a8f0: 20 21 69 64 2d 3e 6c 6f 63 6b 65 64 20 29 20 72   !id->locked ) r
a900: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
a910: 0a 20 20 73 71 6c 69 74 65 4f 73 45 6e 74 65 72  .  sqliteOsEnter
a920: 4d 75 74 65 78 28 29 3b 0a 20 20 61 73 73 65 72  Mutex();.  asser
a930: 74 28 20 69 64 2d 3e 70 4c 6f 63 6b 2d 3e 63 6e  t( id->pLock->cn
a940: 74 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 64  t!=0 );.  if( id
a950: 2d 3e 70 4c 6f 63 6b 2d 3e 63 6e 74 3e 31 20 29  ->pLock->cnt>1 )
a960: 7b 0a 20 20 20 20 69 64 2d 3e 70 4c 6f 63 6b 2d  {.    id->pLock-
a970: 3e 63 6e 74 2d 2d 3b 0a 20 20 20 20 72 63 20 3d  >cnt--;.    rc =
a980: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
a990: 6c 73 65 7b 0a 20 20 20 20 73 74 72 75 63 74 20  lse{.    struct 
a9a0: 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 20 20  flock lock;.    
a9b0: 69 6e 74 20 73 3b 0a 20 20 20 20 6c 6f 63 6b 2e  int s;.    lock.
a9c0: 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b  l_type = F_UNLCK
a9d0: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65  ;.    lock.l_whe
a9e0: 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a  nce = SEEK_SET;.
a9f0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
aa00: 20 3d 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20   = lock.l_len = 
aa10: 30 4c 3b 0a 20 20 20 20 73 20 3d 20 66 63 6e 74  0L;.    s = fcnt
aa20: 6c 28 69 64 2d 3e 66 64 2c 20 46 5f 53 45 54 4c  l(id->fd, F_SETL
aa30: 4b 2c 20 26 6c 6f 63 6b 29 3b 0a 20 20 20 20 69  K, &lock);.    i
aa40: 66 28 20 73 21 3d 30 20 29 7b 0a 20 20 20 20 20  f( s!=0 ){.     
aa50: 20 72 63 20 3d 20 28 65 72 72 6e 6f 3d 3d 45 49   rc = (errno==EI
aa60: 4e 56 41 4c 29 20 3f 20 53 51 4c 49 54 45 5f 4e  NVAL) ? SQLITE_N
aa70: 4f 4c 46 53 20 3a 20 53 51 4c 49 54 45 5f 42 55  OLFS : SQLITE_BU
aa80: 53 59 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  SY;.    }else{. 
aa90: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
aaa0: 5f 4f 4b 3b 0a 20 20 20 20 20 20 69 64 2d 3e 70  _OK;.      id->p
aab0: 4c 6f 63 6b 2d 3e 63 6e 74 20 3d 20 30 3b 0a 20  Lock->cnt = 0;. 
aac0: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72     }.  }.  if( r
aad0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
aae0: 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74      /* Decrement
aaf0: 20 74 68 65 20 63 6f 75 6e 74 20 6f 66 20 6c 6f   the count of lo
ab00: 63 6b 73 20 61 67 61 69 6e 73 74 20 74 68 69 73  cks against this
ab10: 20 73 61 6d 65 20 66 69 6c 65 2e 20 20 57 68 65   same file.  Whe
ab20: 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f 75  n the.    ** cou
ab30: 6e 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2c  nt reaches zero,
ab40: 20 63 6c 6f 73 65 20 61 6e 79 20 6f 74 68 65 72   close any other
ab50: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
ab60: 73 20 77 68 6f 73 65 20 63 6c 6f 73 65 0a 20 20  s whose close.  
ab70: 20 20 2a 2a 20 77 61 73 20 64 65 66 65 72 72 65    ** was deferre
ab80: 64 20 62 65 63 61 75 73 65 20 6f 66 20 6f 75 74  d because of out
ab90: 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 2e 0a  standing locks..
aba0: 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 72 75 63      */.    struc
abb0: 74 20 6f 70 65 6e 43 6e 74 20 2a 70 4f 70 65 6e  t openCnt *pOpen
abc0: 20 3d 20 69 64 2d 3e 70 4f 70 65 6e 3b 0a 20 20   = id->pOpen;.  
abd0: 20 20 70 4f 70 65 6e 2d 3e 6e 4c 6f 63 6b 2d 2d    pOpen->nLock--
abe0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4f  ;.    assert( pO
abf0: 70 65 6e 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29 3b  pen->nLock>=0 );
ac00: 0a 20 20 20 20 69 66 28 20 70 4f 70 65 6e 2d 3e  .    if( pOpen->
ac10: 6e 4c 6f 63 6b 3d 3d 30 20 26 26 20 70 4f 70 65  nLock==0 && pOpe
ac20: 6e 2d 3e 6e 50 65 6e 64 69 6e 67 3e 30 20 29 7b  n->nPending>0 ){
ac30: 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
ac40: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
ac50: 4f 70 65 6e 2d 3e 6e 50 65 6e 64 69 6e 67 3b 20  Open->nPending; 
ac60: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 6c  i++){.        cl
ac70: 6f 73 65 28 70 4f 70 65 6e 2d 3e 61 50 65 6e 64  ose(pOpen->aPend
ac80: 69 6e 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d  ing[i]);.      }
ac90: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65  .      sqliteFre
aca0: 65 28 70 4f 70 65 6e 2d 3e 61 50 65 6e 64 69 6e  e(pOpen->aPendin
acb0: 67 29 3b 0a 20 20 20 20 20 20 70 4f 70 65 6e 2d  g);.      pOpen-
acc0: 3e 6e 50 65 6e 64 69 6e 67 20 3d 20 30 3b 0a 20  >nPending = 0;. 
acd0: 20 20 20 20 20 70 4f 70 65 6e 2d 3e 61 50 65 6e       pOpen->aPen
ace0: 64 69 6e 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  ding = 0;.    }.
acf0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 4f 73 4c 65    }.  sqliteOsLe
ad00: 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 69 64  aveMutex();.  id
ad10: 2d 3e 6c 6f 63 6b 65 64 20 3d 20 30 3b 0a 20 20  ->locked = 0;.  
ad20: 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69  return rc;.#endi
ad30: 66 0a 23 69 66 20 4f 53 5f 57 49 4e 0a 20 20 69  f.#if OS_WIN.  i
ad40: 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 69 64 2d  nt rc;.  if( id-
ad50: 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 7b 0a 20 20  >locked==0 ){.  
ad60: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
ad70: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73  ;.  }else if( is
ad80: 4e 54 28 29 20 7c 7c 20 69 64 2d 3e 6c 6f 63 6b  NT() || id->lock
ad90: 65 64 3c 30 20 29 7b 0a 20 20 20 20 55 6e 6c 6f  ed<0 ){.    Unlo
ada0: 63 6b 46 69 6c 65 28 69 64 2d 3e 68 2c 20 46 49  ckFile(id->h, FI
adb0: 52 53 54 5f 4c 4f 43 4b 42 59 54 45 2b 31 2c 20  RST_LOCKBYTE+1, 
adc0: 30 2c 20 4e 5f 4c 4f 43 4b 42 59 54 45 2c 20 30  0, N_LOCKBYTE, 0
add0: 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  );.    rc = SQLI
ade0: 54 45 5f 4f 4b 3b 0a 20 20 20 20 69 64 2d 3e 6c  TE_OK;.    id->l
adf0: 6f 63 6b 65 64 20 3d 20 30 3b 0a 20 20 7d 65 6c  ocked = 0;.  }el
ae00: 73 65 7b 0a 20 20 20 20 55 6e 6c 6f 63 6b 46 69  se{.    UnlockFi
ae10: 6c 65 28 69 64 2d 3e 68 2c 20 46 49 52 53 54 5f  le(id->h, FIRST_
ae20: 4c 4f 43 4b 42 59 54 45 2b 69 64 2d 3e 6c 6f 63  LOCKBYTE+id->loc
ae30: 6b 65 64 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20  ked, 0, 1, 0);. 
ae40: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
ae50: 4b 3b 0a 20 20 20 20 69 64 2d 3e 6c 6f 63 6b 65  K;.    id->locke
ae60: 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  d = 0;.  }.  ret
ae70: 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 23  urn rc;.#endif.#
ae80: 69 66 20 4f 53 5f 4d 41 43 0a 20 20 69 6e 74 20  if OS_MAC.  int 
ae90: 72 63 3b 0a 20 20 50 61 72 61 6d 42 6c 6f 63 6b  rc;.  ParamBlock
aea0: 52 65 63 20 70 61 72 61 6d 73 3b 0a 20 20 6d 65  Rec params;.  me
aeb0: 6d 73 65 74 28 26 70 61 72 61 6d 73 2c 20 30 2c  mset(&params, 0,
aec0: 20 73 69 7a 65 6f 66 28 70 61 72 61 6d 73 29 29   sizeof(params))
aed0: 3b 0a 20 20 70 61 72 61 6d 73 2e 69 6f 50 61 72  ;.  params.ioPar
aee0: 61 6d 2e 69 6f 52 65 66 4e 75 6d 20 3d 20 69 64  am.ioRefNum = id
aef0: 2d 3e 72 65 66 4e 75 6d 52 46 3b 0a 20 20 70 61  ->refNumRF;.  pa
af00: 72 61 6d 73 2e 69 6f 50 61 72 61 6d 2e 69 6f 50  rams.ioParam.ioP
af10: 6f 73 4d 6f 64 65 20 3d 20 66 73 46 72 6f 6d 53  osMode = fsFromS
af20: 74 61 72 74 3b 0a 20 20 69 66 28 20 69 64 2d 3e  tart;.  if( id->
af30: 6c 6f 63 6b 65 64 3d 3d 30 20 7c 7c 20 69 64 2d  locked==0 || id-
af40: 3e 72 65 66 4e 75 6d 52 46 20 3d 3d 20 2d 31 20  >refNumRF == -1 
af50: 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
af60: 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20 69  TE_OK;.  }else i
af70: 66 28 20 69 64 2d 3e 6c 6f 63 6b 65 64 3c 30 20  f( id->locked<0 
af80: 29 7b 0a 20 20 20 20 70 61 72 61 6d 73 2e 69 6f  ){.    params.io
af90: 50 61 72 61 6d 2e 69 6f 50 6f 73 4f 66 66 73 65  Param.ioPosOffse
afa0: 74 20 3d 20 46 49 52 53 54 5f 4c 4f 43 4b 42 59  t = FIRST_LOCKBY
afb0: 54 45 2b 31 3b 0a 20 20 20 20 70 61 72 61 6d 73  TE+1;.    params
afc0: 2e 69 6f 50 61 72 61 6d 2e 69 6f 52 65 71 43 6f  .ioParam.ioReqCo
afd0: 75 6e 74 20 3d 20 4e 5f 4c 4f 43 4b 42 59 54 45  unt = N_LOCKBYTE
afe0: 3b 0a 20 20 20 20 50 42 55 6e 6c 6f 63 6b 52 61  ;.    PBUnlockRa
aff0: 6e 67 65 53 79 6e 63 28 26 70 61 72 61 6d 73 29  ngeSync(&params)
b000: 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
b010: 45 5f 4f 4b 3b 0a 20 20 20 20 69 64 2d 3e 6c 6f  E_OK;.    id->lo
b020: 63 6b 65 64 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  cked = 0;.  }els
b030: 65 7b 0a 20 20 20 20 70 61 72 61 6d 73 2e 69 6f  e{.    params.io
b040: 50 61 72 61 6d 2e 69 6f 50 6f 73 4f 66 66 73 65  Param.ioPosOffse
b050: 74 20 3d 20 46 49 52 53 54 5f 4c 4f 43 4b 42 59  t = FIRST_LOCKBY
b060: 54 45 2b 69 64 2d 3e 6c 6f 63 6b 65 64 3b 0a 20  TE+id->locked;. 
b070: 20 20 20 70 61 72 61 6d 73 2e 69 6f 50 61 72 61     params.ioPara
b080: 6d 2e 69 6f 52 65 71 43 6f 75 6e 74 20 3d 20 31  m.ioReqCount = 1
b090: 3b 0a 20 20 20 20 50 42 55 6e 6c 6f 63 6b 52 61  ;.    PBUnlockRa
b0a0: 6e 67 65 53 79 6e 63 28 26 70 61 72 61 6d 73 29  ngeSync(&params)
b0b0: 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
b0c0: 45 5f 4f 4b 3b 0a 20 20 20 20 69 64 2d 3e 6c 6f  E_OK;.    id->lo
b0d0: 63 6b 65 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  cked = 0;.  }.  
b0e0: 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69  return rc;.#endi
b0f0: 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 69  f.}../*.** Get i
b100: 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 6f 20 73 65  nformation to se
b110: 65 64 20 74 68 65 20 72 61 6e 64 6f 6d 20 6e 75  ed the random nu
b120: 6d 62 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 20  mber generator. 
b130: 20 54 68 65 20 73 65 65 64 0a 2a 2a 20 69 73 20   The seed.** is 
b140: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
b150: 20 62 75 66 66 65 72 20 7a 42 75 66 5b 32 35 36   buffer zBuf[256
b160: 5d 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20  ].  The calling 
b170: 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 0a 2a 2a  function must.**
b180: 20 73 75 70 70 6c 79 20 61 20 73 75 66 66 69 63   supply a suffic
b190: 69 65 6e 74 6c 79 20 6c 61 72 67 65 20 62 75 66  iently large buf
b1a0: 66 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  fer..*/.int sqli
b1b0: 74 65 4f 73 52 61 6e 64 6f 6d 53 65 65 64 28 63  teOsRandomSeed(c
b1c0: 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 2f 2a  har *zBuf){.  /*
b1d0: 20 57 65 20 68 61 76 65 20 74 6f 20 69 6e 69 74   We have to init
b1e0: 69 61 6c 69 7a 65 20 7a 42 75 66 20 74 6f 20 70  ialize zBuf to p
b1f0: 72 65 76 65 6e 74 20 76 61 6c 67 72 69 6e 64 20  revent valgrind 
b200: 66 72 6f 6d 20 72 65 70 6f 72 74 69 6e 67 0a 20  from reporting. 
b210: 20 2a 2a 20 65 72 72 6f 72 73 2e 20 20 54 68 65   ** errors.  The
b220: 20 72 65 70 6f 72 74 73 20 69 73 73 75 65 64 20   reports issued 
b230: 62 79 20 76 61 6c 67 72 69 6e 64 20 61 72 65 20  by valgrind are 
b240: 69 6e 63 6f 72 72 65 63 74 20 2d 20 77 65 20 77  incorrect - we w
b250: 6f 75 6c 64 0a 20 20 2a 2a 20 70 72 65 66 65 72  ould.  ** prefer
b260: 20 74 68 61 74 20 74 68 65 20 72 61 6e 64 6f 6d   that the random
b270: 6e 65 73 73 20 62 65 20 69 6e 63 72 65 61 73 65  ness be increase
b280: 64 20 62 79 20 6d 61 6b 69 6e 67 20 75 73 65 20  d by making use 
b290: 6f 66 20 74 68 65 0a 20 20 2a 2a 20 75 6e 69 6e  of the.  ** unin
b2a0: 69 74 69 61 6c 69 7a 65 64 20 73 70 61 63 65 20  itialized space 
b2b0: 69 6e 20 7a 42 75 66 20 2d 20 62 75 74 20 76 61  in zBuf - but va
b2c0: 6c 67 72 69 6e 64 20 65 72 72 6f 72 73 20 74 65  lgrind errors te
b2d0: 6e 64 20 74 6f 20 77 6f 72 72 79 0a 20 20 2a 2a  nd to worry.  **
b2e0: 20 73 6f 6d 65 20 75 73 65 72 73 2e 20 20 52 61   some users.  Ra
b2f0: 74 68 65 72 20 74 68 61 6e 20 61 72 67 75 65 2c  ther than argue,
b300: 20 69 74 20 73 65 65 6d 73 20 65 61 73 69 65 72   it seems easier
b310: 20 6a 75 73 74 20 74 6f 20 69 6e 69 74 69 61 6c   just to initial
b320: 69 7a 65 0a 20 20 2a 2a 20 74 68 65 20 77 68 6f  ize.  ** the who
b330: 6c 65 20 61 72 72 61 79 20 61 6e 64 20 73 69 6c  le array and sil
b340: 65 6e 63 65 20 76 61 6c 67 72 69 6e 64 2c 20 65  ence valgrind, e
b350: 76 65 6e 20 69 66 20 74 68 61 74 20 6d 65 61 6e  ven if that mean
b360: 73 20 6c 65 73 73 20 72 61 6e 64 6f 6d 6e 65 73  s less randomnes
b370: 73 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 72 61  s.  ** in the ra
b380: 6e 64 6f 6d 20 73 65 65 64 2e 0a 20 20 2a 2a 0a  ndom seed..  **.
b390: 20 20 2a 2a 20 57 68 65 6e 20 74 65 73 74 69 6e    ** When testin
b3a0: 67 2c 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20  g, initializing 
b3b0: 7a 42 75 66 5b 5d 20 74 6f 20 7a 65 72 6f 20 69  zBuf[] to zero i
b3c0: 73 20 61 6c 6c 20 77 65 20 64 6f 2e 20 20 54 68  s all we do.  Th
b3d0: 61 74 20 6d 65 61 6e 73 0a 20 20 2a 2a 20 74 68  at means.  ** th
b3e0: 61 74 20 77 65 20 61 6c 77 61 79 73 20 75 73 65  at we always use
b3f0: 20 74 68 65 20 73 61 6d 65 20 72 61 6e 64 6f 6d   the same random
b400: 20 6e 75 6d 62 65 72 20 73 65 71 75 65 6e 63 65   number sequence
b410: 2e 2a 20 54 68 69 73 20 6d 61 6b 65 73 20 74 68  .* This makes th
b420: 65 0a 20 20 2a 2a 20 74 65 73 74 73 20 72 65 70  e.  ** tests rep
b430: 65 61 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20  eatable..  */.  
b440: 6d 65 6d 73 65 74 28 7a 42 75 66 2c 20 30 2c 20  memset(zBuf, 0, 
b450: 32 35 36 29 3b 0a 23 69 66 20 4f 53 5f 55 4e 49  256);.#if OS_UNI
b460: 58 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  X && !defined(SQ
b470: 4c 49 54 45 5f 54 45 53 54 29 0a 20 20 7b 0a 20  LITE_TEST).  {. 
b480: 20 20 20 69 6e 74 20 70 69 64 3b 0a 20 20 20 20     int pid;.    
b490: 74 69 6d 65 28 28 74 69 6d 65 5f 74 2a 29 7a 42  time((time_t*)zB
b4a0: 75 66 29 3b 0a 20 20 20 20 70 69 64 20 3d 20 67  uf);.    pid = g
b4b0: 65 74 70 69 64 28 29 3b 0a 20 20 20 20 6d 65 6d  etpid();.    mem
b4c0: 63 70 79 28 26 7a 42 75 66 5b 73 69 7a 65 6f 66  cpy(&zBuf[sizeof
b4d0: 28 74 69 6d 65 5f 74 29 5d 2c 20 26 70 69 64 2c  (time_t)], &pid,
b4e0: 20 73 69 7a 65 6f 66 28 70 69 64 29 29 3b 0a 20   sizeof(pid));. 
b4f0: 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f 53   }.#endif.#if OS
b500: 5f 57 49 4e 20 26 26 20 21 64 65 66 69 6e 65 64  _WIN && !defined
b510: 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 20 20  (SQLITE_TEST).  
b520: 47 65 74 53 79 73 74 65 6d 54 69 6d 65 28 28 4c  GetSystemTime((L
b530: 50 53 59 53 54 45 4d 54 49 4d 45 29 7a 42 75 66  PSYSTEMTIME)zBuf
b540: 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f 53  );.#endif.#if OS
b550: 5f 4d 41 43 0a 20 20 7b 0a 20 20 20 20 69 6e 74  _MAC.  {.    int
b560: 20 70 69 64 3b 0a 20 20 20 20 4d 69 63 72 6f 73   pid;.    Micros
b570: 65 63 6f 6e 64 73 28 28 55 6e 73 69 67 6e 65 64  econds((Unsigned
b580: 57 69 64 65 2a 29 7a 42 75 66 29 3b 0a 20 20 20  Wide*)zBuf);.   
b590: 20 70 69 64 20 3d 20 67 65 74 70 69 64 28 29 3b   pid = getpid();
b5a0: 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75  .    memcpy(&zBu
b5b0: 66 5b 73 69 7a 65 6f 66 28 55 6e 73 69 67 6e 65  f[sizeof(Unsigne
b5c0: 64 57 69 64 65 29 5d 2c 20 26 70 69 64 2c 20 73  dWide)], &pid, s
b5d0: 69 7a 65 6f 66 28 70 69 64 29 29 3b 0a 20 20 7d  izeof(pid));.  }
b5e0: 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
b5f0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
b600: 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20 61  *.** Sleep for a
b610: 20 6c 69 74 74 6c 65 20 77 68 69 6c 65 2e 20 20   little while.  
b620: 52 65 74 75 72 6e 20 74 68 65 20 61 6d 6f 75 6e  Return the amoun
b630: 74 20 6f 66 20 74 69 6d 65 20 73 6c 65 70 74 2e  t of time slept.
b640: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 4f 73  .*/.int sqliteOs
b650: 53 6c 65 65 70 28 69 6e 74 20 6d 73 29 7b 0a 23  Sleep(int ms){.#
b660: 69 66 20 4f 53 5f 55 4e 49 58 0a 23 69 66 20 64  if OS_UNIX.#if d
b670: 65 66 69 6e 65 64 28 48 41 56 45 5f 55 53 4c 45  efined(HAVE_USLE
b680: 45 50 29 20 26 26 20 48 41 56 45 5f 55 53 4c 45  EP) && HAVE_USLE
b690: 45 50 0a 20 20 75 73 6c 65 65 70 28 6d 73 2a 31  EP.  usleep(ms*1
b6a0: 30 30 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 6d  000);.  return m
b6b0: 73 3b 0a 23 65 6c 73 65 0a 20 20 73 6c 65 65 70  s;.#else.  sleep
b6c0: 28 28 6d 73 2b 39 39 39 29 2f 31 30 30 30 29 3b  ((ms+999)/1000);
b6d0: 0a 20 20 72 65 74 75 72 6e 20 31 30 30 30 2a 28  .  return 1000*(
b6e0: 28 6d 73 2b 39 39 39 29 2f 31 30 30 30 29 3b 0a  (ms+999)/1000);.
b6f0: 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 23 69  #endif.#endif.#i
b700: 66 20 4f 53 5f 57 49 4e 0a 20 20 53 6c 65 65 70  f OS_WIN.  Sleep
b710: 28 6d 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 6d  (ms);.  return m
b720: 73 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f 53  s;.#endif.#if OS
b730: 5f 4d 41 43 0a 20 20 55 49 6e 74 33 32 20 66 69  _MAC.  UInt32 fi
b740: 6e 61 6c 54 69 63 6b 73 3b 0a 20 20 55 49 6e 74  nalTicks;.  UInt
b750: 33 32 20 74 69 63 6b 73 20 3d 20 28 28 28 55 49  32 ticks = (((UI
b760: 6e 74 33 32 29 6d 73 2b 31 36 29 2a 33 29 2f 35  nt32)ms+16)*3)/5
b770: 30 3b 20 20 2f 2a 20 31 2f 36 30 20 73 65 63 20  0;  /* 1/60 sec 
b780: 70 65 72 20 74 69 63 6b 20 2a 2f 0a 20 20 44 65  per tick */.  De
b790: 6c 61 79 28 74 69 63 6b 73 2c 20 26 66 69 6e 61  lay(ticks, &fina
b7a0: 6c 54 69 63 6b 73 29 3b 0a 20 20 72 65 74 75 72  lTicks);.  retur
b7b0: 6e 20 28 69 6e 74 29 28 28 74 69 63 6b 73 2a 35  n (int)((ticks*5
b7c0: 30 29 2f 33 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a  0)/3);.#endif.}.
b7d0: 0a 2f 2a 0a 2a 2a 20 53 74 61 74 69 63 20 76 61  ./*.** Static va
b7e0: 72 69 61 62 6c 65 73 20 75 73 65 64 20 66 6f 72  riables used for
b7f0: 20 74 68 72 65 61 64 20 73 79 6e 63 68 72 6f 6e   thread synchron
b800: 69 7a 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69  ization.*/.stati
b810: 63 20 69 6e 74 20 69 6e 4d 75 74 65 78 20 3d 20  c int inMutex = 
b820: 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  0;.#ifdef SQLITE
b830: 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 0a 20 20  _UNIX_THREADS.  
b840: 73 74 61 74 69 63 20 70 74 68 72 65 61 64 5f 6d  static pthread_m
b850: 75 74 65 78 5f 74 20 6d 75 74 65 78 20 3d 20 50  utex_t mutex = P
b860: 54 48 52 45 41 44 5f 4d 55 54 45 58 5f 49 4e 49  THREAD_MUTEX_INI
b870: 54 49 41 4c 49 5a 45 52 3b 0a 23 65 6e 64 69 66  TIALIZER;.#endif
b880: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57  .#ifdef SQLITE_W
b890: 33 32 5f 54 48 52 45 41 44 53 0a 20 20 73 74 61  32_THREADS.  sta
b8a0: 74 69 63 20 43 52 49 54 49 43 41 4c 5f 53 45 43  tic CRITICAL_SEC
b8b0: 54 49 4f 4e 20 63 73 3b 0a 23 65 6e 64 69 66 0a  TION cs;.#endif.
b8c0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4d 41  #ifdef SQLITE_MA
b8d0: 43 4f 53 5f 4d 55 4c 54 49 54 41 53 4b 49 4e 47  COS_MULTITASKING
b8e0: 0a 20 20 73 74 61 74 69 63 20 4d 50 43 72 69 74  .  static MPCrit
b8f0: 69 63 61 6c 52 65 67 69 6f 6e 49 44 20 63 72 69  icalRegionID cri
b900: 74 69 63 61 6c 52 65 67 69 6f 6e 3b 0a 23 65 6e  ticalRegion;.#en
b910: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  dif../*.** The f
b920: 6f 6c 6c 6f 77 69 6e 67 20 70 61 69 72 20 6f 66  ollowing pair of
b930: 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65   routine impleme
b940: 6e 74 20 6d 75 74 75 61 6c 20 65 78 63 6c 75 73  nt mutual exclus
b950: 69 6f 6e 20 66 6f 72 0a 2a 2a 20 6d 75 6c 74 69  ion for.** multi
b960: 2d 74 68 72 65 61 64 65 64 20 70 72 6f 63 65 73  -threaded proces
b970: 73 65 73 2e 20 20 4f 6e 6c 79 20 61 20 73 69 6e  ses.  Only a sin
b980: 67 6c 65 20 74 68 72 65 61 64 20 69 73 20 61 6c  gle thread is al
b990: 6c 6f 77 65 64 20 74 6f 0a 2a 2a 20 65 78 65 63  lowed to.** exec
b9a0: 75 74 65 64 20 63 6f 64 65 20 74 68 61 74 20 69  uted code that i
b9b0: 73 20 73 75 72 72 6f 75 6e 64 65 64 20 62 79 20  s surrounded by 
b9c0: 45 6e 74 65 72 4d 75 74 65 78 28 29 20 61 6e 64  EnterMutex() and
b9d0: 20 4c 65 61 76 65 4d 75 74 65 78 28 29 2e 0a 2a   LeaveMutex()..*
b9e0: 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 75 73 65 73  *.** SQLite uses
b9f0: 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 4d   only a single M
ba00: 75 74 65 78 2e 20 20 54 68 65 72 65 20 69 73 20  utex.  There is 
ba10: 6e 6f 74 20 6d 75 63 68 20 63 72 69 74 69 63 61  not much critica
ba20: 6c 0a 2a 2a 20 63 6f 64 65 20 61 6e 64 20 77 68  l.** code and wh
ba30: 61 74 20 6c 69 74 74 6c 65 20 74 68 65 72 65 20  at little there 
ba40: 69 73 20 65 78 65 63 75 74 65 73 20 71 75 69 63  is executes quic
ba50: 6b 6c 79 20 61 6e 64 20 77 69 74 68 6f 75 74 20  kly and without 
ba60: 62 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 76 6f 69  blocking..*/.voi
ba70: 64 20 73 71 6c 69 74 65 4f 73 45 6e 74 65 72 4d  d sqliteOsEnterM
ba80: 75 74 65 78 28 29 7b 0a 23 69 66 64 65 66 20 53  utex(){.#ifdef S
ba90: 51 4c 49 54 45 5f 55 4e 49 58 5f 54 48 52 45 41  QLITE_UNIX_THREA
baa0: 44 53 0a 20 20 70 74 68 72 65 61 64 5f 6d 75 74  DS.  pthread_mut
bab0: 65 78 5f 6c 6f 63 6b 28 26 6d 75 74 65 78 29 3b  ex_lock(&mutex);
bac0: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
bad0: 51 4c 49 54 45 5f 57 33 32 5f 54 48 52 45 41 44  QLITE_W32_THREAD
bae0: 53 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 69  S.  static int i
baf0: 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 77 68 69  sInit = 0;.  whi
bb00: 6c 65 28 20 21 69 73 49 6e 69 74 20 29 7b 0a 20  le( !isInit ){. 
bb10: 20 20 20 73 74 61 74 69 63 20 6c 6f 6e 67 20 6c     static long l
bb20: 6f 63 6b 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  ock = 0;.    if(
bb30: 20 49 6e 74 65 72 6c 6f 63 6b 65 64 49 6e 63 72   InterlockedIncr
bb40: 65 6d 65 6e 74 28 26 6c 6f 63 6b 29 3d 3d 31 20  ement(&lock)==1 
bb50: 29 7b 0a 20 20 20 20 20 20 49 6e 69 74 69 61 6c  ){.      Initial
bb60: 69 7a 65 43 72 69 74 69 63 61 6c 53 65 63 74 69  izeCriticalSecti
bb70: 6f 6e 28 26 63 73 29 3b 0a 20 20 20 20 20 20 69  on(&cs);.      i
bb80: 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20 20 20 7d  sInit = 1;.    }
bb90: 65 6c 73 65 7b 0a 20 20 20 20 20 20 53 6c 65 65  else{.      Slee
bba0: 70 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  p(1);.    }.  }.
bbb0: 20 20 45 6e 74 65 72 43 72 69 74 69 63 61 6c 53    EnterCriticalS
bbc0: 65 63 74 69 6f 6e 28 26 63 73 29 3b 0a 23 65 6e  ection(&cs);.#en
bbd0: 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
bbe0: 45 5f 4d 41 43 4f 53 5f 4d 55 4c 54 49 54 41 53  E_MACOS_MULTITAS
bbf0: 4b 49 4e 47 0a 20 20 73 74 61 74 69 63 20 76 6f  KING.  static vo
bc00: 6c 61 74 69 6c 65 20 69 6e 74 20 6e 6f 74 49 6e  latile int notIn
bc10: 69 74 20 3d 20 31 3b 0a 20 20 69 66 28 20 6e 6f  it = 1;.  if( no
bc20: 74 49 6e 69 74 20 29 7b 0a 20 20 20 20 69 66 28  tInit ){.    if(
bc30: 20 6e 6f 74 49 6e 69 74 20 3d 3d 20 32 20 29 20   notInit == 2 ) 
bc40: 2f 2a 20 61 73 20 63 6c 6f 73 65 20 61 73 20 79  /* as close as y
bc50: 6f 75 20 63 61 6e 20 67 65 74 20 74 6f 20 74 68  ou can get to th
bc60: 72 65 61 64 20 73 61 66 65 20 69 6e 69 74 20 2a  read safe init *
bc70: 2f 0a 20 20 20 20 20 20 4d 50 59 69 65 6c 64 28  /.      MPYield(
bc80: 29 3b 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20  );.    else{.   
bc90: 20 20 20 6e 6f 74 49 6e 69 74 20 3d 20 32 3b 0a     notInit = 2;.
bca0: 20 20 20 20 20 20 4d 50 43 72 65 61 74 65 43 72        MPCreateCr
bcb0: 69 74 69 63 61 6c 52 65 67 69 6f 6e 28 26 63 72  iticalRegion(&cr
bcc0: 69 74 69 63 61 6c 52 65 67 69 6f 6e 29 3b 0a 20  iticalRegion);. 
bcd0: 20 20 20 20 20 6e 6f 74 49 6e 69 74 20 3d 20 30       notInit = 0
bce0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4d 50  ;.    }.  }.  MP
bcf0: 45 6e 74 65 72 43 72 69 74 69 63 61 6c 52 65 67  EnterCriticalReg
bd00: 69 6f 6e 28 63 72 69 74 69 63 61 6c 52 65 67 69  ion(criticalRegi
bd10: 6f 6e 2c 20 6b 44 75 72 61 74 69 6f 6e 46 6f 72  on, kDurationFor
bd20: 65 76 65 72 29 3b 0a 23 65 6e 64 69 66 0a 20 20  ever);.#endif.  
bd30: 61 73 73 65 72 74 28 20 21 69 6e 4d 75 74 65 78  assert( !inMutex
bd40: 20 29 3b 0a 20 20 69 6e 4d 75 74 65 78 20 3d 20   );.  inMutex = 
bd50: 31 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65  1;.}.void sqlite
bd60: 4f 73 4c 65 61 76 65 4d 75 74 65 78 28 29 7b 0a  OsLeaveMutex(){.
bd70: 20 20 61 73 73 65 72 74 28 20 69 6e 4d 75 74 65    assert( inMute
bd80: 78 20 29 3b 0a 20 20 69 6e 4d 75 74 65 78 20 3d  x );.  inMutex =
bd90: 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   0;.#ifdef SQLIT
bda0: 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 0a 20  E_UNIX_THREADS. 
bdb0: 20 70 74 68 72 65 61 64 5f 6d 75 74 65 78 5f 75   pthread_mutex_u
bdc0: 6e 6c 6f 63 6b 28 26 6d 75 74 65 78 29 3b 0a 23  nlock(&mutex);.#
bdd0: 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c  endif.#ifdef SQL
bde0: 49 54 45 5f 57 33 32 5f 54 48 52 45 41 44 53 0a  ITE_W32_THREADS.
bdf0: 20 20 4c 65 61 76 65 43 72 69 74 69 63 61 6c 53    LeaveCriticalS
be00: 65 63 74 69 6f 6e 28 26 63 73 29 3b 0a 23 65 6e  ection(&cs);.#en
be10: 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
be20: 45 5f 4d 41 43 4f 53 5f 4d 55 4c 54 49 54 41 53  E_MACOS_MULTITAS
be30: 4b 49 4e 47 0a 20 20 4d 50 45 78 69 74 43 72 69  KING.  MPExitCri
be40: 74 69 63 61 6c 52 65 67 69 6f 6e 28 63 72 69 74  ticalRegion(crit
be50: 69 63 61 6c 52 65 67 69 6f 6e 29 3b 0a 23 65 6e  icalRegion);.#en
be60: 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 75 72  dif.}../*.** Tur
be70: 6e 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74  n a relative pat
be80: 68 6e 61 6d 65 20 69 6e 74 6f 20 61 20 66 75 6c  hname into a ful
be90: 6c 20 70 61 74 68 6e 61 6d 65 2e 20 20 52 65 74  l pathname.  Ret
bea0: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a  urn a pointer.**
beb0: 20 74 6f 20 74 68 65 20 66 75 6c 6c 20 70 61 74   to the full pat
bec0: 68 6e 61 6d 65 20 73 74 6f 72 65 64 20 69 6e 20  hname stored in 
bed0: 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66  space obtained f
bee0: 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  rom sqliteMalloc
bef0: 28 29 2e 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 69  ()..** The calli
bf00: 6e 67 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72  ng function is r
bf10: 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 66  esponsible for f
bf20: 72 65 65 69 6e 67 20 74 68 69 73 20 73 70 61 63  reeing this spac
bf30: 65 20 6f 6e 63 65 20 69 74 0a 2a 2a 20 69 73 20  e once it.** is 
bf40: 6e 6f 20 6c 6f 6e 67 65 72 20 6e 65 65 64 65 64  no longer needed
bf50: 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74  ..*/.char *sqlit
bf60: 65 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28  eOsFullPathname(
bf70: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 65 6c  const char *zRel
bf80: 61 74 69 76 65 29 7b 0a 23 69 66 20 4f 53 5f 55  ative){.#if OS_U
bf90: 4e 49 58 0a 20 20 63 68 61 72 20 2a 7a 46 75 6c  NIX.  char *zFul
bfa0: 6c 20 3d 20 30 3b 0a 20 20 69 66 28 20 7a 52 65  l = 0;.  if( zRe
bfb0: 6c 61 74 69 76 65 5b 30 5d 3d 3d 27 2f 27 20 29  lative[0]=='/' )
bfc0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 53  {.    sqliteSetS
bfd0: 74 72 69 6e 67 28 26 7a 46 75 6c 6c 2c 20 7a 52  tring(&zFull, zR
bfe0: 65 6c 61 74 69 76 65 2c 20 28 63 68 61 72 2a 29  elative, (char*)
bff0: 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  0);.  }else{.   
c000: 20 63 68 61 72 20 7a 42 75 66 5b 35 30 30 30 5d   char zBuf[5000]
c010: 3b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 53  ;.    sqliteSetS
c020: 74 72 69 6e 67 28 26 7a 46 75 6c 6c 2c 20 67 65  tring(&zFull, ge
c030: 74 63 77 64 28 7a 42 75 66 2c 20 73 69 7a 65 6f  tcwd(zBuf, sizeo
c040: 66 28 7a 42 75 66 29 29 2c 20 22 2f 22 2c 20 7a  f(zBuf)), "/", z
c050: 52 65 6c 61 74 69 76 65 2c 0a 20 20 20 20 20 20  Relative,.      
c060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
c070: 68 61 72 2a 29 30 29 3b 0a 20 20 7d 0a 20 20 72  har*)0);.  }.  r
c080: 65 74 75 72 6e 20 7a 46 75 6c 6c 3b 0a 23 65 6e  eturn zFull;.#en
c090: 64 69 66 0a 23 69 66 20 4f 53 5f 57 49 4e 0a 20  dif.#if OS_WIN. 
c0a0: 20 63 68 61 72 20 2a 7a 4e 6f 74 55 73 65 64 3b   char *zNotUsed;
c0b0: 0a 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 3b 0a  .  char *zFull;.
c0c0: 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 6e    int nByte;.  n
c0d0: 42 79 74 65 20 3d 20 47 65 74 46 75 6c 6c 50 61  Byte = GetFullPa
c0e0: 74 68 4e 61 6d 65 28 7a 52 65 6c 61 74 69 76 65  thName(zRelative
c0f0: 2c 20 30 2c 20 30 2c 20 26 7a 4e 6f 74 55 73 65  , 0, 0, &zNotUse
c100: 64 29 20 2b 20 31 3b 0a 20 20 7a 46 75 6c 6c 20  d) + 1;.  zFull 
c110: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
c120: 6e 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20 7a  nByte );.  if( z
c130: 46 75 6c 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e  Full==0 ) return
c140: 20 30 3b 0a 20 20 47 65 74 46 75 6c 6c 50 61 74   0;.  GetFullPat
c150: 68 4e 61 6d 65 28 7a 52 65 6c 61 74 69 76 65 2c  hName(zRelative,
c160: 20 6e 42 79 74 65 2c 20 7a 46 75 6c 6c 2c 20 26   nByte, zFull, &
c170: 7a 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74  zNotUsed);.  ret
c180: 75 72 6e 20 7a 46 75 6c 6c 3b 0a 23 65 6e 64 69  urn zFull;.#endi
c190: 66 0a 23 69 66 20 4f 53 5f 4d 41 43 0a 20 20 63  f.#if OS_MAC.  c
c1a0: 68 61 72 20 2a 7a 46 75 6c 6c 20 3d 20 30 3b 0a  har *zFull = 0;.
c1b0: 20 20 69 66 28 20 7a 52 65 6c 61 74 69 76 65 5b    if( zRelative[
c1c0: 30 5d 3d 3d 27 3a 27 20 29 7b 0a 20 20 20 20 63  0]==':' ){.    c
c1d0: 68 61 72 20 7a 42 75 66 5b 5f 4d 41 58 5f 50 41  har zBuf[_MAX_PA
c1e0: 54 48 2b 31 5d 3b 0a 20 20 20 20 73 71 6c 69 74  TH+1];.    sqlit
c1f0: 65 53 65 74 53 74 72 69 6e 67 28 26 7a 46 75 6c  eSetString(&zFul
c200: 6c 2c 20 67 65 74 63 77 64 28 7a 42 75 66 2c 20  l, getcwd(zBuf, 
c210: 73 69 7a 65 6f 66 28 7a 42 75 66 29 29 2c 20 26  sizeof(zBuf)), &
c220: 28 7a 52 65 6c 61 74 69 76 65 5b 31 5d 29 2c 0a  (zRelative[1]),.
c230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c240: 20 20 20 20 28 63 68 61 72 2a 29 30 29 3b 0a 20      (char*)0);. 
c250: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20   }else{.    if( 
c260: 73 74 72 63 68 72 28 7a 52 65 6c 61 74 69 76 65  strchr(zRelative
c270: 2c 20 27 3a 27 29 20 29 7b 0a 20 20 20 20 20 20  , ':') ){.      
c280: 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28  sqliteSetString(
c290: 26 7a 46 75 6c 6c 2c 20 7a 52 65 6c 61 74 69 76  &zFull, zRelativ
c2a0: 65 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  e, (char*)0);.  
c2b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61    }else{.    cha
c2c0: 72 20 7a 42 75 66 5b 5f 4d 41 58 5f 50 41 54 48  r zBuf[_MAX_PATH
c2d0: 2b 31 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  +1];.      sqlit
c2e0: 65 53 65 74 53 74 72 69 6e 67 28 26 7a 46 75 6c  eSetString(&zFul
c2f0: 6c 2c 20 67 65 74 63 77 64 28 7a 42 75 66 2c 20  l, getcwd(zBuf, 
c300: 73 69 7a 65 6f 66 28 7a 42 75 66 29 29 2c 20 7a  sizeof(zBuf)), z
c310: 52 65 6c 61 74 69 76 65 2c 20 28 63 68 61 72 2a  Relative, (char*
c320: 29 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  )0);.    }.  }. 
c330: 20 72 65 74 75 72 6e 20 7a 46 75 6c 6c 3b 0a 23   return zFull;.#
c340: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  endif.}../*.** T
c350: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72  he following var
c360: 69 61 62 6c 65 2c 20 69 66 20 73 65 74 20 74 6f  iable, if set to
c370: 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75   a non-zero valu
c380: 65 2c 20 62 65 63 6f 6d 65 73 20 74 68 65 20 72  e, becomes the r
c390: 65 73 75 6c 74 0a 2a 2a 20 72 65 74 75 72 6e 65  esult.** returne
c3a0: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 4f 73 43  d from sqliteOsC
c3b0: 75 72 72 65 6e 74 54 69 6d 65 28 29 2e 20 20 54  urrentTime().  T
c3c0: 68 69 73 20 69 73 20 75 73 65 64 20 66 6f 72 20  his is used for 
c3d0: 74 65 73 74 69 6e 67 2e 0a 2a 2f 0a 23 69 66 64  testing..*/.#ifd
c3e0: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69  ef SQLITE_TEST.i
c3f0: 6e 74 20 73 71 6c 69 74 65 5f 63 75 72 72 65 6e  nt sqlite_curren
c400: 74 5f 74 69 6d 65 20 3d 20 30 3b 0a 23 65 6e 64  t_time = 0;.#end
c410: 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74  if../*.** Find t
c420: 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20  he current time 
c430: 28 69 6e 20 55 6e 69 76 65 72 73 61 6c 20 43 6f  (in Universal Co
c440: 6f 72 64 69 6e 61 74 65 64 20 54 69 6d 65 29 2e  ordinated Time).
c450: 20 20 57 72 69 74 65 20 74 68 65 0a 2a 2a 20 63    Write the.** c
c460: 75 72 72 65 6e 74 20 74 69 6d 65 20 61 6e 64 20  urrent time and 
c470: 64 61 74 65 20 61 73 20 61 20 4a 75 6c 69 61 6e  date as a Julian
c480: 20 44 61 79 20 6e 75 6d 62 65 72 20 69 6e 74 6f   Day number into
c490: 20 2a 70 72 4e 6f 77 20 61 6e 64 0a 2a 2a 20 72   *prNow and.** r
c4a0: 65 74 75 72 6e 20 30 2e 20 20 52 65 74 75 72 6e  eturn 0.  Return
c4b0: 20 31 20 69 66 20 74 68 65 20 74 69 6d 65 20 61   1 if the time a
c4c0: 6e 64 20 64 61 74 65 20 63 61 6e 6e 6f 74 20 62  nd date cannot b
c4d0: 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 69 6e 74 20  e found..*/.int 
c4e0: 73 71 6c 69 74 65 4f 73 43 75 72 72 65 6e 74 54  sqliteOsCurrentT
c4f0: 69 6d 65 28 64 6f 75 62 6c 65 20 2a 70 72 4e 6f  ime(double *prNo
c500: 77 29 7b 0a 23 69 66 20 4f 53 5f 55 4e 49 58 0a  w){.#if OS_UNIX.
c510: 20 20 74 69 6d 65 5f 74 20 74 3b 0a 20 20 74 69    time_t t;.  ti
c520: 6d 65 28 26 74 29 3b 0a 20 20 2a 70 72 4e 6f 77  me(&t);.  *prNow
c530: 20 3d 20 74 2f 38 36 34 30 30 2e 30 20 2b 20 32   = t/86400.0 + 2
c540: 34 34 30 35 38 37 2e 35 3b 0a 23 65 6e 64 69 66  440587.5;.#endif
c550: 0a 23 69 66 20 4f 53 5f 57 49 4e 0a 20 20 46 49  .#if OS_WIN.  FI
c560: 4c 45 54 49 4d 45 20 66 74 3b 0a 20 20 2f 2a 20  LETIME ft;.  /* 
c570: 46 49 4c 45 54 49 4d 45 20 73 74 72 75 63 74 75  FILETIME structu
c580: 72 65 20 69 73 20 61 20 36 34 2d 62 69 74 20 76  re is a 64-bit v
c590: 61 6c 75 65 20 72 65 70 72 65 73 65 6e 74 69 6e  alue representin
c5a0: 67 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  g the number of 
c5b0: 0a 20 20 20 20 20 31 30 30 2d 6e 61 6e 6f 73 65  .     100-nanose
c5c0: 63 6f 6e 64 20 69 6e 74 65 72 76 61 6c 73 20 73  cond intervals s
c5d0: 69 6e 63 65 20 4a 61 6e 75 61 72 79 20 31 2c 20  ince January 1, 
c5e0: 31 36 30 31 20 28 3d 20 4a 44 20 32 33 30 35 38  1601 (= JD 23058
c5f0: 31 33 2e 35 29 2e 20 0a 20 20 2a 2f 0a 20 20 64  13.5). .  */.  d
c600: 6f 75 62 6c 65 20 6e 6f 77 3b 0a 20 20 47 65 74  ouble now;.  Get
c610: 53 79 73 74 65 6d 54 69 6d 65 41 73 46 69 6c 65  SystemTimeAsFile
c620: 54 69 6d 65 28 20 26 66 74 20 29 3b 0a 20 20 6e  Time( &ft );.  n
c630: 6f 77 20 3d 20 28 28 64 6f 75 62 6c 65 29 66 74  ow = ((double)ft
c640: 2e 64 77 48 69 67 68 44 61 74 65 54 69 6d 65 29  .dwHighDateTime)
c650: 20 2a 20 34 32 39 34 39 36 37 32 39 36 2e 30 3b   * 4294967296.0;
c660: 20 0a 20 20 2a 70 72 4e 6f 77 20 3d 20 28 6e 6f   .  *prNow = (no
c670: 77 20 2b 20 66 74 2e 64 77 4c 6f 77 44 61 74 65  w + ft.dwLowDate
c680: 54 69 6d 65 29 2f 38 36 34 30 30 30 30 30 30 30  Time)/8640000000
c690: 30 30 2e 30 20 2b 20 32 33 30 35 38 31 33 2e 35  00.0 + 2305813.5
c6a0: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  ;.#endif.#ifdef 
c6b0: 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 66  SQLITE_TEST.  if
c6c0: 28 20 73 71 6c 69 74 65 5f 63 75 72 72 65 6e 74  ( sqlite_current
c6d0: 5f 74 69 6d 65 20 29 7b 0a 20 20 20 20 2a 70 72  _time ){.    *pr
c6e0: 4e 6f 77 20 3d 20 73 71 6c 69 74 65 5f 63 75 72  Now = sqlite_cur
c6f0: 72 65 6e 74 5f 74 69 6d 65 2f 38 36 34 30 30 2e  rent_time/86400.
c700: 30 20 2b 20 32 34 34 30 35 38 37 2e 35 3b 0a 20  0 + 2440587.5;. 
c710: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75   }.#endif.  retu
c720: 72 6e 20 30 3b 0a 7d 0a                          rn 0;.}.