/ Hex Artifact Content
Login

Artifact 617db07b13113ec093786b2278767ab46217d140:


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