/ Hex Artifact Content
Login

Artifact 2f24ede4d3464ac38d24d113e0d44d3c7d460be4:


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 66 6f 72 20 70 65 72 66 6f 72 6d 61  ros for performa
0600: 6e 63 65 20 74 72 61 63 69 6e 67 2e 20 20 4e 6f  nce tracing.  No
0610: 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64 20 6f 66  rmally turned of
0620: 66 0a 2a 2f 0a 23 69 66 20 30 0a 73 74 61 74 69  f.*/.#if 0.stati
0630: 63 20 69 6e 74 20 6c 61 73 74 5f 70 61 67 65 20  c int last_page 
0640: 3d 20 30 3b 0a 5f 5f 69 6e 6c 69 6e 65 5f 5f 20  = 0;.__inline__ 
0650: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f  unsigned long lo
0660: 6e 67 20 69 6e 74 20 68 77 74 69 6d 65 28 76 6f  ng int hwtime(vo
0670: 69 64 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  id){.  unsigned 
0680: 6c 6f 6e 67 20 6c 6f 6e 67 20 69 6e 74 20 78 3b  long long int x;
0690: 0a 20 20 5f 5f 61 73 6d 5f 5f 28 22 72 64 74 73  .  __asm__("rdts
06a0: 63 5c 6e 5c 74 22 0a 20 20 20 20 20 20 20 20 20  c\n\t".         
06b0: 20 22 6d 6f 76 20 25 25 65 64 78 2c 20 25 25 65   "mov %%edx, %%e
06c0: 63 78 5c 6e 5c 74 22 0a 20 20 20 20 20 20 20 20  cx\n\t".        
06d0: 20 20 3a 22 3d 41 22 20 28 78 29 29 3b 0a 20 20    :"=A" (x));.  
06e0: 72 65 74 75 72 6e 20 78 3b 0a 7d 0a 73 74 61 74  return x;.}.stat
06f0: 69 63 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  ic unsigned long
0700: 20 6c 6f 6e 67 20 69 6e 74 20 67 5f 73 74 61 72   long int g_star
0710: 74 3b 0a 73 74 61 74 69 63 20 75 6e 73 69 67 6e  t;.static unsign
0720: 65 64 20 69 6e 74 20 65 6c 61 70 73 65 3b 0a 23  ed int elapse;.#
0730: 64 65 66 69 6e 65 20 54 49 4d 45 52 5f 53 54 41  define TIMER_STA
0740: 52 54 20 20 20 20 20 20 20 67 5f 73 74 61 72 74  RT       g_start
0750: 3d 68 77 74 69 6d 65 28 29 0a 23 64 65 66 69 6e  =hwtime().#defin
0760: 65 20 54 49 4d 45 52 5f 45 4e 44 20 20 20 20 20  e TIMER_END     
0770: 20 20 20 20 65 6c 61 70 73 65 3d 68 77 74 69 6d      elapse=hwtim
0780: 65 28 29 2d 67 5f 73 74 61 72 74 0a 23 64 65 66  e()-g_start.#def
0790: 69 6e 65 20 53 45 45 4b 28 58 29 20 20 20 20 20  ine SEEK(X)     
07a0: 20 20 20 20 20 20 6c 61 73 74 5f 70 61 67 65 3d        last_page=
07b0: 28 58 29 0a 23 64 65 66 69 6e 65 20 54 52 41 43  (X).#define TRAC
07c0: 45 31 28 58 29 20 20 20 20 20 20 20 20 20 66 70  E1(X)         fp
07d0: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 58 29 0a  rintf(stderr,X).
07e0: 23 64 65 66 69 6e 65 20 54 52 41 43 45 32 28 58  #define TRACE2(X
07f0: 2c 59 29 20 20 20 20 20 20 20 66 70 72 69 6e 74  ,Y)       fprint
0800: 66 28 73 74 64 65 72 72 2c 58 2c 59 29 0a 23 64  f(stderr,X,Y).#d
0810: 65 66 69 6e 65 20 54 52 41 43 45 33 28 58 2c 59  efine TRACE3(X,Y
0820: 2c 5a 29 20 20 20 20 20 66 70 72 69 6e 74 66 28  ,Z)     fprintf(
0830: 73 74 64 65 72 72 2c 58 2c 59 2c 5a 29 0a 23 64  stderr,X,Y,Z).#d
0840: 65 66 69 6e 65 20 54 52 41 43 45 34 28 58 2c 59  efine TRACE4(X,Y
0850: 2c 5a 2c 41 29 20 20 20 66 70 72 69 6e 74 66 28  ,Z,A)   fprintf(
0860: 73 74 64 65 72 72 2c 58 2c 59 2c 5a 2c 41 29 0a  stderr,X,Y,Z,A).
0870: 23 64 65 66 69 6e 65 20 54 52 41 43 45 35 28 58  #define TRACE5(X
0880: 2c 59 2c 5a 2c 41 2c 42 29 20 66 70 72 69 6e 74  ,Y,Z,A,B) fprint
0890: 66 28 73 74 64 65 72 72 2c 58 2c 59 2c 5a 2c 41  f(stderr,X,Y,Z,A
08a0: 2c 42 29 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e  ,B).#else.#defin
08b0: 65 20 54 49 4d 45 52 5f 53 54 41 52 54 0a 23 64  e TIMER_START.#d
08c0: 65 66 69 6e 65 20 54 49 4d 45 52 5f 45 4e 44 0a  efine TIMER_END.
08d0: 23 64 65 66 69 6e 65 20 53 45 45 4b 28 58 29 0a  #define SEEK(X).
08e0: 23 64 65 66 69 6e 65 20 54 52 41 43 45 31 28 58  #define TRACE1(X
08f0: 29 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45 32  ).#define TRACE2
0900: 28 58 2c 59 29 0a 23 64 65 66 69 6e 65 20 54 52  (X,Y).#define TR
0910: 41 43 45 33 28 58 2c 59 2c 5a 29 0a 23 64 65 66  ACE3(X,Y,Z).#def
0920: 69 6e 65 20 54 52 41 43 45 34 28 58 2c 59 2c 5a  ine TRACE4(X,Y,Z
0930: 2c 41 29 0a 23 64 65 66 69 6e 65 20 54 52 41 43  ,A).#define TRAC
0940: 45 35 28 58 2c 59 2c 5a 2c 41 2c 42 29 0a 23 65  E5(X,Y,Z,A,B).#e
0950: 6e 64 69 66 0a 0a 0a 23 69 66 20 4f 53 5f 55 4e  ndif...#if OS_UN
0960: 49 58 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20 69 73  IX./*.** Here is
0970: 20 74 68 65 20 64 69 72 74 20 6f 6e 20 50 4f 53   the dirt on POS
0980: 49 58 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b  IX advisory lock
0990: 73 3a 20 20 41 4e 53 49 20 53 54 44 20 31 30 30  s:  ANSI STD 100
09a0: 33 2e 31 20 28 31 39 39 36 29 0a 2a 2a 20 73 65  3.1 (1996).** se
09b0: 63 74 69 6f 6e 20 36 2e 35 2e 32 2e 32 20 6c 69  ction 6.5.2.2 li
09c0: 6e 65 73 20 34 38 33 20 74 68 72 6f 75 67 68 20  nes 483 through 
09d0: 34 39 30 20 73 70 65 63 69 66 79 20 74 68 61 74  490 specify that
09e0: 20 77 68 65 6e 20 61 20 70 72 6f 63 65 73 73 0a   when a process.
09f0: 2a 2a 20 73 65 74 73 20 6f 72 20 63 6c 65 61 72  ** sets or clear
0a00: 73 20 61 20 6c 6f 63 6b 2c 20 74 68 61 74 20 6f  s a lock, that o
0a10: 70 65 72 61 74 69 6f 6e 20 6f 76 65 72 72 69 64  peration overrid
0a20: 65 73 20 61 6e 79 20 70 72 69 6f 72 20 6c 6f 63  es any prior loc
0a30: 6b 73 20 73 65 74 0a 2a 2a 20 62 79 20 74 68 65  ks set.** by the
0a40: 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2e 20 20   same process.  
0a50: 49 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 70 6c  It does not expl
0a60: 69 63 69 74 6c 79 20 73 61 79 20 73 6f 2c 20 62  icitly say so, b
0a70: 75 74 20 74 68 69 73 20 69 6d 70 6c 69 65 73 0a  ut this implies.
0a80: 2a 2a 20 74 68 61 74 20 69 74 20 6f 76 65 72 72  ** that it overr
0a90: 69 64 65 73 20 6c 6f 63 6b 73 20 73 65 74 20 62  ides locks set b
0aa0: 79 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65  y the same proce
0ab0: 73 73 20 75 73 69 6e 67 20 61 20 64 69 66 66 65  ss using a diffe
0ac0: 72 65 6e 74 0a 2a 2a 20 66 69 6c 65 20 64 65 73  rent.** file des
0ad0: 63 72 69 70 74 6f 72 2e 20 20 43 6f 6e 73 69 64  criptor.  Consid
0ae0: 65 72 20 74 68 69 73 20 74 65 73 74 20 63 61 73  er this test cas
0af0: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 69  e:.**.**       i
0b00: 6e 74 20 66 64 31 20 3d 20 6f 70 65 6e 28 22 2e  nt fd1 = open(".
0b10: 2f 66 69 6c 65 31 22 2c 20 4f 5f 52 44 57 52 7c  /file1", O_RDWR|
0b20: 4f 5f 43 52 45 41 54 2c 20 30 36 34 34 29 3b 0a  O_CREAT, 0644);.
0b30: 2a 2a 20 20 20 20 20 20 20 69 6e 74 20 66 64 32  **       int fd2
0b40: 20 3d 20 6f 70 65 6e 28 22 2e 2f 66 69 6c 65 32   = open("./file2
0b50: 22 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41  ", O_RDWR|O_CREA
0b60: 54 2c 20 30 36 34 34 29 3b 0a 2a 2a 0a 2a 2a 20  T, 0644);.**.** 
0b70: 53 75 70 70 6f 73 65 20 2e 2f 66 69 6c 65 31 20  Suppose ./file1 
0b80: 61 6e 64 20 2e 2f 66 69 6c 65 32 20 61 72 65 20  and ./file2 are 
0b90: 72 65 61 6c 6c 79 20 74 68 65 20 73 61 6d 65 20  really the same 
0ba0: 66 69 6c 65 20 28 62 65 63 61 75 73 65 0a 2a 2a  file (because.**
0bb0: 20 6f 6e 65 20 69 73 20 61 20 68 61 72 64 20 6f   one is a hard o
0bc0: 72 20 73 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b 20  r symbolic link 
0bd0: 74 6f 20 74 68 65 20 6f 74 68 65 72 29 20 74 68  to the other) th
0be0: 65 6e 20 69 66 20 79 6f 75 20 73 65 74 0a 2a 2a  en if you set.**
0bf0: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
0c00: 63 6b 20 6f 6e 20 66 64 31 2c 20 74 68 65 6e 20  ck on fd1, then 
0c10: 74 72 79 20 74 6f 20 67 65 74 20 61 6e 20 65 78  try to get an ex
0c20: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 0a 2a 2a 20  clusive lock.** 
0c30: 6f 6e 20 66 64 32 2c 20 69 74 20 77 6f 72 6b 73  on fd2, it works
0c40: 2e 20 20 49 20 77 6f 75 6c 64 20 68 61 76 65 20  .  I would have 
0c50: 65 78 70 65 63 74 65 64 20 74 68 65 20 73 65 63  expected the sec
0c60: 6f 6e 64 20 6c 6f 63 6b 20 74 6f 0a 2a 2a 20 66  ond lock to.** f
0c70: 61 69 6c 20 73 69 6e 63 65 20 74 68 65 72 65 20  ail since there 
0c80: 77 61 73 20 61 6c 72 65 61 64 79 20 61 20 6c 6f  was already a lo
0c90: 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 64  ck on the file d
0ca0: 75 65 20 74 6f 20 66 64 31 2e 0a 2a 2a 20 42 75  ue to fd1..** Bu
0cb0: 74 20 6e 6f 74 20 73 6f 2e 20 20 53 69 6e 63 65  t not so.  Since
0cc0: 20 62 6f 74 68 20 6c 6f 63 6b 73 20 63 61 6d 65   both locks came
0cd0: 20 66 72 6f 6d 20 74 68 65 20 73 61 6d 65 20 70   from the same p
0ce0: 72 6f 63 65 73 73 2c 20 74 68 65 0a 2a 2a 20 73  rocess, the.** s
0cf0: 65 63 6f 6e 64 20 6f 76 65 72 72 69 64 65 73 20  econd overrides 
0d00: 74 68 65 20 66 69 72 73 74 2c 20 65 76 65 6e 20  the first, even 
0d10: 74 68 6f 75 67 68 20 74 68 65 79 20 77 65 72 65  though they were
0d20: 20 6f 6e 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a   on different.**
0d30: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
0d40: 73 20 6f 70 65 6e 65 64 20 6f 6e 20 64 69 66 66  s opened on diff
0d50: 65 72 65 6e 74 20 66 69 6c 65 20 6e 61 6d 65 73  erent file names
0d60: 2e 0a 2a 2a 0a 2a 2a 20 42 75 6d 6d 65 72 2e 20  ..**.** Bummer. 
0d70: 20 49 66 20 79 6f 75 20 61 73 6b 20 6d 65 2c 20   If you ask me, 
0d80: 74 68 69 73 20 69 73 20 62 72 6f 6b 65 6e 2e 20  this is broken. 
0d90: 20 42 61 64 6c 79 20 62 72 6f 6b 65 6e 2e 20 20   Badly broken.  
0da0: 49 74 20 6d 65 61 6e 73 0a 2a 2a 20 74 68 61 74  It means.** that
0db0: 20 77 65 20 63 61 6e 6e 6f 74 20 75 73 65 20 50   we cannot use P
0dc0: 4f 53 49 58 20 6c 6f 63 6b 73 20 74 6f 20 73 79  OSIX locks to sy
0dd0: 6e 63 68 72 6f 6e 69 7a 65 20 66 69 6c 65 20 61  nchronize file a
0de0: 63 63 65 73 73 20 61 6d 6f 6e 67 0a 2a 2a 20 63  ccess among.** c
0df0: 6f 6d 70 65 74 69 6e 67 20 74 68 72 65 61 64 73  ompeting threads
0e00: 20 6f 66 20 74 68 65 20 73 61 6d 65 20 70 72 6f   of the same pro
0e10: 63 65 73 73 2e 20 20 50 4f 53 49 58 20 6c 6f 63  cess.  POSIX loc
0e20: 6b 73 20 77 69 6c 6c 20 77 6f 72 6b 20 66 69 6e  ks will work fin
0e30: 65 0a 2a 2a 20 74 6f 20 73 79 6e 63 68 72 6f 6e  e.** to synchron
0e40: 69 7a 65 20 61 63 63 65 73 73 20 66 6f 72 20 74  ize access for t
0e50: 68 72 65 61 64 73 20 69 6e 20 73 65 70 61 72 61  hreads in separa
0e60: 74 65 20 70 72 6f 63 65 73 73 65 73 2c 20 62 75  te processes, bu
0e70: 74 20 6e 6f 74 0a 2a 2a 20 74 68 72 65 61 64 73  t not.** threads
0e80: 20 77 69 74 68 69 6e 20 74 68 65 20 73 61 6d 65   within the same
0e90: 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   process..**.** 
0ea0: 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74  To work around t
0eb0: 68 65 20 70 72 6f 62 6c 65 6d 2c 20 53 51 4c 69  he problem, SQLi
0ec0: 74 65 20 68 61 73 20 74 6f 20 6d 61 6e 61 67 65  te has to manage
0ed0: 20 66 69 6c 65 20 6c 6f 63 6b 73 20 69 6e 74 65   file locks inte
0ee0: 72 6e 61 6c 6c 79 0a 2a 2a 20 6f 6e 20 69 74 73  rnally.** on its
0ef0: 20 6f 77 6e 2e 20 20 57 68 65 6e 65 76 65 72 20   own.  Whenever 
0f00: 61 20 6e 65 77 20 64 61 74 61 62 61 73 65 20 69  a new database i
0f10: 73 20 6f 70 65 6e 65 64 2c 20 77 65 20 68 61 76  s opened, we hav
0f20: 65 20 74 6f 20 66 69 6e 64 20 74 68 65 0a 2a 2a  e to find the.**
0f30: 20 73 70 65 63 69 66 69 63 20 69 6e 6f 64 65 20   specific inode 
0f40: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
0f50: 66 69 6c 65 20 28 74 68 65 20 69 6e 6f 64 65 20  file (the inode 
0f60: 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  is determined by
0f70: 20 74 68 65 0a 2a 2a 20 73 74 5f 64 65 76 20 61   the.** st_dev a
0f80: 6e 64 20 73 74 5f 69 6e 6f 20 66 69 65 6c 64 73  nd st_ino fields
0f90: 20 6f 66 20 74 68 65 20 73 74 61 74 20 73 74 72   of the stat str
0fa0: 75 63 74 75 72 65 20 74 68 61 74 20 66 73 74 61  ucture that fsta
0fb0: 74 28 29 20 66 69 6c 6c 73 20 69 6e 29 0a 2a 2a  t() fills in).**
0fc0: 20 61 6e 64 20 63 68 65 63 6b 20 66 6f 72 20 6c   and check for l
0fd0: 6f 63 6b 73 20 61 6c 72 65 61 64 79 20 65 78 69  ocks already exi
0fe0: 73 74 69 6e 67 20 6f 6e 20 74 68 61 74 20 69 6e  sting on that in
0ff0: 6f 64 65 2e 20 20 57 68 65 6e 20 6c 6f 63 6b 73  ode.  When locks
1000: 20 61 72 65 0a 2a 2a 20 63 72 65 61 74 65 64 20   are.** created 
1010: 6f 72 20 72 65 6d 6f 76 65 64 2c 20 77 65 20 68  or removed, we h
1020: 61 76 65 20 74 6f 20 6c 6f 6f 6b 20 61 74 20 6f  ave to look at o
1030: 75 72 20 6f 77 6e 20 69 6e 74 65 72 6e 61 6c 20  ur own internal 
1040: 72 65 63 6f 72 64 20 6f 66 20 74 68 65 0a 2a 2a  record of the.**
1050: 20 6c 6f 63 6b 73 20 74 6f 20 73 65 65 20 69 66   locks to see if
1060: 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20   another thread 
1070: 68 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 73  has previously s
1080: 65 74 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 61  et a lock on tha
1090: 74 20 73 61 6d 65 0a 2a 2a 20 69 6e 6f 64 65 2e  t same.** inode.
10a0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 4f 73 46 69 6c  .**.** The OsFil
10b0: 65 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20  e structure for 
10c0: 50 4f 53 49 58 20 69 73 20 6e 6f 20 6c 6f 6e 67  POSIX is no long
10d0: 65 72 20 6a 75 73 74 20 61 6e 20 69 6e 74 65 67  er just an integ
10e0: 65 72 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72  er file.** descr
10f0: 69 70 74 6f 72 2e 20 20 49 74 20 69 73 20 6e 6f  iptor.  It is no
1100: 77 20 61 20 73 74 72 75 63 74 75 72 65 20 74 68  w a structure th
1110: 61 74 20 68 6f 6c 64 73 20 74 68 65 20 69 6e 74  at holds the int
1120: 65 67 65 72 20 66 69 6c 65 0a 2a 2a 20 64 65 73  eger file.** des
1130: 63 72 69 70 74 6f 72 20 61 6e 64 20 61 20 70 6f  criptor and a po
1140: 69 6e 74 65 72 20 74 6f 20 61 20 73 74 72 75 63  inter to a struc
1150: 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69  ture that descri
1160: 62 65 73 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  bes the internal
1170: 0a 2a 2a 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65  .** locks on the
1180: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 69   corresponding i
1190: 6e 6f 64 65 2e 20 20 54 68 65 72 65 20 69 73 20  node.  There is 
11a0: 6f 6e 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75  one locking stru
11b0: 63 74 75 72 65 0a 2a 2a 20 70 65 72 20 69 6e 6f  cture.** per ino
11c0: 64 65 2c 20 73 6f 20 69 66 20 74 68 65 20 73 61  de, so if the sa
11d0: 6d 65 20 69 6e 6f 64 65 20 69 73 20 6f 70 65 6e  me inode is open
11e0: 65 64 20 74 77 69 63 65 2c 20 62 6f 74 68 20 4f  ed twice, both O
11f0: 73 46 69 6c 65 20 73 74 72 75 63 74 75 72 65 73  sFile structures
1200: 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 74 68 65  .** point to the
1210: 20 73 61 6d 65 20 6c 6f 63 6b 69 6e 67 20 73 74   same locking st
1220: 72 75 63 74 75 72 65 2e 20 20 54 68 65 20 6c 6f  ructure.  The lo
1230: 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  cking structure 
1240: 6b 65 65 70 73 0a 2a 2a 20 61 20 72 65 66 65 72  keeps.** a refer
1250: 65 6e 63 65 20 63 6f 75 6e 74 20 28 73 6f 20 77  ence count (so w
1260: 65 20 77 69 6c 6c 20 6b 6e 6f 77 20 77 68 65 6e  e will know when
1270: 20 74 6f 20 64 65 6c 65 74 65 20 69 74 29 20 61   to delete it) a
1280: 6e 64 20 61 20 22 63 6e 74 22 0a 2a 2a 20 66 69  nd a "cnt".** fi
1290: 65 6c 64 20 74 68 61 74 20 74 65 6c 6c 73 20 75  eld that tells u
12a0: 73 20 69 74 73 20 69 6e 74 65 72 6e 61 6c 20 6c  s its internal l
12b0: 6f 63 6b 20 73 74 61 74 75 73 2e 20 20 63 6e 74  ock status.  cnt
12c0: 3d 3d 30 20 6d 65 61 6e 73 20 74 68 65 0a 2a 2a  ==0 means the.**
12d0: 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65   file is unlocke
12e0: 64 2e 20 20 63 6e 74 3d 3d 2d 31 20 6d 65 61 6e  d.  cnt==-1 mean
12f0: 73 20 74 68 65 20 66 69 6c 65 20 68 61 73 20 61  s the file has a
1300: 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
1310: 2e 0a 2a 2a 20 63 6e 74 3e 30 20 6d 65 61 6e 73  ..** cnt>0 means
1320: 20 74 68 65 72 65 20 61 72 65 20 63 6e 74 20 73   there are cnt s
1330: 68 61 72 65 64 20 6c 6f 63 6b 73 20 6f 6e 20 74  hared locks on t
1340: 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41  he file..**.** A
1350: 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f  ny attempt to lo
1360: 63 6b 20 6f 72 20 75 6e 6c 6f 63 6b 20 61 20 66  ck or unlock a f
1370: 69 6c 65 20 66 69 72 73 74 20 63 68 65 63 6b 73  ile first checks
1380: 20 74 68 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20   the locking.** 
1390: 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 20  structure.  The 
13a0: 66 63 6e 74 6c 28 29 20 73 79 73 74 65 6d 20 63  fcntl() system c
13b0: 61 6c 6c 20 69 73 20 6f 6e 6c 79 20 69 6e 76 6f  all is only invo
13c0: 6b 65 64 20 74 6f 20 73 65 74 20 61 20 0a 2a 2a  ked to set a .**
13d0: 20 50 4f 53 49 58 20 6c 6f 63 6b 20 69 66 20 74   POSIX lock if t
13e0: 68 65 20 69 6e 74 65 72 6e 61 6c 20 6c 6f 63 6b  he internal lock
13f0: 20 73 74 72 75 63 74 75 72 65 20 74 72 61 6e 73   structure trans
1400: 69 74 69 6f 6e 73 20 62 65 74 77 65 65 6e 0a 2a  itions between.*
1410: 2a 20 61 20 6c 6f 63 6b 65 64 20 61 6e 64 20 61  * a locked and a
1420: 6e 20 75 6e 6c 6f 63 6b 65 64 20 73 74 61 74 65  n unlocked state
1430: 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69  ..*/../*.** An i
1440: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
1450: 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75  ollowing structu
1460: 72 65 20 73 65 72 76 65 73 20 61 73 20 74 68 65  re serves as the
1470: 20 6b 65 79 20 75 73 65 64 0a 2a 2a 20 74 6f 20   key used.** to 
1480: 6c 6f 63 61 74 65 20 61 20 70 61 72 74 69 63 75  locate a particu
1490: 6c 61 72 20 6c 6f 63 6b 49 6e 66 6f 20 73 74 72  lar lockInfo str
14a0: 75 63 74 75 72 65 20 67 69 76 65 6e 20 69 74 73  ucture given its
14b0: 20 69 6e 6f 64 65 2e 20 0a 2a 2f 0a 73 74 72 75   inode. .*/.stru
14c0: 63 74 20 69 6e 6f 64 65 4b 65 79 20 7b 0a 20 20  ct inodeKey {.  
14d0: 64 65 76 5f 74 20 64 65 76 3b 20 20 20 2f 2a 20  dev_t dev;   /* 
14e0: 44 65 76 69 63 65 20 6e 75 6d 62 65 72 20 2a 2f  Device number */
14f0: 0a 20 20 69 6e 6f 5f 74 20 69 6e 6f 3b 20 20 20  .  ino_t ino;   
1500: 2f 2a 20 49 6e 6f 64 65 20 6e 75 6d 62 65 72 20  /* Inode number 
1510: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  */.};../*.** An 
1520: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
1530: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
1540: 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ure is allocated
1550: 20 66 6f 72 20 65 61 63 68 20 69 6e 6f 64 65 2e   for each inode.
1560: 0a 2a 2a 20 41 20 73 69 6e 67 6c 65 20 69 6e 6f  .** A single ino
1570: 64 65 20 63 61 6e 20 68 61 76 65 20 6d 75 6c 74  de can have mult
1580: 69 70 6c 65 20 66 69 6c 65 20 64 65 73 63 72 69  iple file descri
1590: 70 74 6f 72 73 2c 20 73 6f 20 65 61 63 68 20 4f  ptors, so each O
15a0: 73 46 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74 75  sFile.** structu
15b0: 72 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f  re contains a po
15c0: 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 73 74  inter to an inst
15d0: 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6f 62 6a  ance of this obj
15e0: 65 63 74 20 61 6e 64 20 74 68 69 73 0a 2a 2a 20  ect and this.** 
15f0: 6f 62 6a 65 63 74 20 6b 65 65 70 73 20 61 20 63  object keeps a c
1600: 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d 62  ount of the numb
1610: 65 72 20 6f 66 20 4f 73 46 69 6c 65 73 20 70 6f  er of OsFiles po
1620: 69 6e 74 69 6e 67 20 74 6f 20 69 74 2e 0a 2a 2f  inting to it..*/
1630: 0a 73 74 72 75 63 74 20 6c 6f 63 6b 49 6e 66 6f  .struct lockInfo
1640: 20 7b 0a 20 20 73 74 72 75 63 74 20 69 6e 6f 64   {.  struct inod
1650: 65 4b 65 79 20 6b 65 79 3b 20 20 2f 2a 20 54 68  eKey key;  /* Th
1660: 65 20 6c 6f 6f 6b 75 70 20 6b 65 79 20 2a 2f 0a  e lookup key */.
1670: 20 20 69 6e 74 20 63 6e 74 3b 20 20 20 20 20 20    int cnt;      
1680: 20 20 20 20 20 20 20 20 2f 2a 20 30 3a 20 75 6e          /* 0: un
1690: 6c 6f 63 6b 65 64 2e 20 20 2d 31 3a 20 77 72 69  locked.  -1: wri
16a0: 74 65 20 6c 6f 63 6b 2e 20 20 31 2e 2e 2e 3a 20  te lock.  1...: 
16b0: 72 65 61 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20  read lock. */.  
16c0: 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20  int nRef;       
16d0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
16e0: 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74  of pointers to t
16f0: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f  his structure */
1700: 0a 7d 3b 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73  .};../* .** This
1710: 20 68 61 73 68 20 74 61 62 6c 65 20 6d 61 70 73   hash table maps
1720: 20 69 6e 6f 64 65 73 20 28 69 6e 20 74 68 65 20   inodes (in the 
1730: 66 6f 72 6d 20 6f 66 20 69 6e 6f 64 65 4b 65 79  form of inodeKey
1740: 20 73 74 72 75 63 74 75 72 65 73 29 20 69 6e 74   structures) int
1750: 6f 0a 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f  o.** pointers to
1760: 20 6c 6f 63 6b 49 6e 66 6f 20 73 74 72 75 63 74   lockInfo struct
1770: 75 72 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ures..*/.static 
1780: 48 61 73 68 20 6c 6f 63 6b 48 61 73 68 20 3d 20  Hash lockHash = 
1790: 7b 20 53 51 4c 49 54 45 5f 48 41 53 48 5f 42 49  { SQLITE_HASH_BI
17a0: 4e 41 52 59 2c 20 30 2c 20 30 2c 20 30 2c 20 30  NARY, 0, 0, 0, 0
17b0: 2c 20 30 20 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 47 69  , 0 };../*.** Gi
17c0: 76 65 6e 20 61 20 66 69 6c 65 20 64 65 73 63 72  ven a file descr
17d0: 69 70 74 6f 72 2c 20 6c 6f 63 61 74 65 20 61 20  iptor, locate a 
17e0: 6c 6f 63 6b 49 6e 66 6f 20 73 74 72 75 63 74 75  lockInfo structu
17f0: 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65  re that describe
1800: 73 0a 2a 2a 20 74 68 61 74 20 66 69 6c 65 20 64  s.** that file d
1810: 65 73 63 72 69 70 74 6f 72 2e 20 20 43 72 65 61  escriptor.  Crea
1820: 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 69 66 20  te a new one if 
1830: 6e 65 63 65 73 73 61 72 79 2e 20 20 4e 55 4c 4c  necessary.  NULL
1840: 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 72 65 74   might.** be ret
1850: 75 72 6e 65 64 20 69 66 20 6d 61 6c 6c 6f 63 28  urned if malloc(
1860: 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74  ) fails..*/.stat
1870: 69 63 20 73 74 72 75 63 74 20 6c 6f 63 6b 49 6e  ic struct lockIn
1880: 66 6f 20 2a 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f  fo *findLockInfo
1890: 28 69 6e 74 20 66 64 29 7b 0a 20 20 69 6e 74 20  (int fd){.  int 
18a0: 72 63 3b 0a 20 20 73 74 72 75 63 74 20 69 6e 6f  rc;.  struct ino
18b0: 64 65 4b 65 79 20 6b 65 79 3b 0a 20 20 73 74 72  deKey key;.  str
18c0: 75 63 74 20 73 74 61 74 20 73 74 61 74 62 75 66  uct stat statbuf
18d0: 3b 0a 20 20 73 74 72 75 63 74 20 6c 6f 63 6b 49  ;.  struct lockI
18e0: 6e 66 6f 20 2a 70 49 6e 66 6f 3b 0a 20 20 72 63  nfo *pInfo;.  rc
18f0: 20 3d 20 66 73 74 61 74 28 66 64 2c 20 26 73 74   = fstat(fd, &st
1900: 61 74 62 75 66 29 3b 0a 20 20 69 66 28 20 72 63  atbuf);.  if( rc
1910: 21 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  !=0 ) return 0;.
1920: 20 20 6d 65 6d 73 65 74 28 26 6b 65 79 2c 20 30    memset(&key, 0
1930: 2c 20 73 69 7a 65 6f 66 28 6b 65 79 29 29 3b 0a  , sizeof(key));.
1940: 20 20 6b 65 79 2e 64 65 76 20 3d 20 73 74 61 74    key.dev = stat
1950: 62 75 66 2e 73 74 5f 64 65 76 3b 0a 20 20 6b 65  buf.st_dev;.  ke
1960: 79 2e 69 6e 6f 20 3d 20 73 74 61 74 62 75 66 2e  y.ino = statbuf.
1970: 73 74 5f 69 6e 6f 3b 0a 20 20 70 49 6e 66 6f 20  st_ino;.  pInfo 
1980: 3d 20 28 73 74 72 75 63 74 20 6c 6f 63 6b 49 6e  = (struct lockIn
1990: 66 6f 2a 29 73 71 6c 69 74 65 48 61 73 68 46 69  fo*)sqliteHashFi
19a0: 6e 64 28 26 6c 6f 63 6b 48 61 73 68 2c 20 26 6b  nd(&lockHash, &k
19b0: 65 79 2c 20 73 69 7a 65 6f 66 28 6b 65 79 29 29  ey, sizeof(key))
19c0: 3b 0a 20 20 69 66 28 20 70 49 6e 66 6f 3d 3d 30  ;.  if( pInfo==0
19d0: 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 6c   ){.    struct l
19e0: 6f 63 6b 49 6e 66 6f 20 2a 70 4f 6c 64 3b 0a 20  ockInfo *pOld;. 
19f0: 20 20 20 70 49 6e 66 6f 20 3d 20 73 71 6c 69 74     pInfo = sqlit
1a00: 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  eMalloc( sizeof(
1a10: 2a 70 49 6e 66 6f 29 20 29 3b 0a 20 20 20 20 69  *pInfo) );.    i
1a20: 66 28 20 70 49 6e 66 6f 3d 3d 30 20 29 20 72 65  f( pInfo==0 ) re
1a30: 74 75 72 6e 20 30 3b 0a 20 20 20 20 70 49 6e 66  turn 0;.    pInf
1a40: 6f 2d 3e 6b 65 79 20 3d 20 6b 65 79 3b 0a 20 20  o->key = key;.  
1a50: 20 20 70 49 6e 66 6f 2d 3e 6e 52 65 66 20 3d 20    pInfo->nRef = 
1a60: 31 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 63 6e  1;.    pInfo->cn
1a70: 74 20 3d 20 30 3b 0a 20 20 20 20 70 4f 6c 64 20  t = 0;.    pOld 
1a80: 3d 20 73 71 6c 69 74 65 48 61 73 68 49 6e 73 65  = sqliteHashInse
1a90: 72 74 28 26 6c 6f 63 6b 48 61 73 68 2c 20 26 70  rt(&lockHash, &p
1aa0: 49 6e 66 6f 2d 3e 6b 65 79 2c 20 73 69 7a 65 6f  Info->key, sizeo
1ab0: 66 28 6b 65 79 29 2c 20 70 49 6e 66 6f 29 3b 0a  f(key), pInfo);.
1ac0: 20 20 20 20 69 66 28 20 70 4f 6c 64 21 3d 30 20      if( pOld!=0 
1ad0: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
1ae0: 20 70 4f 6c 64 3d 3d 70 49 6e 66 6f 20 29 3b 0a   pOld==pInfo );.
1af0: 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
1b00: 28 70 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 70  (pInfo);.      p
1b10: 49 6e 66 6f 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Info = 0;.    }.
1b20: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e    }else{.    pIn
1b30: 66 6f 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a  fo->nRef++;.  }.
1b40: 20 20 72 65 74 75 72 6e 20 70 49 6e 66 6f 3b 0a    return pInfo;.
1b50: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65  }../*.** Release
1b60: 20 61 20 6c 6f 63 6b 49 6e 66 6f 20 73 74 72 75   a lockInfo stru
1b70: 63 74 75 72 65 20 70 72 65 76 69 6f 75 73 6c 79  cture previously
1b80: 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 66 69   allocated by fi
1b90: 6e 64 4c 6f 63 6b 49 6e 66 6f 28 29 2e 0a 2a 2f  ndLockInfo()..*/
1ba0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c  .static void rel
1bb0: 65 61 73 65 4c 6f 63 6b 49 6e 66 6f 28 73 74 72  easeLockInfo(str
1bc0: 75 63 74 20 6c 6f 63 6b 49 6e 66 6f 20 2a 70 49  uct lockInfo *pI
1bd0: 6e 66 6f 29 7b 0a 20 20 70 49 6e 66 6f 2d 3e 6e  nfo){.  pInfo->n
1be0: 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 49 6e  Ref--;.  if( pIn
1bf0: 66 6f 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20  fo->nRef==0 ){. 
1c00: 20 20 20 73 71 6c 69 74 65 48 61 73 68 49 6e 73     sqliteHashIns
1c10: 65 72 74 28 26 6c 6f 63 6b 48 61 73 68 2c 20 26  ert(&lockHash, &
1c20: 70 49 6e 66 6f 2d 3e 6b 65 79 2c 20 73 69 7a 65  pInfo->key, size
1c30: 6f 66 28 70 49 6e 66 6f 2d 3e 6b 65 79 29 2c 20  of(pInfo->key), 
1c40: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  0);.    sqliteFr
1c50: 65 65 28 70 49 6e 66 6f 29 3b 0a 20 20 7d 0a 7d  ee(pInfo);.  }.}
1c60: 0a 23 65 6e 64 69 66 20 20 2f 2a 2a 20 50 4f 53  .#endif  /** POS
1c70: 49 58 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b  IX advisory lock
1c80: 20 77 6f 72 6b 2d 61 72 6f 75 6e 64 20 2a 2a 2f   work-around **/
1c90: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20 63 6f  ../*.** If we co
1ca0: 6d 70 69 6c 65 20 77 69 74 68 20 74 68 65 20 53  mpile with the S
1cb0: 51 4c 49 54 45 5f 54 45 53 54 20 6d 61 63 72 6f  QLITE_TEST macro
1cc0: 20 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20 66   set, then the f
1cd0: 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 0a 2a  ollowing block.*
1ce0: 2a 20 6f 66 20 63 6f 64 65 20 77 69 6c 6c 20 67  * of code will g
1cf0: 69 76 65 20 75 73 20 74 68 65 20 61 62 69 6c 69  ive us the abili
1d00: 74 79 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 61  ty to simulate a
1d10: 20 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 2e   disk I/O error.
1d20: 20 20 54 68 69 73 0a 2a 2a 20 69 73 20 75 73 65    This.** is use
1d30: 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20 74 68  d for testing th
1d40: 65 20 49 2f 4f 20 72 65 63 6f 76 65 72 79 20 6c  e I/O recovery l
1d50: 6f 67 69 63 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  ogic..*/.#ifdef 
1d60: 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20  SQLITE_TEST.int 
1d70: 73 71 6c 69 74 65 5f 69 6f 5f 65 72 72 6f 72 5f  sqlite_io_error_
1d80: 70 65 6e 64 69 6e 67 20 3d 20 30 3b 0a 23 64 65  pending = 0;.#de
1d90: 66 69 6e 65 20 53 69 6d 75 6c 61 74 65 49 4f 45  fine SimulateIOE
1da0: 72 72 6f 72 28 41 29 20 20 5c 0a 20 20 20 69 66  rror(A)  \.   if
1db0: 28 20 73 71 6c 69 74 65 5f 69 6f 5f 65 72 72 6f  ( sqlite_io_erro
1dc0: 72 5f 70 65 6e 64 69 6e 67 20 29 20 5c 0a 20 20  r_pending ) \.  
1dd0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 5f 69 6f     if( sqlite_io
1de0: 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 2d 2d  _error_pending--
1df0: 20 3d 3d 20 31 20 29 7b 20 6c 6f 63 61 6c 5f 69   == 1 ){ local_i
1e00: 6f 65 72 72 28 29 3b 20 72 65 74 75 72 6e 20 41  oerr(); return A
1e10: 3b 20 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ; }.static void 
1e20: 6c 6f 63 61 6c 5f 69 6f 65 72 72 28 29 7b 0a 20  local_ioerr(){. 
1e30: 20 73 71 6c 69 74 65 5f 69 6f 5f 65 72 72 6f 72   sqlite_io_error
1e40: 5f 70 65 6e 64 69 6e 67 20 3d 20 30 3b 20 20 2f  _pending = 0;  /
1e50: 2a 20 52 65 61 6c 6c 79 20 6a 75 73 74 20 61 20  * Really just a 
1e60: 70 6c 61 63 65 20 74 6f 20 73 65 74 20 61 20 62  place to set a b
1e70: 72 65 61 6b 70 6f 69 6e 74 20 2a 2f 0a 7d 0a 23  reakpoint */.}.#
1e80: 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 53 69 6d  else.#define Sim
1e90: 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 41 29 0a  ulateIOError(A).
1ea0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 68  #endif../*.** Wh
1eb0: 65 6e 20 74 65 73 74 69 6e 67 2c 20 6b 65 65 70  en testing, keep
1ec0: 20 61 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20   a count of the 
1ed0: 6e 75 6d 62 65 72 20 6f 66 20 6f 70 65 6e 20 66  number of open f
1ee0: 69 6c 65 73 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  iles..*/.#ifdef 
1ef0: 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20  SQLITE_TEST.int 
1f00: 73 71 6c 69 74 65 5f 6f 70 65 6e 5f 66 69 6c 65  sqlite_open_file
1f10: 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 64 65 66  _count = 0;.#def
1f20: 69 6e 65 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28  ine OpenCounter(
1f30: 58 29 20 20 73 71 6c 69 74 65 5f 6f 70 65 6e 5f  X)  sqlite_open_
1f40: 66 69 6c 65 5f 63 6f 75 6e 74 2b 3d 28 58 29 0a  file_count+=(X).
1f50: 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 4f 70  #else.#define Op
1f60: 65 6e 43 6f 75 6e 74 65 72 28 58 29 0a 23 65 6e  enCounter(X).#en
1f70: 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  dif.../*.** Dele
1f80: 74 65 20 74 68 65 20 6e 61 6d 65 64 20 66 69 6c  te the named fil
1f90: 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 4f  e.*/.int sqliteO
1fa0: 73 44 65 6c 65 74 65 28 63 6f 6e 73 74 20 63 68  sDelete(const ch
1fb0: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a  ar *zFilename){.
1fc0: 23 69 66 20 4f 53 5f 55 4e 49 58 0a 20 20 75 6e  #if OS_UNIX.  un
1fd0: 6c 69 6e 6b 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  link(zFilename);
1fe0: 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f 53 5f 57  .#endif.#if OS_W
1ff0: 49 4e 0a 20 20 44 65 6c 65 74 65 46 69 6c 65 28  IN.  DeleteFile(
2000: 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 23 65 6e 64  zFilename);.#end
2010: 69 66 0a 23 69 66 20 4f 53 5f 4d 41 43 0a 20 20  if.#if OS_MAC.  
2020: 75 6e 6c 69 6e 6b 28 7a 46 69 6c 65 6e 61 6d 65  unlink(zFilename
2030: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75  );.#endif.  retu
2040: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
2050: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
2060: 55 45 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20  UE if the named 
2070: 66 69 6c 65 20 65 78 69 73 74 73 2e 0a 2a 2f 0a  file exists..*/.
2080: 69 6e 74 20 73 71 6c 69 74 65 4f 73 46 69 6c 65  int sqliteOsFile
2090: 45 78 69 73 74 73 28 63 6f 6e 73 74 20 63 68 61  Exists(const cha
20a0: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 23  r *zFilename){.#
20b0: 69 66 20 4f 53 5f 55 4e 49 58 0a 20 20 72 65 74  if OS_UNIX.  ret
20c0: 75 72 6e 20 61 63 63 65 73 73 28 7a 46 69 6c 65  urn access(zFile
20d0: 6e 61 6d 65 2c 20 30 29 3d 3d 30 3b 0a 23 65 6e  name, 0)==0;.#en
20e0: 64 69 66 0a 23 69 66 20 4f 53 5f 57 49 4e 0a 20  dif.#if OS_WIN. 
20f0: 20 72 65 74 75 72 6e 20 47 65 74 46 69 6c 65 41   return GetFileA
2100: 74 74 72 69 62 75 74 65 73 28 7a 46 69 6c 65 6e  ttributes(zFilen
2110: 61 6d 65 29 20 21 3d 20 30 78 66 66 66 66 66 66  ame) != 0xffffff
2120: 66 66 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f  ff;.#endif.#if O
2130: 53 5f 4d 41 43 0a 20 20 72 65 74 75 72 6e 20 61  S_MAC.  return a
2140: 63 63 65 73 73 28 7a 46 69 6c 65 6e 61 6d 65 2c  ccess(zFilename,
2150: 20 30 29 3d 3d 30 3b 0a 23 65 6e 64 69 66 0a 7d   0)==0;.#endif.}
2160: 0a 0a 0a 23 69 66 20 30 20 2f 2a 20 4e 4f 54 20  ...#if 0 /* NOT 
2170: 55 53 45 44 20 2a 2f 0a 2f 2a 0a 2a 2a 20 43 68  USED */./*.** Ch
2180: 61 6e 67 65 20 74 68 65 20 6e 61 6d 65 20 6f 66  ange the name of
2190: 20 61 6e 20 65 78 69 73 74 69 6e 67 20 66 69 6c   an existing fil
21a0: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
21b0: 4f 73 46 69 6c 65 52 65 6e 61 6d 65 28 63 6f 6e  OsFileRename(con
21c0: 73 74 20 63 68 61 72 20 2a 7a 4f 6c 64 4e 61 6d  st char *zOldNam
21d0: 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  e, const char *z
21e0: 4e 65 77 4e 61 6d 65 29 7b 0a 23 69 66 20 4f 53  NewName){.#if OS
21f0: 5f 55 4e 49 58 0a 20 20 69 66 28 20 6c 69 6e 6b  _UNIX.  if( link
2200: 28 7a 4f 6c 64 4e 61 6d 65 2c 20 7a 4e 65 77 4e  (zOldName, zNewN
2210: 61 6d 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ame) ){.    retu
2220: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
2230: 0a 20 20 7d 0a 20 20 75 6e 6c 69 6e 6b 28 7a 4f  .  }.  unlink(zO
2240: 6c 64 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72  ldName);.  retur
2250: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e  n SQLITE_OK;.#en
2260: 64 69 66 0a 23 69 66 20 4f 53 5f 57 49 4e 0a 20  dif.#if OS_WIN. 
2270: 20 69 66 28 20 21 4d 6f 76 65 46 69 6c 65 28 7a   if( !MoveFile(z
2280: 4f 6c 64 4e 61 6d 65 2c 20 7a 4e 65 77 4e 61 6d  OldName, zNewNam
2290: 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  e) ){.    return
22a0: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
22b0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
22c0: 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 23 69  TE_OK;.#endif.#i
22d0: 66 20 4f 53 5f 4d 41 43 0a 20 20 2f 2a 2a 2a 2a  f OS_MAC.  /****
22e0: 20 46 49 58 20 4d 45 20 2a 2a 2a 2f 0a 20 20 72   FIX ME ***/.  r
22f0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
2300: 4f 52 3b 0a 23 65 6e 64 69 66 0a 7d 0a 23 65 6e  OR;.#endif.}.#en
2310: 64 69 66 20 2f 2a 20 4e 4f 54 20 55 53 45 44 20  dif /* NOT USED 
2320: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70  */../*.** Attemp
2330: 74 20 74 6f 20 6f 70 65 6e 20 61 20 66 69 6c 65  t to open a file
2340: 20 66 6f 72 20 62 6f 74 68 20 72 65 61 64 69 6e   for both readin
2350: 67 20 61 6e 64 20 77 72 69 74 69 6e 67 2e 20 20  g and writing.  
2360: 49 66 20 74 68 61 74 0a 2a 2a 20 66 61 69 6c 73  If that.** fails
2370: 2c 20 74 72 79 20 6f 70 65 6e 69 6e 67 20 69 74  , try opening it
2380: 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 20 49 66 20   read-only.  If 
2390: 74 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f  the file does no
23a0: 74 20 65 78 69 73 74 2c 0a 2a 2a 20 74 72 79 20  t exist,.** try 
23b0: 74 6f 20 63 72 65 61 74 65 20 69 74 2e 0a 2a 2a  to create it..**
23c0: 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20  .** On success, 
23d0: 61 20 68 61 6e 64 6c 65 20 66 6f 72 20 74 68 65  a handle for the
23e0: 20 6f 70 65 6e 20 66 69 6c 65 20 69 73 20 77 72   open file is wr
23f0: 69 74 74 65 6e 20 74 6f 20 2a 69 64 0a 2a 2a 20  itten to *id.** 
2400: 61 6e 64 20 2a 70 52 65 61 64 6f 6e 6c 79 20 69  and *pReadonly i
2410: 73 20 73 65 74 20 74 6f 20 30 20 69 66 20 74 68  s set to 0 if th
2420: 65 20 66 69 6c 65 20 77 61 73 20 6f 70 65 6e 65  e file was opene
2430: 64 20 66 6f 72 20 72 65 61 64 69 6e 67 20 61 6e  d for reading an
2440: 64 0a 2a 2a 20 77 72 69 74 69 6e 67 20 6f 72 20  d.** writing or 
2450: 31 20 69 66 20 74 68 65 20 66 69 6c 65 20 77 61  1 if the file wa
2460: 73 20 6f 70 65 6e 65 64 20 72 65 61 64 2d 6f 6e  s opened read-on
2470: 6c 79 2e 20 20 54 68 65 20 66 75 6e 63 74 69 6f  ly.  The functio
2480: 6e 20 72 65 74 75 72 6e 73 0a 2a 2a 20 53 51 4c  n returns.** SQL
2490: 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  ITE_OK..**.** On
24a0: 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20 66 75   failure, the fu
24b0: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53  nction returns S
24c0: 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 61  QLITE_CANTOPEN a
24d0: 6e 64 20 6c 65 61 76 65 73 0a 2a 2a 20 2a 69 64  nd leaves.** *id
24e0: 20 61 6e 64 20 2a 70 52 65 61 64 6f 6e 6c 79 20   and *pReadonly 
24f0: 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e  unchanged..*/.in
2500: 74 20 73 71 6c 69 74 65 4f 73 4f 70 65 6e 52 65  t sqliteOsOpenRe
2510: 61 64 57 72 69 74 65 28 0a 20 20 63 6f 6e 73 74  adWrite(.  const
2520: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
2530: 2c 0a 20 20 4f 73 46 69 6c 65 20 2a 69 64 2c 0a  ,.  OsFile *id,.
2540: 20 20 69 6e 74 20 2a 70 52 65 61 64 6f 6e 6c 79    int *pReadonly
2550: 0a 29 7b 0a 23 69 66 20 4f 53 5f 55 4e 49 58 0a  .){.#if OS_UNIX.
2560: 20 20 69 64 2d 3e 66 64 20 3d 20 6f 70 65 6e 28    id->fd = open(
2570: 7a 46 69 6c 65 6e 61 6d 65 2c 20 4f 5f 52 44 57  zFilename, O_RDW
2580: 52 7c 4f 5f 43 52 45 41 54 7c 4f 5f 4c 41 52 47  R|O_CREAT|O_LARG
2590: 45 46 49 4c 45 7c 4f 5f 42 49 4e 41 52 59 2c 20  EFILE|O_BINARY, 
25a0: 30 36 34 34 29 3b 0a 20 20 69 66 28 20 69 64 2d  0644);.  if( id-
25b0: 3e 66 64 3c 30 20 29 7b 0a 20 20 20 20 69 64 2d  >fd<0 ){.    id-
25c0: 3e 66 64 20 3d 20 6f 70 65 6e 28 7a 46 69 6c 65  >fd = open(zFile
25d0: 6e 61 6d 65 2c 20 4f 5f 52 44 4f 4e 4c 59 7c 4f  name, O_RDONLY|O
25e0: 5f 4c 41 52 47 45 46 49 4c 45 7c 4f 5f 42 49 4e  _LARGEFILE|O_BIN
25f0: 41 52 59 29 3b 0a 20 20 20 20 69 66 28 20 69 64  ARY);.    if( id
2600: 2d 3e 66 64 3c 30 20 29 7b 0a 20 20 20 20 20 20  ->fd<0 ){.      
2610: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41  return SQLITE_CA
2620: 4e 54 4f 50 45 4e 3b 20 0a 20 20 20 20 7d 0a 20  NTOPEN; .    }. 
2630: 20 20 20 2a 70 52 65 61 64 6f 6e 6c 79 20 3d 20     *pReadonly = 
2640: 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
2650: 2a 70 52 65 61 64 6f 6e 6c 79 20 3d 20 30 3b 0a  *pReadonly = 0;.
2660: 20 20 7d 0a 20 20 73 71 6c 69 74 65 4f 73 45 6e    }.  sqliteOsEn
2670: 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 69 64  terMutex();.  id
2680: 2d 3e 70 4c 6f 63 6b 20 3d 20 66 69 6e 64 4c 6f  ->pLock = findLo
2690: 63 6b 49 6e 66 6f 28 69 64 2d 3e 66 64 29 3b 0a  ckInfo(id->fd);.
26a0: 20 20 73 71 6c 69 74 65 4f 73 4c 65 61 76 65 4d    sqliteOsLeaveM
26b0: 75 74 65 78 28 29 3b 0a 20 20 69 66 28 20 69 64  utex();.  if( id
26c0: 2d 3e 70 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20  ->pLock==0 ){.  
26d0: 20 20 63 6c 6f 73 65 28 69 64 2d 3e 66 64 29 3b    close(id->fd);
26e0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
26f0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
2700: 69 64 2d 3e 6c 6f 63 6b 65 64 20 3d 20 30 3b 0a  id->locked = 0;.
2710: 20 20 54 52 41 43 45 33 28 22 4f 50 45 4e 20 20    TRACE3("OPEN  
2720: 20 20 25 2d 33 64 20 25 73 5c 6e 22 2c 20 69 64    %-3d %s\n", id
2730: 2d 3e 66 64 2c 20 7a 46 69 6c 65 6e 61 6d 65 29  ->fd, zFilename)
2740: 3b 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28  ;.  OpenCounter(
2750: 2b 31 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  +1);.  return SQ
2760: 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a  LITE_OK;.#endif.
2770: 23 69 66 20 4f 53 5f 57 49 4e 0a 20 20 48 41 4e  #if OS_WIN.  HAN
2780: 44 4c 45 20 68 20 3d 20 43 72 65 61 74 65 46 69  DLE h = CreateFi
2790: 6c 65 28 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20  le(zFilename,.  
27a0: 20 20 20 47 45 4e 45 52 49 43 5f 52 45 41 44 20     GENERIC_READ 
27b0: 7c 20 47 45 4e 45 52 49 43 5f 57 52 49 54 45 2c  | GENERIC_WRITE,
27c0: 0a 20 20 20 20 20 46 49 4c 45 5f 53 48 41 52 45  .     FILE_SHARE
27d0: 5f 52 45 41 44 20 7c 20 46 49 4c 45 5f 53 48 41  _READ | FILE_SHA
27e0: 52 45 5f 57 52 49 54 45 2c 0a 20 20 20 20 20 4e  RE_WRITE,.     N
27f0: 55 4c 4c 2c 0a 20 20 20 20 20 4f 50 45 4e 5f 41  ULL,.     OPEN_A
2800: 4c 57 41 59 53 2c 0a 20 20 20 20 20 46 49 4c 45  LWAYS,.     FILE
2810: 5f 41 54 54 52 49 42 55 54 45 5f 4e 4f 52 4d 41  _ATTRIBUTE_NORMA
2820: 4c 20 7c 20 46 49 4c 45 5f 46 4c 41 47 5f 52 41  L | FILE_FLAG_RA
2830: 4e 44 4f 4d 5f 41 43 43 45 53 53 2c 0a 20 20 20  NDOM_ACCESS,.   
2840: 20 20 4e 55 4c 4c 0a 20 20 29 3b 0a 20 20 69 66    NULL.  );.  if
2850: 28 20 68 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e  ( h==INVALID_HAN
2860: 44 4c 45 5f 56 41 4c 55 45 20 29 7b 0a 20 20 20  DLE_VALUE ){.   
2870: 20 68 20 3d 20 43 72 65 61 74 65 46 69 6c 65 28   h = CreateFile(
2880: 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20  zFilename,.     
2890: 20 20 47 45 4e 45 52 49 43 5f 52 45 41 44 2c 0a    GENERIC_READ,.
28a0: 20 20 20 20 20 20 20 46 49 4c 45 5f 53 48 41 52         FILE_SHAR
28b0: 45 5f 52 45 41 44 2c 0a 20 20 20 20 20 20 20 4e  E_READ,.       N
28c0: 55 4c 4c 2c 0a 20 20 20 20 20 20 20 4f 50 45 4e  ULL,.       OPEN
28d0: 5f 41 4c 57 41 59 53 2c 0a 20 20 20 20 20 20 20  _ALWAYS,.       
28e0: 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 4e  FILE_ATTRIBUTE_N
28f0: 4f 52 4d 41 4c 20 7c 20 46 49 4c 45 5f 46 4c 41  ORMAL | FILE_FLA
2900: 47 5f 52 41 4e 44 4f 4d 5f 41 43 43 45 53 53 2c  G_RANDOM_ACCESS,
2910: 0a 20 20 20 20 20 20 20 4e 55 4c 4c 0a 20 20 20  .       NULL.   
2920: 20 29 3b 0a 20 20 20 20 69 66 28 20 68 3d 3d 49   );.    if( h==I
2930: 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41  NVALID_HANDLE_VA
2940: 4c 55 45 20 29 7b 0a 20 20 20 20 20 20 72 65 74  LUE ){.      ret
2950: 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  urn SQLITE_CANTO
2960: 50 45 4e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a  PEN;.    }.    *
2970: 70 52 65 61 64 6f 6e 6c 79 20 3d 20 31 3b 0a 20  pReadonly = 1;. 
2980: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 52 65   }else{.    *pRe
2990: 61 64 6f 6e 6c 79 20 3d 20 30 3b 0a 20 20 7d 0a  adonly = 0;.  }.
29a0: 20 20 69 64 2d 3e 68 20 3d 20 68 3b 0a 20 20 69    id->h = h;.  i
29b0: 64 2d 3e 6c 6f 63 6b 65 64 20 3d 20 30 3b 0a 20  d->locked = 0;. 
29c0: 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2b 31 29   OpenCounter(+1)
29d0: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
29e0: 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 23 69 66  E_OK;.#endif.#if
29f0: 20 4f 53 5f 4d 41 43 0a 20 20 46 53 53 70 65 63   OS_MAC.  FSSpec
2a00: 20 66 73 53 70 65 63 3b 0a 23 20 69 66 64 65 66   fsSpec;.# ifdef
2a10: 20 5f 4c 41 52 47 45 5f 46 49 4c 45 0a 20 20 48   _LARGE_FILE.  H
2a20: 46 53 55 6e 69 53 74 72 32 35 35 20 64 66 4e 61  FSUniStr255 dfNa
2a30: 6d 65 3b 0a 20 20 46 53 52 65 66 20 66 73 52 65  me;.  FSRef fsRe
2a40: 66 3b 0a 20 20 69 66 28 20 5f 5f 70 61 74 68 32  f;.  if( __path2
2a50: 66 73 73 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 26  fss(zFilename, &
2a60: 66 73 53 70 65 63 29 20 21 3d 20 6e 6f 45 72 72  fsSpec) != noErr
2a70: 20 29 7b 0a 20 20 20 20 69 66 28 20 48 43 72 65   ){.    if( HCre
2a80: 61 74 65 28 66 73 53 70 65 63 2e 76 52 65 66 4e  ate(fsSpec.vRefN
2a90: 75 6d 2c 20 66 73 53 70 65 63 2e 70 61 72 49 44  um, fsSpec.parID
2aa0: 2c 20 66 73 53 70 65 63 2e 6e 61 6d 65 2c 20 27  , fsSpec.name, '
2ab0: 53 51 4c 49 27 2c 20 63 44 6f 63 75 6d 65 6e 74  SQLI', cDocument
2ac0: 46 69 6c 65 29 20 21 3d 20 6e 6f 45 72 72 20 29  File) != noErr )
2ad0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
2ae0: 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20  LITE_CANTOPEN;. 
2af0: 20 7d 0a 20 20 69 66 28 20 46 53 70 4d 61 6b 65   }.  if( FSpMake
2b00: 46 53 52 65 66 28 26 66 73 53 70 65 63 2c 20 26  FSRef(&fsSpec, &
2b10: 66 73 52 65 66 29 20 21 3d 20 6e 6f 45 72 72 20  fsRef) != noErr 
2b20: 29 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ).    return SQL
2b30: 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20  ITE_CANTOPEN;.  
2b40: 46 53 47 65 74 44 61 74 61 46 6f 72 6b 4e 61 6d  FSGetDataForkNam
2b50: 65 28 26 64 66 4e 61 6d 65 29 3b 0a 20 20 69 66  e(&dfName);.  if
2b60: 28 20 46 53 4f 70 65 6e 46 6f 72 6b 28 26 66 73  ( FSOpenFork(&fs
2b70: 52 65 66 2c 20 64 66 4e 61 6d 65 2e 6c 65 6e 67  Ref, dfName.leng
2b80: 74 68 2c 20 64 66 4e 61 6d 65 2e 75 6e 69 63 6f  th, dfName.unico
2b90: 64 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  de,.            
2ba0: 20 20 20 20 20 66 73 52 64 57 72 53 68 50 65 72       fsRdWrShPer
2bb0: 6d 2c 20 26 28 69 64 2d 3e 72 65 66 4e 75 6d 29  m, &(id->refNum)
2bc0: 29 20 21 3d 20 6e 6f 45 72 72 20 29 7b 0a 20 20  ) != noErr ){.  
2bd0: 20 20 69 66 28 20 46 53 4f 70 65 6e 46 6f 72 6b    if( FSOpenFork
2be0: 28 26 66 73 52 65 66 2c 20 64 66 4e 61 6d 65 2e  (&fsRef, dfName.
2bf0: 6c 65 6e 67 74 68 2c 20 64 66 4e 61 6d 65 2e 75  length, dfName.u
2c00: 6e 69 63 6f 64 65 2c 0a 20 20 20 20 20 20 20 20  nicode,.        
2c10: 20 20 20 20 20 20 20 20 20 20 20 66 73 52 64 57             fsRdW
2c20: 72 50 65 72 6d 2c 20 26 28 69 64 2d 3e 72 65 66  rPerm, &(id->ref
2c30: 4e 75 6d 29 29 20 21 3d 20 6e 6f 45 72 72 20 29  Num)) != noErr )
2c40: 7b 0a 20 20 20 20 20 20 69 66 20 28 46 53 4f 70  {.      if (FSOp
2c50: 65 6e 46 6f 72 6b 28 26 66 73 52 65 66 2c 20 64  enFork(&fsRef, d
2c60: 66 4e 61 6d 65 2e 6c 65 6e 67 74 68 2c 20 64 66  fName.length, df
2c70: 4e 61 6d 65 2e 75 6e 69 63 6f 64 65 2c 0a 20 20  Name.unicode,.  
2c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c90: 20 66 73 52 64 50 65 72 6d 2c 20 26 28 69 64 2d   fsRdPerm, &(id-
2ca0: 3e 72 65 66 4e 75 6d 29 29 20 21 3d 20 6e 6f 45  >refNum)) != noE
2cb0: 72 72 20 29 0a 20 20 20 20 20 20 20 20 72 65 74  rr ).        ret
2cc0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  urn SQLITE_CANTO
2cd0: 50 45 4e 3b 0a 20 20 20 20 20 20 65 6c 73 65 0a  PEN;.      else.
2ce0: 20 20 20 20 20 20 20 20 2a 70 52 65 61 64 6f 6e          *pReadon
2cf0: 6c 79 20 3d 20 31 3b 0a 20 20 20 20 7d 20 65 6c  ly = 1;.    } el
2d00: 73 65 0a 20 20 20 20 20 20 2a 70 52 65 61 64 6f  se.      *pReado
2d10: 6e 6c 79 20 3d 20 30 3b 0a 20 20 7d 20 65 6c 73  nly = 0;.  } els
2d20: 65 0a 20 20 20 20 2a 70 52 65 61 64 6f 6e 6c 79  e.    *pReadonly
2d30: 20 3d 20 30 3b 0a 23 20 65 6c 73 65 0a 20 20 5f   = 0;.# else.  _
2d40: 5f 70 61 74 68 32 66 73 73 28 7a 46 69 6c 65 6e  _path2fss(zFilen
2d50: 61 6d 65 2c 20 26 66 73 53 70 65 63 29 3b 0a 20  ame, &fsSpec);. 
2d60: 20 69 66 28 20 21 73 71 6c 69 74 65 4f 73 46 69   if( !sqliteOsFi
2d70: 6c 65 45 78 69 73 74 73 28 7a 46 69 6c 65 6e 61  leExists(zFilena
2d80: 6d 65 29 20 29 7b 0a 20 20 20 20 69 66 28 20 48  me) ){.    if( H
2d90: 43 72 65 61 74 65 28 66 73 53 70 65 63 2e 76 52  Create(fsSpec.vR
2da0: 65 66 4e 75 6d 2c 20 66 73 53 70 65 63 2e 70 61  efNum, fsSpec.pa
2db0: 72 49 44 2c 20 66 73 53 70 65 63 2e 6e 61 6d 65  rID, fsSpec.name
2dc0: 2c 20 27 53 51 4c 49 27 2c 20 63 44 6f 63 75 6d  , 'SQLI', cDocum
2dd0: 65 6e 74 46 69 6c 65 29 20 21 3d 20 6e 6f 45 72  entFile) != noEr
2de0: 72 20 29 0a 20 20 20 20 20 20 72 65 74 75 72 6e  r ).      return
2df0: 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
2e00: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 48 4f 70 65  ;.  }.  if( HOpe
2e10: 6e 44 46 28 66 73 53 70 65 63 2e 76 52 65 66 4e  nDF(fsSpec.vRefN
2e20: 75 6d 2c 20 66 73 53 70 65 63 2e 70 61 72 49 44  um, fsSpec.parID
2e30: 2c 20 66 73 53 70 65 63 2e 6e 61 6d 65 2c 20 66  , fsSpec.name, f
2e40: 73 52 64 57 72 53 68 50 65 72 6d 2c 20 26 28 69  sRdWrShPerm, &(i
2e50: 64 2d 3e 72 65 66 4e 75 6d 29 29 20 21 3d 20 6e  d->refNum)) != n
2e60: 6f 45 72 72 20 29 7b 0a 20 20 20 20 69 66 28 20  oErr ){.    if( 
2e70: 48 4f 70 65 6e 44 46 28 66 73 53 70 65 63 2e 76  HOpenDF(fsSpec.v
2e80: 52 65 66 4e 75 6d 2c 20 66 73 53 70 65 63 2e 70  RefNum, fsSpec.p
2e90: 61 72 49 44 2c 20 66 73 53 70 65 63 2e 6e 61 6d  arID, fsSpec.nam
2ea0: 65 2c 20 66 73 52 64 57 72 50 65 72 6d 2c 20 26  e, fsRdWrPerm, &
2eb0: 28 69 64 2d 3e 72 65 66 4e 75 6d 29 29 20 21 3d  (id->refNum)) !=
2ec0: 20 6e 6f 45 72 72 20 29 7b 0a 20 20 20 20 20 20   noErr ){.      
2ed0: 69 66 28 20 48 4f 70 65 6e 44 46 28 66 73 53 70  if( HOpenDF(fsSp
2ee0: 65 63 2e 76 52 65 66 4e 75 6d 2c 20 66 73 53 70  ec.vRefNum, fsSp
2ef0: 65 63 2e 70 61 72 49 44 2c 20 66 73 53 70 65 63  ec.parID, fsSpec
2f00: 2e 6e 61 6d 65 2c 20 66 73 52 64 50 65 72 6d 2c  .name, fsRdPerm,
2f10: 20 26 28 69 64 2d 3e 72 65 66 4e 75 6d 29 29 20   &(id->refNum)) 
2f20: 21 3d 20 6e 6f 45 72 72 20 29 0a 20 20 20 20 20  != noErr ).     
2f30: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2f40: 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 20 20 20  _CANTOPEN;.     
2f50: 20 65 6c 73 65 0a 20 20 20 20 20 20 20 20 2a 70   else.        *p
2f60: 52 65 61 64 6f 6e 6c 79 20 3d 20 31 3b 0a 20 20  Readonly = 1;.  
2f70: 20 20 7d 20 65 6c 73 65 0a 20 20 20 20 20 20 2a    } else.      *
2f80: 70 52 65 61 64 6f 6e 6c 79 20 3d 20 30 3b 0a 20  pReadonly = 0;. 
2f90: 20 7d 20 65 6c 73 65 0a 20 20 20 20 2a 70 52 65   } else.    *pRe
2fa0: 61 64 6f 6e 6c 79 20 3d 20 30 3b 0a 23 20 65 6e  adonly = 0;.# en
2fb0: 64 69 66 0a 20 20 69 66 28 20 48 4f 70 65 6e 52  dif.  if( HOpenR
2fc0: 46 28 66 73 53 70 65 63 2e 76 52 65 66 4e 75 6d  F(fsSpec.vRefNum
2fd0: 2c 20 66 73 53 70 65 63 2e 70 61 72 49 44 2c 20  , fsSpec.parID, 
2fe0: 66 73 53 70 65 63 2e 6e 61 6d 65 2c 20 66 73 52  fsSpec.name, fsR
2ff0: 64 57 72 53 68 50 65 72 6d 2c 20 26 28 69 64 2d  dWrShPerm, &(id-
3000: 3e 72 65 66 4e 75 6d 52 46 29 29 20 21 3d 20 6e  >refNumRF)) != n
3010: 6f 45 72 72 29 7b 0a 20 20 20 20 69 64 2d 3e 72  oErr){.    id->r
3020: 65 66 4e 75 6d 52 46 20 3d 20 2d 31 3b 0a 20 20  efNumRF = -1;.  
3030: 7d 0a 20 20 69 64 2d 3e 6c 6f 63 6b 65 64 20 3d  }.  id->locked =
3040: 20 30 3b 0a 20 20 69 64 2d 3e 64 65 6c 4f 6e 43   0;.  id->delOnC
3050: 6c 6f 73 65 20 3d 20 30 3b 0a 20 20 4f 70 65 6e  lose = 0;.  Open
3060: 43 6f 75 6e 74 65 72 28 2b 31 29 3b 0a 20 20 72  Counter(+1);.  r
3070: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
3080: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a  .#endif.}.../*.*
3090: 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 6f 70 65  * Attempt to ope
30a0: 6e 20 61 20 6e 65 77 20 66 69 6c 65 20 66 6f 72  n a new file for
30b0: 20 65 78 63 6c 75 73 69 76 65 20 61 63 63 65 73   exclusive acces
30c0: 73 20 62 79 20 74 68 69 73 20 70 72 6f 63 65 73  s by this proces
30d0: 73 2e 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20 77  s..** The file w
30e0: 69 6c 6c 20 62 65 20 6f 70 65 6e 65 64 20 66 6f  ill be opened fo
30f0: 72 20 62 6f 74 68 20 72 65 61 64 69 6e 67 20 61  r both reading a
3100: 6e 64 20 77 72 69 74 69 6e 67 2e 20 20 54 6f 20  nd writing.  To 
3110: 61 76 6f 69 64 0a 2a 2a 20 61 20 70 6f 74 65 6e  avoid.** a poten
3120: 74 69 61 6c 20 73 65 63 75 72 69 74 79 20 70 72  tial security pr
3130: 6f 62 6c 65 6d 2c 20 77 65 20 64 6f 20 6e 6f 74  oblem, we do not
3140: 20 61 6c 6c 6f 77 20 74 68 65 20 66 69 6c 65 20   allow the file 
3150: 74 6f 20 68 61 76 65 0a 2a 2a 20 70 72 65 76 69  to have.** previ
3160: 6f 75 73 6c 79 20 65 78 69 73 74 65 64 2e 20 20  ously existed.  
3170: 4e 6f 72 20 64 6f 20 77 65 20 61 6c 6c 6f 77 20  Nor do we allow 
3180: 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 61  the file to be a
3190: 20 73 79 6d 62 6f 6c 69 63 0a 2a 2a 20 6c 69 6e   symbolic.** lin
31a0: 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 65 6c 46  k..**.** If delF
31b0: 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74 68 65  lag is true, the
31c0: 6e 20 6d 61 6b 65 20 61 72 72 61 6e 67 65 6d 65  n make arrangeme
31d0: 6e 74 73 20 74 6f 20 61 75 74 6f 6d 61 74 69 63  nts to automatic
31e0: 61 6c 6c 79 20 64 65 6c 65 74 65 0a 2a 2a 20 74  ally delete.** t
31f0: 68 65 20 66 69 6c 65 20 77 68 65 6e 20 69 74 20  he file when it 
3200: 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a  is closed..**.**
3210: 20 4f 6e 20 73 75 63 63 65 73 73 2c 20 77 72 69   On success, wri
3220: 74 65 20 74 68 65 20 66 69 6c 65 20 68 61 6e 64  te the file hand
3230: 6c 65 20 69 6e 74 6f 20 2a 69 64 20 61 6e 64 20  le into *id and 
3240: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
3250: 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 66 61 69 6c 75  ..**.** On failu
3260: 72 65 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  re, return SQLIT
3270: 45 5f 43 41 4e 54 4f 50 45 4e 2e 0a 2a 2f 0a 69  E_CANTOPEN..*/.i
3280: 6e 74 20 73 71 6c 69 74 65 4f 73 4f 70 65 6e 45  nt sqliteOsOpenE
3290: 78 63 6c 75 73 69 76 65 28 63 6f 6e 73 74 20 63  xclusive(const c
32a0: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
32b0: 4f 73 46 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  OsFile *id, int 
32c0: 64 65 6c 46 6c 61 67 29 7b 0a 23 69 66 20 4f 53  delFlag){.#if OS
32d0: 5f 55 4e 49 58 0a 20 20 69 66 28 20 61 63 63 65  _UNIX.  if( acce
32e0: 73 73 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 30 29  ss(zFilename, 0)
32f0: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
3300: 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  n SQLITE_CANTOPE
3310: 4e 3b 0a 20 20 7d 0a 20 20 69 64 2d 3e 66 64 20  N;.  }.  id->fd 
3320: 3d 20 6f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d 65  = open(zFilename
3330: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
3340: 20 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54    O_RDWR|O_CREAT
3350: 7c 4f 5f 45 58 43 4c 7c 4f 5f 4e 4f 46 4f 4c 4c  |O_EXCL|O_NOFOLL
3360: 4f 57 7c 4f 5f 4c 41 52 47 45 46 49 4c 45 7c 4f  OW|O_LARGEFILE|O
3370: 5f 42 49 4e 41 52 59 2c 20 30 36 30 30 29 3b 0a  _BINARY, 0600);.
3380: 20 20 69 66 28 20 69 64 2d 3e 66 64 3c 30 20 29    if( id->fd<0 )
3390: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
33a0: 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20  ITE_CANTOPEN;.  
33b0: 7d 0a 20 20 73 71 6c 69 74 65 4f 73 45 6e 74 65  }.  sqliteOsEnte
33c0: 72 4d 75 74 65 78 28 29 3b 0a 20 20 69 64 2d 3e  rMutex();.  id->
33d0: 70 4c 6f 63 6b 20 3d 20 66 69 6e 64 4c 6f 63 6b  pLock = findLock
33e0: 49 6e 66 6f 28 69 64 2d 3e 66 64 29 3b 0a 20 20  Info(id->fd);.  
33f0: 73 71 6c 69 74 65 4f 73 4c 65 61 76 65 4d 75 74  sqliteOsLeaveMut
3400: 65 78 28 29 3b 0a 20 20 69 66 28 20 69 64 2d 3e  ex();.  if( id->
3410: 70 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20  pLock==0 ){.    
3420: 63 6c 6f 73 65 28 69 64 2d 3e 66 64 29 3b 0a 20  close(id->fd);. 
3430: 20 20 20 75 6e 6c 69 6e 6b 28 7a 46 69 6c 65 6e     unlink(zFilen
3440: 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ame);.    return
3450: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
3460: 20 7d 0a 20 20 69 64 2d 3e 6c 6f 63 6b 65 64 20   }.  id->locked 
3470: 3d 20 30 3b 0a 20 20 69 66 28 20 64 65 6c 46 6c  = 0;.  if( delFl
3480: 61 67 20 29 7b 0a 20 20 20 20 75 6e 6c 69 6e 6b  ag ){.    unlink
3490: 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d  (zFilename);.  }
34a0: 0a 20 20 54 52 41 43 45 33 28 22 4f 50 45 4e 2d  .  TRACE3("OPEN-
34b0: 45 58 20 25 2d 33 64 20 25 73 5c 6e 22 2c 20 69  EX %-3d %s\n", i
34c0: 64 2d 3e 66 64 2c 20 7a 46 69 6c 65 6e 61 6d 65  d->fd, zFilename
34d0: 29 3b 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72  );.  OpenCounter
34e0: 28 2b 31 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  (+1);.  return S
34f0: 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66  QLITE_OK;.#endif
3500: 0a 23 69 66 20 4f 53 5f 57 49 4e 0a 20 20 48 41  .#if OS_WIN.  HA
3510: 4e 44 4c 45 20 68 3b 0a 20 20 69 6e 74 20 66 69  NDLE h;.  int fi
3520: 6c 65 66 6c 61 67 73 3b 0a 20 20 69 66 28 20 64  leflags;.  if( d
3530: 65 6c 46 6c 61 67 20 29 7b 0a 20 20 20 20 66 69  elFlag ){.    fi
3540: 6c 65 66 6c 61 67 73 20 3d 20 46 49 4c 45 5f 41  leflags = FILE_A
3550: 54 54 52 49 42 55 54 45 5f 54 45 4d 50 4f 52 41  TTRIBUTE_TEMPORA
3560: 52 59 20 7c 20 46 49 4c 45 5f 46 4c 41 47 5f 52  RY | FILE_FLAG_R
3570: 41 4e 44 4f 4d 5f 41 43 43 45 53 53 20 0a 20 20  ANDOM_ACCESS .  
3580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3590: 20 20 20 7c 20 46 49 4c 45 5f 46 4c 41 47 5f 44     | FILE_FLAG_D
35a0: 45 4c 45 54 45 5f 4f 4e 5f 43 4c 4f 53 45 3b 0a  ELETE_ON_CLOSE;.
35b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 69 6c    }else{.    fil
35c0: 65 66 6c 61 67 73 20 3d 20 46 49 4c 45 5f 46 4c  eflags = FILE_FL
35d0: 41 47 5f 52 41 4e 44 4f 4d 5f 41 43 43 45 53 53  AG_RANDOM_ACCESS
35e0: 3b 0a 20 20 7d 0a 20 20 68 20 3d 20 43 72 65 61  ;.  }.  h = Crea
35f0: 74 65 46 69 6c 65 28 7a 46 69 6c 65 6e 61 6d 65  teFile(zFilename
3600: 2c 0a 20 20 20 20 20 47 45 4e 45 52 49 43 5f 52  ,.     GENERIC_R
3610: 45 41 44 20 7c 20 47 45 4e 45 52 49 43 5f 57 52  EAD | GENERIC_WR
3620: 49 54 45 2c 0a 20 20 20 20 20 30 2c 0a 20 20 20  ITE,.     0,.   
3630: 20 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 43 52 45    NULL,.     CRE
3640: 41 54 45 5f 41 4c 57 41 59 53 2c 0a 20 20 20 20  ATE_ALWAYS,.    
3650: 20 66 69 6c 65 66 6c 61 67 73 2c 0a 20 20 20 20   fileflags,.    
3660: 20 4e 55 4c 4c 0a 20 20 29 3b 0a 20 20 69 66 28   NULL.  );.  if(
3670: 20 68 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44   h==INVALID_HAND
3680: 4c 45 5f 56 41 4c 55 45 20 29 7b 0a 20 20 20 20  LE_VALUE ){.    
3690: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41  return SQLITE_CA
36a0: 4e 54 4f 50 45 4e 3b 0a 20 20 7d 0a 20 20 69 64  NTOPEN;.  }.  id
36b0: 2d 3e 68 20 3d 20 68 3b 0a 20 20 69 64 2d 3e 6c  ->h = h;.  id->l
36c0: 6f 63 6b 65 64 20 3d 20 30 3b 0a 20 20 4f 70 65  ocked = 0;.  Ope
36d0: 6e 43 6f 75 6e 74 65 72 28 2b 31 29 3b 0a 20 20  nCounter(+1);.  
36e0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
36f0: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f 53 5f  ;.#endif.#if OS_
3700: 4d 41 43 0a 20 20 46 53 53 70 65 63 20 66 73 53  MAC.  FSSpec fsS
3710: 70 65 63 3b 0a 23 20 69 66 64 65 66 20 5f 4c 41  pec;.# ifdef _LA
3720: 52 47 45 5f 46 49 4c 45 0a 20 20 48 46 53 55 6e  RGE_FILE.  HFSUn
3730: 69 53 74 72 32 35 35 20 64 66 4e 61 6d 65 3b 0a  iStr255 dfName;.
3740: 20 20 46 53 52 65 66 20 66 73 52 65 66 3b 0a 20    FSRef fsRef;. 
3750: 20 5f 5f 70 61 74 68 32 66 73 73 28 7a 46 69 6c   __path2fss(zFil
3760: 65 6e 61 6d 65 2c 20 26 66 73 53 70 65 63 29 3b  ename, &fsSpec);
3770: 0a 20 20 69 66 28 20 48 43 72 65 61 74 65 28 66  .  if( HCreate(f
3780: 73 53 70 65 63 2e 76 52 65 66 4e 75 6d 2c 20 66  sSpec.vRefNum, f
3790: 73 53 70 65 63 2e 70 61 72 49 44 2c 20 66 73 53  sSpec.parID, fsS
37a0: 70 65 63 2e 6e 61 6d 65 2c 20 27 53 51 4c 49 27  pec.name, 'SQLI'
37b0: 2c 20 63 44 6f 63 75 6d 65 6e 74 46 69 6c 65 29  , cDocumentFile)
37c0: 20 21 3d 20 6e 6f 45 72 72 20 29 0a 20 20 20 20   != noErr ).    
37d0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41  return SQLITE_CA
37e0: 4e 54 4f 50 45 4e 3b 0a 20 20 69 66 28 20 46 53  NTOPEN;.  if( FS
37f0: 70 4d 61 6b 65 46 53 52 65 66 28 26 66 73 53 70  pMakeFSRef(&fsSp
3800: 65 63 2c 20 26 66 73 52 65 66 29 20 21 3d 20 6e  ec, &fsRef) != n
3810: 6f 45 72 72 20 29 0a 20 20 20 20 72 65 74 75 72  oErr ).    retur
3820: 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  n SQLITE_CANTOPE
3830: 4e 3b 0a 20 20 46 53 47 65 74 44 61 74 61 46 6f  N;.  FSGetDataFo
3840: 72 6b 4e 61 6d 65 28 26 64 66 4e 61 6d 65 29 3b  rkName(&dfName);
3850: 0a 20 20 69 66 28 20 46 53 4f 70 65 6e 46 6f 72  .  if( FSOpenFor
3860: 6b 28 26 66 73 52 65 66 2c 20 64 66 4e 61 6d 65  k(&fsRef, dfName
3870: 2e 6c 65 6e 67 74 68 2c 20 64 66 4e 61 6d 65 2e  .length, dfName.
3880: 75 6e 69 63 6f 64 65 2c 0a 20 20 20 20 20 20 20  unicode,.       
3890: 20 20 20 20 20 20 20 20 20 20 66 73 52 64 57 72            fsRdWr
38a0: 50 65 72 6d 2c 20 26 28 69 64 2d 3e 72 65 66 4e  Perm, &(id->refN
38b0: 75 6d 29 29 20 21 3d 20 6e 6f 45 72 72 20 29 0a  um)) != noErr ).
38c0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
38d0: 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 23 20 65 6c  E_CANTOPEN;.# el
38e0: 73 65 0a 20 20 5f 5f 70 61 74 68 32 66 73 73 28  se.  __path2fss(
38f0: 7a 46 69 6c 65 6e 61 6d 65 2c 20 26 66 73 53 70  zFilename, &fsSp
3900: 65 63 29 3b 0a 20 20 69 66 28 20 48 43 72 65 61  ec);.  if( HCrea
3910: 74 65 28 66 73 53 70 65 63 2e 76 52 65 66 4e 75  te(fsSpec.vRefNu
3920: 6d 2c 20 66 73 53 70 65 63 2e 70 61 72 49 44 2c  m, fsSpec.parID,
3930: 20 66 73 53 70 65 63 2e 6e 61 6d 65 2c 20 27 53   fsSpec.name, 'S
3940: 51 4c 49 27 2c 20 63 44 6f 63 75 6d 65 6e 74 46  QLI', cDocumentF
3950: 69 6c 65 29 20 21 3d 20 6e 6f 45 72 72 20 29 0a  ile) != noErr ).
3960: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
3970: 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 69 66  E_CANTOPEN;.  if
3980: 28 20 48 4f 70 65 6e 44 46 28 66 73 53 70 65 63  ( HOpenDF(fsSpec
3990: 2e 76 52 65 66 4e 75 6d 2c 20 66 73 53 70 65 63  .vRefNum, fsSpec
39a0: 2e 70 61 72 49 44 2c 20 66 73 53 70 65 63 2e 6e  .parID, fsSpec.n
39b0: 61 6d 65 2c 20 66 73 52 64 57 72 50 65 72 6d 2c  ame, fsRdWrPerm,
39c0: 20 26 28 69 64 2d 3e 72 65 66 4e 75 6d 29 29 20   &(id->refNum)) 
39d0: 21 3d 20 6e 6f 45 72 72 20 29 0a 20 20 20 20 72  != noErr ).    r
39e0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e  eturn SQLITE_CAN
39f0: 54 4f 50 45 4e 3b 0a 23 20 65 6e 64 69 66 0a 20  TOPEN;.# endif. 
3a00: 20 69 64 2d 3e 72 65 66 4e 75 6d 52 46 20 3d 20   id->refNumRF = 
3a10: 2d 31 3b 0a 20 20 69 64 2d 3e 6c 6f 63 6b 65 64  -1;.  id->locked
3a20: 20 3d 20 30 3b 0a 20 20 69 64 2d 3e 64 65 6c 4f   = 0;.  id->delO
3a30: 6e 43 6c 6f 73 65 20 3d 20 64 65 6c 46 6c 61 67  nClose = delFlag
3a40: 3b 0a 20 20 69 66 20 28 64 65 6c 46 6c 61 67 29  ;.  if (delFlag)
3a50: 0a 20 20 20 20 69 64 2d 3e 70 61 74 68 54 6f 44  .    id->pathToD
3a60: 65 6c 20 3d 20 73 71 6c 69 74 65 4f 73 46 75 6c  el = sqliteOsFul
3a70: 6c 50 61 74 68 6e 61 6d 65 28 7a 46 69 6c 65 6e  lPathname(zFilen
3a80: 61 6d 65 29 3b 0a 20 20 4f 70 65 6e 43 6f 75 6e  ame);.  OpenCoun
3a90: 74 65 72 28 2b 31 29 3b 0a 20 20 72 65 74 75 72  ter(+1);.  retur
3aa0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e  n SQLITE_OK;.#en
3ab0: 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74  dif.}../*.** Att
3ac0: 65 6d 70 74 20 74 6f 20 6f 70 65 6e 20 61 20 6e  empt to open a n
3ad0: 65 77 20 66 69 6c 65 20 66 6f 72 20 72 65 61 64  ew file for read
3ae0: 2d 6f 6e 6c 79 20 61 63 63 65 73 73 2e 0a 2a 2a  -only access..**
3af0: 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20  .** On success, 
3b00: 77 72 69 74 65 20 74 68 65 20 66 69 6c 65 20 68  write the file h
3b10: 61 6e 64 6c 65 20 69 6e 74 6f 20 2a 69 64 20 61  andle into *id a
3b20: 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
3b30: 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 66 61  _OK..**.** On fa
3b40: 69 6c 75 72 65 2c 20 72 65 74 75 72 6e 20 53 51  ilure, return SQ
3b50: 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 2e 0a 2a  LITE_CANTOPEN..*
3b60: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 4f 73 4f 70  /.int sqliteOsOp
3b70: 65 6e 52 65 61 64 4f 6e 6c 79 28 63 6f 6e 73 74  enReadOnly(const
3b80: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
3b90: 2c 20 4f 73 46 69 6c 65 20 2a 69 64 29 7b 0a 23  , OsFile *id){.#
3ba0: 69 66 20 4f 53 5f 55 4e 49 58 0a 20 20 69 64 2d  if OS_UNIX.  id-
3bb0: 3e 66 64 20 3d 20 6f 70 65 6e 28 7a 46 69 6c 65  >fd = open(zFile
3bc0: 6e 61 6d 65 2c 20 4f 5f 52 44 4f 4e 4c 59 7c 4f  name, O_RDONLY|O
3bd0: 5f 4c 41 52 47 45 46 49 4c 45 7c 4f 5f 42 49 4e  _LARGEFILE|O_BIN
3be0: 41 52 59 29 3b 0a 20 20 69 66 28 20 69 64 2d 3e  ARY);.  if( id->
3bf0: 66 64 3c 30 20 29 7b 0a 20 20 20 20 72 65 74 75  fd<0 ){.    retu
3c00: 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  rn SQLITE_CANTOP
3c10: 45 4e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  EN;.  }.  sqlite
3c20: 4f 73 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  OsEnterMutex();.
3c30: 20 20 69 64 2d 3e 70 4c 6f 63 6b 20 3d 20 66 69    id->pLock = fi
3c40: 6e 64 4c 6f 63 6b 49 6e 66 6f 28 69 64 2d 3e 66  ndLockInfo(id->f
3c50: 64 29 3b 0a 20 20 73 71 6c 69 74 65 4f 73 4c 65  d);.  sqliteOsLe
3c60: 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 69 66  aveMutex();.  if
3c70: 28 20 69 64 2d 3e 70 4c 6f 63 6b 3d 3d 30 20 29  ( id->pLock==0 )
3c80: 7b 0a 20 20 20 20 63 6c 6f 73 65 28 69 64 2d 3e  {.    close(id->
3c90: 66 64 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  fd);.    return 
3ca0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
3cb0: 7d 0a 20 20 69 64 2d 3e 6c 6f 63 6b 65 64 20 3d  }.  id->locked =
3cc0: 20 30 3b 0a 20 20 54 52 41 43 45 33 28 22 4f 50   0;.  TRACE3("OP
3cd0: 45 4e 2d 52 4f 20 25 2d 33 64 20 25 73 5c 6e 22  EN-RO %-3d %s\n"
3ce0: 2c 20 69 64 2d 3e 66 64 2c 20 7a 46 69 6c 65 6e  , id->fd, zFilen
3cf0: 61 6d 65 29 3b 0a 20 20 4f 70 65 6e 43 6f 75 6e  ame);.  OpenCoun
3d00: 74 65 72 28 2b 31 29 3b 0a 20 20 72 65 74 75 72  ter(+1);.  retur
3d10: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e  n SQLITE_OK;.#en
3d20: 64 69 66 0a 23 69 66 20 4f 53 5f 57 49 4e 0a 20  dif.#if OS_WIN. 
3d30: 20 48 41 4e 44 4c 45 20 68 20 3d 20 43 72 65 61   HANDLE h = Crea
3d40: 74 65 46 69 6c 65 28 7a 46 69 6c 65 6e 61 6d 65  teFile(zFilename
3d50: 2c 0a 20 20 20 20 20 47 45 4e 45 52 49 43 5f 52  ,.     GENERIC_R
3d60: 45 41 44 2c 0a 20 20 20 20 20 30 2c 0a 20 20 20  EAD,.     0,.   
3d70: 20 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 4f 50 45    NULL,.     OPE
3d80: 4e 5f 45 58 49 53 54 49 4e 47 2c 0a 20 20 20 20  N_EXISTING,.    
3d90: 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f   FILE_ATTRIBUTE_
3da0: 4e 4f 52 4d 41 4c 20 7c 20 46 49 4c 45 5f 46 4c  NORMAL | FILE_FL
3db0: 41 47 5f 52 41 4e 44 4f 4d 5f 41 43 43 45 53 53  AG_RANDOM_ACCESS
3dc0: 2c 0a 20 20 20 20 20 4e 55 4c 4c 0a 20 20 29 3b  ,.     NULL.  );
3dd0: 0a 20 20 69 66 28 20 68 3d 3d 49 4e 56 41 4c 49  .  if( h==INVALI
3de0: 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29  D_HANDLE_VALUE )
3df0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
3e00: 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20  ITE_CANTOPEN;.  
3e10: 7d 0a 20 20 69 64 2d 3e 68 20 3d 20 68 3b 0a 20  }.  id->h = h;. 
3e20: 20 69 64 2d 3e 6c 6f 63 6b 65 64 20 3d 20 30 3b   id->locked = 0;
3e30: 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2b  .  OpenCounter(+
3e40: 31 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  1);.  return SQL
3e50: 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 23  ITE_OK;.#endif.#
3e60: 69 66 20 4f 53 5f 4d 41 43 0a 20 20 46 53 53 70  if OS_MAC.  FSSp
3e70: 65 63 20 66 73 53 70 65 63 3b 0a 23 20 69 66 64  ec fsSpec;.# ifd
3e80: 65 66 20 5f 4c 41 52 47 45 5f 46 49 4c 45 0a 20  ef _LARGE_FILE. 
3e90: 20 48 46 53 55 6e 69 53 74 72 32 35 35 20 64 66   HFSUniStr255 df
3ea0: 4e 61 6d 65 3b 0a 20 20 46 53 52 65 66 20 66 73  Name;.  FSRef fs
3eb0: 52 65 66 3b 0a 20 20 69 66 28 20 5f 5f 70 61 74  Ref;.  if( __pat
3ec0: 68 32 66 73 73 28 7a 46 69 6c 65 6e 61 6d 65 2c  h2fss(zFilename,
3ed0: 20 26 66 73 53 70 65 63 29 20 21 3d 20 6e 6f 45   &fsSpec) != noE
3ee0: 72 72 20 29 0a 20 20 20 20 72 65 74 75 72 6e 20  rr ).    return 
3ef0: 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b  SQLITE_CANTOPEN;
3f00: 0a 20 20 69 66 28 20 46 53 70 4d 61 6b 65 46 53  .  if( FSpMakeFS
3f10: 52 65 66 28 26 66 73 53 70 65 63 2c 20 26 66 73  Ref(&fsSpec, &fs
3f20: 52 65 66 29 20 21 3d 20 6e 6f 45 72 72 20 29 0a  Ref) != noErr ).
3f30: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
3f40: 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 46 53  E_CANTOPEN;.  FS
3f50: 47 65 74 44 61 74 61 46 6f 72 6b 4e 61 6d 65 28  GetDataForkName(
3f60: 26 64 66 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  &dfName);.  if( 
3f70: 46 53 4f 70 65 6e 46 6f 72 6b 28 26 66 73 52 65  FSOpenFork(&fsRe
3f80: 66 2c 20 64 66 4e 61 6d 65 2e 6c 65 6e 67 74 68  f, dfName.length
3f90: 2c 20 64 66 4e 61 6d 65 2e 75 6e 69 63 6f 64 65  , dfName.unicode
3fa0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
3fb0: 20 20 20 66 73 52 64 50 65 72 6d 2c 20 26 28 69     fsRdPerm, &(i
3fc0: 64 2d 3e 72 65 66 4e 75 6d 29 29 20 21 3d 20 6e  d->refNum)) != n
3fd0: 6f 45 72 72 20 29 0a 20 20 20 20 72 65 74 75 72  oErr ).    retur
3fe0: 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  n SQLITE_CANTOPE
3ff0: 4e 3b 0a 23 20 65 6c 73 65 0a 20 20 5f 5f 70 61  N;.# else.  __pa
4000: 74 68 32 66 73 73 28 7a 46 69 6c 65 6e 61 6d 65  th2fss(zFilename
4010: 2c 20 26 66 73 53 70 65 63 29 3b 0a 20 20 69 66  , &fsSpec);.  if
4020: 28 20 48 4f 70 65 6e 44 46 28 66 73 53 70 65 63  ( HOpenDF(fsSpec
4030: 2e 76 52 65 66 4e 75 6d 2c 20 66 73 53 70 65 63  .vRefNum, fsSpec
4040: 2e 70 61 72 49 44 2c 20 66 73 53 70 65 63 2e 6e  .parID, fsSpec.n
4050: 61 6d 65 2c 20 66 73 52 64 50 65 72 6d 2c 20 26  ame, fsRdPerm, &
4060: 28 69 64 2d 3e 72 65 66 4e 75 6d 29 29 20 21 3d  (id->refNum)) !=
4070: 20 6e 6f 45 72 72 20 29 0a 20 20 20 20 72 65 74   noErr ).    ret
4080: 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  urn SQLITE_CANTO
4090: 50 45 4e 3b 0a 23 20 65 6e 64 69 66 0a 20 20 69  PEN;.# endif.  i
40a0: 66 28 20 48 4f 70 65 6e 52 46 28 66 73 53 70 65  f( HOpenRF(fsSpe
40b0: 63 2e 76 52 65 66 4e 75 6d 2c 20 66 73 53 70 65  c.vRefNum, fsSpe
40c0: 63 2e 70 61 72 49 44 2c 20 66 73 53 70 65 63 2e  c.parID, fsSpec.
40d0: 6e 61 6d 65 2c 20 66 73 52 64 57 72 53 68 50 65  name, fsRdWrShPe
40e0: 72 6d 2c 20 26 28 69 64 2d 3e 72 65 66 4e 75 6d  rm, &(id->refNum
40f0: 52 46 29 29 20 21 3d 20 6e 6f 45 72 72 29 7b 0a  RF)) != noErr){.
4100: 20 20 20 20 69 64 2d 3e 72 65 66 4e 75 6d 52 46      id->refNumRF
4110: 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 69 64 2d   = -1;.  }.  id-
4120: 3e 6c 6f 63 6b 65 64 20 3d 20 30 3b 0a 20 20 69  >locked = 0;.  i
4130: 64 2d 3e 64 65 6c 4f 6e 43 6c 6f 73 65 20 3d 20  d->delOnClose = 
4140: 30 3b 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72  0;.  OpenCounter
4150: 28 2b 31 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  (+1);.  return S
4160: 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66  QLITE_OK;.#endif
4170: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
4180: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
4190: 65 20 6e 61 6d 65 20 69 6e 20 7a 42 75 66 2e 20  e name in zBuf. 
41a0: 20 7a 42 75 66 20 6d 75 73 74 20 62 65 20 62 69   zBuf must be bi
41b0: 67 20 65 6e 6f 75 67 68 20 74 6f 0a 2a 2a 20 68  g enough to.** h
41c0: 6f 6c 64 20 61 74 20 6c 65 61 73 74 20 53 51 4c  old at least SQL
41d0: 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a  ITE_TEMPNAME_SIZ
41e0: 45 20 63 68 61 72 61 63 74 65 72 73 2e 0a 2a 2f  E characters..*/
41f0: 0a 69 6e 74 20 73 71 6c 69 74 65 4f 73 54 65 6d  .int sqliteOsTem
4200: 70 46 69 6c 65 4e 61 6d 65 28 63 68 61 72 20 2a  pFileName(char *
4210: 7a 42 75 66 29 7b 0a 23 69 66 20 4f 53 5f 55 4e  zBuf){.#if OS_UN
4220: 49 58 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  IX.  static cons
4230: 74 20 63 68 61 72 20 2a 61 7a 44 69 72 73 5b 5d  t char *azDirs[]
4240: 20 3d 20 7b 0a 20 20 20 20 20 22 2f 76 61 72 2f   = {.     "/var/
4250: 74 6d 70 22 2c 0a 20 20 20 20 20 22 2f 75 73 72  tmp",.     "/usr
4260: 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22 2f 74 6d  /tmp",.     "/tm
4270: 70 22 2c 0a 20 20 20 20 20 22 2e 22 2c 0a 20 20  p",.     ".",.  
4280: 7d 3b 0a 20 20 73 74 61 74 69 63 20 63 68 61 72  };.  static char
4290: 20 7a 43 68 61 72 73 5b 5d 20 3d 0a 20 20 20 20   zChars[] =.    
42a0: 22 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f  "abcdefghijklmno
42b0: 70 71 72 73 74 75 76 77 78 79 7a 22 0a 20 20 20  pqrstuvwxyz".   
42c0: 20 22 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e   "ABCDEFGHIJKLMN
42d0: 4f 50 51 52 53 54 55 56 57 58 59 5a 22 0a 20 20  OPQRSTUVWXYZ".  
42e0: 20 20 22 30 31 32 33 34 35 36 37 38 39 22 3b 0a    "0123456789";.
42f0: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 73 74    int i, j;.  st
4300: 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20  ruct stat buf;. 
4310: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 69   const char *zDi
4320: 72 20 3d 20 22 2e 22 3b 0a 20 20 66 6f 72 28 69  r = ".";.  for(i
4330: 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 7a 44  =0; i<sizeof(azD
4340: 69 72 73 29 2f 73 69 7a 65 6f 66 28 61 7a 44 69  irs)/sizeof(azDi
4350: 72 73 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20  rs[0]); i++){.  
4360: 20 20 69 66 28 20 73 74 61 74 28 61 7a 44 69 72    if( stat(azDir
4370: 73 5b 69 5d 2c 20 26 62 75 66 29 20 29 20 63 6f  s[i], &buf) ) co
4380: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
4390: 21 53 5f 49 53 44 49 52 28 62 75 66 2e 73 74 5f  !S_ISDIR(buf.st_
43a0: 6d 6f 64 65 29 20 29 20 63 6f 6e 74 69 6e 75 65  mode) ) continue
43b0: 3b 0a 20 20 20 20 69 66 28 20 61 63 63 65 73 73  ;.    if( access
43c0: 28 61 7a 44 69 72 73 5b 69 5d 2c 20 30 37 29 20  (azDirs[i], 07) 
43d0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
43e0: 7a 44 69 72 20 3d 20 61 7a 44 69 72 73 5b 69 5d  zDir = azDirs[i]
43f0: 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  ;.    break;.  }
4400: 0a 20 20 64 6f 7b 0a 20 20 20 20 73 70 72 69 6e  .  do{.    sprin
4410: 74 66 28 7a 42 75 66 2c 20 22 25 73 2f 22 54 45  tf(zBuf, "%s/"TE
4420: 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49 58 2c 20  MP_FILE_PREFIX, 
4430: 7a 44 69 72 29 3b 0a 20 20 20 20 6a 20 3d 20 73  zDir);.    j = s
4440: 74 72 6c 65 6e 28 7a 42 75 66 29 3b 0a 20 20 20  trlen(zBuf);.   
4450: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31 35 3b 20   for(i=0; i<15; 
4460: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  i++){.      int 
4470: 6e 20 3d 20 73 71 6c 69 74 65 52 61 6e 64 6f 6d  n = sqliteRandom
4480: 42 79 74 65 28 29 20 25 20 28 73 69 7a 65 6f 66  Byte() % (sizeof
4490: 28 7a 43 68 61 72 73 29 2d 31 29 3b 0a 20 20 20  (zChars)-1);.   
44a0: 20 20 20 7a 42 75 66 5b 6a 2b 2b 5d 20 3d 20 7a     zBuf[j++] = z
44b0: 43 68 61 72 73 5b 6e 5d 3b 0a 20 20 20 20 7d 0a  Chars[n];.    }.
44c0: 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 30 3b      zBuf[j] = 0;
44d0: 0a 20 20 7d 77 68 69 6c 65 28 20 61 63 63 65 73  .  }while( acces
44e0: 73 28 7a 42 75 66 2c 30 29 3d 3d 30 20 29 3b 0a  s(zBuf,0)==0 );.
44f0: 23 65 6e 64 69 66 0a 23 69 66 20 4f 53 5f 57 49  #endif.#if OS_WI
4500: 4e 0a 20 20 73 74 61 74 69 63 20 63 68 61 72 20  N.  static char 
4510: 7a 43 68 61 72 73 5b 5d 20 3d 0a 20 20 20 20 22  zChars[] =.    "
4520: 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70  abcdefghijklmnop
4530: 71 72 73 74 75 76 77 78 79 7a 22 0a 20 20 20 20  qrstuvwxyz".    
4540: 22 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f  "ABCDEFGHIJKLMNO
4550: 50 51 52 53 54 55 56 57 58 59 5a 22 0a 20 20 20  PQRSTUVWXYZ".   
4560: 20 22 30 31 32 33 34 35 36 37 38 39 22 3b 0a 20   "0123456789";. 
4570: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 63 68 61   int i, j;.  cha
4580: 72 20 7a 54 65 6d 70 50 61 74 68 5b 53 51 4c 49  r zTempPath[SQLI
4590: 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45  TE_TEMPNAME_SIZE
45a0: 5d 3b 0a 20 20 47 65 74 54 65 6d 70 50 61 74 68  ];.  GetTempPath
45b0: 28 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45  (SQLITE_TEMPNAME
45c0: 5f 53 49 5a 45 2d 33 30 2c 20 7a 54 65 6d 70 50  _SIZE-30, zTempP
45d0: 61 74 68 29 3b 0a 20 20 66 6f 72 28 69 3d 73 74  ath);.  for(i=st
45e0: 72 6c 65 6e 28 7a 54 65 6d 70 50 61 74 68 29 3b  rlen(zTempPath);
45f0: 20 69 3e 30 20 26 26 20 7a 54 65 6d 70 50 61 74   i>0 && zTempPat
4600: 68 5b 69 2d 31 5d 3d 3d 27 5c 5c 27 3b 20 69 2d  h[i-1]=='\\'; i-
4610: 2d 29 7b 7d 0a 20 20 7a 54 65 6d 70 50 61 74 68  -){}.  zTempPath
4620: 5b 69 5d 20 3d 20 30 3b 0a 20 20 66 6f 72 28 3b  [i] = 0;.  for(;
4630: 3b 29 7b 0a 20 20 20 20 73 70 72 69 6e 74 66 28  ;){.    sprintf(
4640: 7a 42 75 66 2c 20 22 25 73 5c 5c 22 54 45 4d 50  zBuf, "%s\\"TEMP
4650: 5f 46 49 4c 45 5f 50 52 45 46 49 58 2c 20 7a 54  _FILE_PREFIX, zT
4660: 65 6d 70 50 61 74 68 29 3b 0a 20 20 20 20 6a 20  empPath);.    j 
4670: 3d 20 73 74 72 6c 65 6e 28 7a 42 75 66 29 3b 0a  = strlen(zBuf);.
4680: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31      for(i=0; i<1
4690: 35 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  5; i++){.      i
46a0: 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 52 61 6e  nt n = sqliteRan
46b0: 64 6f 6d 42 79 74 65 28 29 20 25 20 28 73 69 7a  domByte() % (siz
46c0: 65 6f 66 28 7a 43 68 61 72 73 29 20 2d 20 31 29  eof(zChars) - 1)
46d0: 3b 0a 20 20 20 20 20 20 7a 42 75 66 5b 6a 2b 2b  ;.      zBuf[j++
46e0: 5d 20 3d 20 7a 43 68 61 72 73 5b 6e 5d 3b 0a 20  ] = zChars[n];. 
46f0: 20 20 20 7d 0a 20 20 20 20 7a 42 75 66 5b 6a 5d     }.    zBuf[j]
4700: 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 21 73   = 0;.    if( !s
4710: 71 6c 69 74 65 4f 73 46 69 6c 65 45 78 69 73 74  qliteOsFileExist
4720: 73 28 7a 42 75 66 29 20 29 20 62 72 65 61 6b 3b  s(zBuf) ) break;
4730: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20  .  }.#endif.#if 
4740: 4f 53 5f 4d 41 43 0a 20 20 73 74 61 74 69 63 20  OS_MAC.  static 
4750: 63 68 61 72 20 7a 43 68 61 72 73 5b 5d 20 3d 0a  char zChars[] =.
4760: 20 20 20 20 22 61 62 63 64 65 66 67 68 69 6a 6b      "abcdefghijk
4770: 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 22  lmnopqrstuvwxyz"
4780: 0a 20 20 20 20 22 41 42 43 44 45 46 47 48 49 4a  .    "ABCDEFGHIJ
4790: 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a  KLMNOPQRSTUVWXYZ
47a0: 22 0a 20 20 20 20 22 30 31 32 33 34 35 36 37 38  ".    "012345678
47b0: 39 22 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  9";.  int i, j;.
47c0: 20 20 63 68 61 72 20 7a 54 65 6d 70 50 61 74 68    char zTempPath
47d0: 5b 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45  [SQLITE_TEMPNAME
47e0: 5f 53 49 5a 45 5d 3b 0a 20 20 63 68 61 72 20 7a  _SIZE];.  char z
47f0: 64 69 72 4e 61 6d 65 5b 33 32 5d 3b 0a 20 20 43  dirName[32];.  C
4800: 49 6e 66 6f 50 42 52 65 63 20 69 6e 66 6f 52 65  InfoPBRec infoRe
4810: 63 3b 0a 20 20 53 74 72 33 31 20 64 69 72 4e 61  c;.  Str31 dirNa
4820: 6d 65 3b 0a 20 20 6d 65 6d 73 65 74 28 26 69 6e  me;.  memset(&in
4830: 66 6f 52 65 63 2c 20 30 2c 20 73 69 7a 65 6f 66  foRec, 0, sizeof
4840: 28 69 6e 66 6f 52 65 63 29 29 3b 0a 20 20 6d 65  (infoRec));.  me
4850: 6d 73 65 74 28 7a 54 65 6d 70 50 61 74 68 2c 20  mset(zTempPath, 
4860: 30 2c 20 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41  0, SQLITE_TEMPNA
4870: 4d 45 5f 53 49 5a 45 29 3b 0a 20 20 69 66 28 20  ME_SIZE);.  if( 
4880: 46 69 6e 64 46 6f 6c 64 65 72 28 6b 4f 6e 53 79  FindFolder(kOnSy
4890: 73 74 65 6d 44 69 73 6b 2c 20 6b 54 65 6d 70 6f  stemDisk, kTempo
48a0: 72 61 72 79 46 6f 6c 64 65 72 54 79 70 65 2c 20  raryFolderType, 
48b0: 20 6b 43 72 65 61 74 65 46 6f 6c 64 65 72 2c 0a   kCreateFolder,.
48c0: 20 20 20 20 20 20 20 26 28 69 6e 66 6f 52 65 63         &(infoRec
48d0: 2e 64 69 72 49 6e 66 6f 2e 69 6f 56 52 65 66 4e  .dirInfo.ioVRefN
48e0: 75 6d 29 2c 20 26 28 69 6e 66 6f 52 65 63 2e 64  um), &(infoRec.d
48f0: 69 72 49 6e 66 6f 2e 69 6f 44 72 50 61 72 49 44  irInfo.ioDrParID
4900: 29 29 20 3d 3d 20 6e 6f 45 72 72 20 29 7b 0a 20  )) == noErr ){. 
4910: 20 20 20 69 6e 66 6f 52 65 63 2e 64 69 72 49 6e     infoRec.dirIn
4920: 66 6f 2e 69 6f 4e 61 6d 65 50 74 72 20 3d 20 64  fo.ioNamePtr = d
4930: 69 72 4e 61 6d 65 3b 0a 20 20 20 20 64 6f 7b 0a  irName;.    do{.
4940: 20 20 20 20 20 20 69 6e 66 6f 52 65 63 2e 64 69        infoRec.di
4950: 72 49 6e 66 6f 2e 69 6f 46 44 69 72 49 6e 64 65  rInfo.ioFDirInde
4960: 78 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 69 6e  x = -1;.      in
4970: 66 6f 52 65 63 2e 64 69 72 49 6e 66 6f 2e 69 6f  foRec.dirInfo.io
4980: 44 72 44 69 72 49 44 20 3d 20 69 6e 66 6f 52 65  DrDirID = infoRe
4990: 63 2e 64 69 72 49 6e 66 6f 2e 69 6f 44 72 50 61  c.dirInfo.ioDrPa
49a0: 72 49 44 3b 0a 20 20 20 20 20 20 69 66 28 20 50  rID;.      if( P
49b0: 42 47 65 74 43 61 74 49 6e 66 6f 53 79 6e 63 28  BGetCatInfoSync(
49c0: 26 69 6e 66 6f 52 65 63 29 20 3d 3d 20 6e 6f 45  &infoRec) == noE
49d0: 72 72 20 29 7b 0a 20 20 20 20 20 20 20 20 43 6f  rr ){.        Co
49e0: 70 79 50 61 73 63 61 6c 53 74 72 69 6e 67 54 6f  pyPascalStringTo
49f0: 43 28 64 69 72 4e 61 6d 65 2c 20 7a 64 69 72 4e  C(dirName, zdirN
4a00: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69 20  ame);.        i 
4a10: 3d 20 73 74 72 6c 65 6e 28 7a 64 69 72 4e 61 6d  = strlen(zdirNam
4a20: 65 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 6d  e);.        memm
4a30: 6f 76 65 28 26 28 7a 54 65 6d 70 50 61 74 68 5b  ove(&(zTempPath[
4a40: 69 2b 31 5d 29 2c 20 7a 54 65 6d 70 50 61 74 68  i+1]), zTempPath
4a50: 2c 20 73 74 72 6c 65 6e 28 7a 54 65 6d 70 50 61  , strlen(zTempPa
4a60: 74 68 29 29 3b 0a 20 20 20 20 20 20 20 20 73 74  th));.        st
4a70: 72 63 70 79 28 7a 54 65 6d 70 50 61 74 68 2c 20  rcpy(zTempPath, 
4a80: 7a 64 69 72 4e 61 6d 65 29 3b 0a 20 20 20 20 20  zdirName);.     
4a90: 20 20 20 7a 54 65 6d 70 50 61 74 68 5b 69 5d 20     zTempPath[i] 
4aa0: 3d 20 27 3a 27 3b 0a 20 20 20 20 20 20 7d 65 6c  = ':';.      }el
4ab0: 73 65 7b 0a 20 20 20 20 20 20 20 20 2a 7a 54 65  se{.        *zTe
4ac0: 6d 70 50 61 74 68 20 3d 20 30 3b 0a 20 20 20 20  mpPath = 0;.    
4ad0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
4ae0: 20 7d 0a 20 20 20 20 7d 20 77 68 69 6c 65 28 20   }.    } while( 
4af0: 69 6e 66 6f 52 65 63 2e 64 69 72 49 6e 66 6f 2e  infoRec.dirInfo.
4b00: 69 6f 44 72 44 69 72 49 44 20 21 3d 20 66 73 52  ioDrDirID != fsR
4b10: 74 44 69 72 49 44 20 29 3b 0a 20 20 7d 0a 20 20  tDirID );.  }.  
4b20: 69 66 28 20 2a 7a 54 65 6d 70 50 61 74 68 20 3d  if( *zTempPath =
4b30: 3d 20 30 20 29 0a 20 20 20 20 67 65 74 63 77 64  = 0 ).    getcwd
4b40: 28 7a 54 65 6d 70 50 61 74 68 2c 20 53 51 4c 49  (zTempPath, SQLI
4b50: 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45  TE_TEMPNAME_SIZE
4b60: 2d 32 34 29 3b 0a 20 20 66 6f 72 28 3b 3b 29 7b  -24);.  for(;;){
4b70: 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42 75  .    sprintf(zBu
4b80: 66 2c 20 22 25 73 22 54 45 4d 50 5f 46 49 4c 45  f, "%s"TEMP_FILE
4b90: 5f 50 52 45 46 49 58 2c 20 7a 54 65 6d 70 50 61  _PREFIX, zTempPa
4ba0: 74 68 29 3b 0a 20 20 20 20 6a 20 3d 20 73 74 72  th);.    j = str
4bb0: 6c 65 6e 28 7a 42 75 66 29 3b 0a 20 20 20 20 66  len(zBuf);.    f
4bc0: 6f 72 28 69 3d 30 3b 20 69 3c 31 35 3b 20 69 2b  or(i=0; i<15; i+
4bd0: 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20  +){.      int n 
4be0: 3d 20 73 71 6c 69 74 65 52 61 6e 64 6f 6d 42 79  = sqliteRandomBy
4bf0: 74 65 28 29 20 25 20 73 69 7a 65 6f 66 28 7a 43  te() % sizeof(zC
4c00: 68 61 72 73 29 3b 0a 20 20 20 20 20 20 7a 42 75  hars);.      zBu
4c10: 66 5b 6a 2b 2b 5d 20 3d 20 7a 43 68 61 72 73 5b  f[j++] = zChars[
4c20: 6e 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 42  n];.    }.    zB
4c30: 75 66 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 69  uf[j] = 0;.    i
4c40: 66 28 20 21 73 71 6c 69 74 65 4f 73 46 69 6c 65  f( !sqliteOsFile
4c50: 45 78 69 73 74 73 28 7a 42 75 66 29 20 29 20 62  Exists(zBuf) ) b
4c60: 72 65 61 6b 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  reak;.  }.#endif
4c70: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
4c80: 5f 4f 4b 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  _OK; .}../*.** C
4c90: 6c 6f 73 65 20 61 20 66 69 6c 65 0a 2a 2f 0a 69  lose a file.*/.i
4ca0: 6e 74 20 73 71 6c 69 74 65 4f 73 43 6c 6f 73 65  nt sqliteOsClose
4cb0: 28 4f 73 46 69 6c 65 20 2a 69 64 29 7b 0a 23 69  (OsFile *id){.#i
4cc0: 66 20 4f 53 5f 55 4e 49 58 0a 20 20 63 6c 6f 73  f OS_UNIX.  clos
4cd0: 65 28 69 64 2d 3e 66 64 29 3b 0a 20 20 73 71 6c  e(id->fd);.  sql
4ce0: 69 74 65 4f 73 45 6e 74 65 72 4d 75 74 65 78 28  iteOsEnterMutex(
4cf0: 29 3b 0a 20 20 72 65 6c 65 61 73 65 4c 6f 63 6b  );.  releaseLock
4d00: 49 6e 66 6f 28 69 64 2d 3e 70 4c 6f 63 6b 29 3b  Info(id->pLock);
4d10: 0a 20 20 73 71 6c 69 74 65 4f 73 4c 65 61 76 65  .  sqliteOsLeave
4d20: 4d 75 74 65 78 28 29 3b 0a 20 20 54 52 41 43 45  Mutex();.  TRACE
4d30: 32 28 22 43 4c 4f 53 45 20 20 20 25 2d 33 64 5c  2("CLOSE   %-3d\
4d40: 6e 22 2c 20 69 64 2d 3e 66 64 29 3b 0a 20 20 4f  n", id->fd);.  O
4d50: 70 65 6e 43 6f 75 6e 74 65 72 28 2d 31 29 3b 0a  penCounter(-1);.
4d60: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
4d70: 4f 4b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f  OK;.#endif.#if O
4d80: 53 5f 57 49 4e 0a 20 20 43 6c 6f 73 65 48 61 6e  S_WIN.  CloseHan
4d90: 64 6c 65 28 69 64 2d 3e 68 29 3b 0a 20 20 4f 70  dle(id->h);.  Op
4da0: 65 6e 43 6f 75 6e 74 65 72 28 2d 31 29 3b 0a 20  enCounter(-1);. 
4db0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
4dc0: 4b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f 53  K;.#endif.#if OS
4dd0: 5f 4d 41 43 0a 20 20 69 66 28 20 69 64 2d 3e 72  _MAC.  if( id->r
4de0: 65 66 4e 75 6d 52 46 21 3d 2d 31 20 29 0a 20 20  efNumRF!=-1 ).  
4df0: 20 20 46 53 43 6c 6f 73 65 28 69 64 2d 3e 72 65    FSClose(id->re
4e00: 66 4e 75 6d 52 46 29 3b 0a 23 20 69 66 64 65 66  fNumRF);.# ifdef
4e10: 20 5f 4c 41 52 47 45 5f 46 49 4c 45 0a 20 20 46   _LARGE_FILE.  F
4e20: 53 43 6c 6f 73 65 46 6f 72 6b 28 69 64 2d 3e 72  SCloseFork(id->r
4e30: 65 66 4e 75 6d 29 3b 0a 23 20 65 6c 73 65 0a 20  efNum);.# else. 
4e40: 20 46 53 43 6c 6f 73 65 28 69 64 2d 3e 72 65 66   FSClose(id->ref
4e50: 4e 75 6d 29 3b 0a 23 20 65 6e 64 69 66 0a 20 20  Num);.# endif.  
4e60: 69 66 28 20 69 64 2d 3e 64 65 6c 4f 6e 43 6c 6f  if( id->delOnClo
4e70: 73 65 20 29 7b 0a 20 20 20 20 75 6e 6c 69 6e 6b  se ){.    unlink
4e80: 28 69 64 2d 3e 70 61 74 68 54 6f 44 65 6c 29 3b  (id->pathToDel);
4e90: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
4ea0: 69 64 2d 3e 70 61 74 68 54 6f 44 65 6c 29 3b 0a  id->pathToDel);.
4eb0: 20 20 7d 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65    }.  OpenCounte
4ec0: 72 28 2d 31 29 3b 0a 20 20 72 65 74 75 72 6e 20  r(-1);.  return 
4ed0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69  SQLITE_OK;.#endi
4ee0: 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  f.}../*.** Read 
4ef0: 64 61 74 61 20 66 72 6f 6d 20 61 20 66 69 6c 65  data from a file
4f00: 20 69 6e 74 6f 20 61 20 62 75 66 66 65 72 2e 20   into a buffer. 
4f10: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
4f20: 4b 20 69 66 20 61 6c 6c 0a 2a 2a 20 62 79 74 65  K if all.** byte
4f30: 73 20 77 65 72 65 20 72 65 61 64 20 73 75 63 63  s were read succ
4f40: 65 73 73 66 75 6c 6c 79 20 61 6e 64 20 53 51 4c  essfully and SQL
4f50: 49 54 45 5f 49 4f 45 52 52 20 69 66 20 61 6e 79  ITE_IOERR if any
4f60: 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72  thing goes.** wr
4f70: 6f 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ong..*/.int sqli
4f80: 74 65 4f 73 52 65 61 64 28 4f 73 46 69 6c 65 20  teOsRead(OsFile 
4f90: 2a 69 64 2c 20 76 6f 69 64 20 2a 70 42 75 66 2c  *id, void *pBuf,
4fa0: 20 69 6e 74 20 61 6d 74 29 7b 0a 23 69 66 20 4f   int amt){.#if O
4fb0: 53 5f 55 4e 49 58 0a 20 20 69 6e 74 20 67 6f 74  S_UNIX.  int got
4fc0: 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
4fd0: 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
4fe0: 29 3b 0a 20 20 54 49 4d 45 52 5f 53 54 41 52 54  );.  TIMER_START
4ff0: 3b 0a 20 20 67 6f 74 20 3d 20 72 65 61 64 28 69  ;.  got = read(i
5000: 64 2d 3e 66 64 2c 20 70 42 75 66 2c 20 61 6d 74  d->fd, pBuf, amt
5010: 29 3b 0a 20 20 54 49 4d 45 52 5f 45 4e 44 3b 0a  );.  TIMER_END;.
5020: 20 20 54 52 41 43 45 34 28 22 52 45 41 44 20 20    TRACE4("READ  
5030: 20 20 25 2d 33 64 20 25 37 64 20 25 64 5c 6e 22    %-3d %7d %d\n"
5040: 2c 20 69 64 2d 3e 66 64 2c 20 6c 61 73 74 5f 70  , id->fd, last_p
5050: 61 67 65 2c 20 65 6c 61 70 73 65 29 3b 0a 20 20  age, elapse);.  
5060: 53 45 45 4b 28 30 29 3b 0a 20 20 2f 2a 20 69 66  SEEK(0);.  /* if
5070: 28 20 67 6f 74 3c 30 20 29 20 67 6f 74 20 3d 20  ( got<0 ) got = 
5080: 30 3b 20 2a 2f 0a 20 20 69 66 28 20 67 6f 74 3d  0; */.  if( got=
5090: 3d 61 6d 74 20 29 7b 0a 20 20 20 20 72 65 74 75  =amt ){.    retu
50a0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
50b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
50c0: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a  n SQLITE_IOERR;.
50d0: 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f    }.#endif.#if O
50e0: 53 5f 57 49 4e 0a 20 20 44 57 4f 52 44 20 67 6f  S_WIN.  DWORD go
50f0: 74 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  t;.  SimulateIOE
5100: 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
5110: 52 29 3b 0a 20 20 54 52 41 43 45 32 28 22 52 45  R);.  TRACE2("RE
5120: 41 44 20 25 64 5c 6e 22 2c 20 6c 61 73 74 5f 70  AD %d\n", last_p
5130: 61 67 65 29 3b 0a 20 20 69 66 28 20 21 52 65 61  age);.  if( !Rea
5140: 64 46 69 6c 65 28 69 64 2d 3e 68 2c 20 70 42 75  dFile(id->h, pBu
5150: 66 2c 20 61 6d 74 2c 20 26 67 6f 74 2c 20 30 29  f, amt, &got, 0)
5160: 20 29 7b 0a 20 20 20 20 67 6f 74 20 3d 20 30 3b   ){.    got = 0;
5170: 0a 20 20 7d 0a 20 20 69 66 28 20 67 6f 74 3d 3d  .  }.  if( got==
5180: 28 44 57 4f 52 44 29 61 6d 74 20 29 7b 0a 20 20  (DWORD)amt ){.  
5190: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
51a0: 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OK;.  }else{.   
51b0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
51c0: 4f 45 52 52 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  OERR;.  }.#endif
51d0: 0a 23 69 66 20 4f 53 5f 4d 41 43 0a 20 20 69 6e  .#if OS_MAC.  in
51e0: 74 20 67 6f 74 3b 0a 20 20 53 69 6d 75 6c 61 74  t got;.  Simulat
51f0: 65 49 4f 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  eIOError(SQLITE_
5200: 49 4f 45 52 52 29 3b 0a 20 20 54 52 41 43 45 32  IOERR);.  TRACE2
5210: 28 22 52 45 41 44 20 25 64 5c 6e 22 2c 20 6c 61  ("READ %d\n", la
5220: 73 74 5f 70 61 67 65 29 3b 0a 23 20 69 66 64 65  st_page);.# ifde
5230: 66 20 5f 4c 41 52 47 45 5f 46 49 4c 45 0a 20 20  f _LARGE_FILE.  
5240: 46 53 52 65 61 64 46 6f 72 6b 28 69 64 2d 3e 72  FSReadFork(id->r
5250: 65 66 4e 75 6d 2c 20 66 73 41 74 4d 61 72 6b 2c  efNum, fsAtMark,
5260: 20 30 2c 20 28 42 79 74 65 43 6f 75 6e 74 29 61   0, (ByteCount)a
5270: 6d 74 2c 20 70 42 75 66 2c 20 28 42 79 74 65 43  mt, pBuf, (ByteC
5280: 6f 75 6e 74 2a 29 26 67 6f 74 29 3b 0a 23 20 65  ount*)&got);.# e
5290: 6c 73 65 0a 20 20 67 6f 74 20 3d 20 61 6d 74 3b  lse.  got = amt;
52a0: 0a 20 20 46 53 52 65 61 64 28 69 64 2d 3e 72 65  .  FSRead(id->re
52b0: 66 4e 75 6d 2c 20 26 67 6f 74 2c 20 70 42 75 66  fNum, &got, pBuf
52c0: 29 3b 0a 23 20 65 6e 64 69 66 0a 20 20 69 66 28  );.# endif.  if(
52d0: 20 67 6f 74 3d 3d 61 6d 74 20 29 7b 0a 20 20 20   got==amt ){.   
52e0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
52f0: 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  K;.  }else{.    
5300: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
5310: 45 52 52 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ERR;.  }.#endif.
5320: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 64  }../*.** Write d
5330: 61 74 61 20 66 72 6f 6d 20 61 20 62 75 66 66 65  ata from a buffe
5340: 72 20 69 6e 74 6f 20 61 20 66 69 6c 65 2e 20 20  r into a file.  
5350: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
5360: 20 6f 6e 20 73 75 63 63 65 73 73 0a 2a 2a 20 6f   on success.** o
5370: 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72  r some other err
5380: 6f 72 20 63 6f 64 65 20 6f 6e 20 66 61 69 6c 75  or code on failu
5390: 72 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  re..*/.int sqlit
53a0: 65 4f 73 57 72 69 74 65 28 4f 73 46 69 6c 65 20  eOsWrite(OsFile 
53b0: 2a 69 64 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20  *id, const void 
53c0: 2a 70 42 75 66 2c 20 69 6e 74 20 61 6d 74 29 7b  *pBuf, int amt){
53d0: 0a 23 69 66 20 4f 53 5f 55 4e 49 58 0a 20 20 69  .#if OS_UNIX.  i
53e0: 6e 74 20 77 72 6f 74 65 20 3d 20 30 3b 0a 20 20  nt wrote = 0;.  
53f0: 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
5400: 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 3b 0a 20  SQLITE_IOERR);. 
5410: 20 54 49 4d 45 52 5f 53 54 41 52 54 3b 0a 20 20   TIMER_START;.  
5420: 77 68 69 6c 65 28 20 61 6d 74 3e 30 20 26 26 20  while( amt>0 && 
5430: 28 77 72 6f 74 65 20 3d 20 77 72 69 74 65 28 69  (wrote = write(i
5440: 64 2d 3e 66 64 2c 20 70 42 75 66 2c 20 61 6d 74  d->fd, pBuf, amt
5450: 29 29 3e 30 20 29 7b 0a 20 20 20 20 61 6d 74 20  ))>0 ){.    amt 
5460: 2d 3d 20 77 72 6f 74 65 3b 0a 20 20 20 20 70 42  -= wrote;.    pB
5470: 75 66 20 3d 20 26 28 28 63 68 61 72 2a 29 70 42  uf = &((char*)pB
5480: 75 66 29 5b 77 72 6f 74 65 5d 3b 0a 20 20 7d 0a  uf)[wrote];.  }.
5490: 20 20 54 49 4d 45 52 5f 45 4e 44 3b 0a 20 20 54    TIMER_END;.  T
54a0: 52 41 43 45 34 28 22 57 52 49 54 45 20 20 20 25  RACE4("WRITE   %
54b0: 2d 33 64 20 25 37 64 20 25 64 5c 6e 22 2c 20 69  -3d %7d %d\n", i
54c0: 64 2d 3e 66 64 2c 20 6c 61 73 74 5f 70 61 67 65  d->fd, last_page
54d0: 2c 20 65 6c 61 70 73 65 29 3b 0a 20 20 53 45 45  , elapse);.  SEE
54e0: 4b 28 30 29 3b 0a 20 20 69 66 28 20 61 6d 74 3e  K(0);.  if( amt>
54f0: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
5500: 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 7d  SQLITE_FULL;.  }
5510: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
5520: 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  _OK;.#endif.#if 
5530: 4f 53 5f 57 49 4e 0a 20 20 69 6e 74 20 72 63 3b  OS_WIN.  int rc;
5540: 0a 20 20 44 57 4f 52 44 20 77 72 6f 74 65 3b 0a  .  DWORD wrote;.
5550: 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
5560: 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 3b  r(SQLITE_IOERR);
5570: 0a 20 20 54 52 41 43 45 32 28 22 57 52 49 54 45  .  TRACE2("WRITE
5580: 20 25 64 5c 6e 22 2c 20 6c 61 73 74 5f 70 61 67   %d\n", last_pag
5590: 65 29 3b 0a 20 20 77 68 69 6c 65 28 20 61 6d 74  e);.  while( amt
55a0: 3e 30 20 26 26 20 28 72 63 20 3d 20 57 72 69 74  >0 && (rc = Writ
55b0: 65 46 69 6c 65 28 69 64 2d 3e 68 2c 20 70 42 75  eFile(id->h, pBu
55c0: 66 2c 20 61 6d 74 2c 20 26 77 72 6f 74 65 2c 20  f, amt, &wrote, 
55d0: 30 29 29 21 3d 30 20 26 26 20 77 72 6f 74 65 3e  0))!=0 && wrote>
55e0: 30 20 29 7b 0a 20 20 20 20 61 6d 74 20 2d 3d 20  0 ){.    amt -= 
55f0: 77 72 6f 74 65 3b 0a 20 20 20 20 70 42 75 66 20  wrote;.    pBuf 
5600: 3d 20 26 28 28 63 68 61 72 2a 29 70 42 75 66 29  = &((char*)pBuf)
5610: 5b 77 72 6f 74 65 5d 3b 0a 20 20 7d 0a 20 20 69  [wrote];.  }.  i
5620: 66 28 20 21 72 63 20 7c 7c 20 61 6d 74 3e 28 69  f( !rc || amt>(i
5630: 6e 74 29 77 72 6f 74 65 20 29 7b 0a 20 20 20 20  nt)wrote ){.    
5640: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55  return SQLITE_FU
5650: 4c 4c 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  LL;.  }.  return
5660: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64   SQLITE_OK;.#end
5670: 69 66 0a 23 69 66 20 4f 53 5f 4d 41 43 0a 20 20  if.#if OS_MAC.  
5680: 4f 53 45 72 72 20 6f 73 65 72 72 3b 0a 20 20 69  OSErr oserr;.  i
5690: 6e 74 20 77 72 6f 74 65 20 3d 20 30 3b 0a 20 20  nt wrote = 0;.  
56a0: 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
56b0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 3b 0a 20  SQLITE_IOERR);. 
56c0: 20 54 52 41 43 45 32 28 22 57 52 49 54 45 20 25   TRACE2("WRITE %
56d0: 64 5c 6e 22 2c 20 6c 61 73 74 5f 70 61 67 65 29  d\n", last_page)
56e0: 3b 0a 20 20 77 68 69 6c 65 28 20 61 6d 74 3e 30  ;.  while( amt>0
56f0: 20 29 7b 0a 23 20 69 66 64 65 66 20 5f 4c 41 52   ){.# ifdef _LAR
5700: 47 45 5f 46 49 4c 45 0a 20 20 20 20 6f 73 65 72  GE_FILE.    oser
5710: 72 20 3d 20 46 53 57 72 69 74 65 46 6f 72 6b 28  r = FSWriteFork(
5720: 69 64 2d 3e 72 65 66 4e 75 6d 2c 20 66 73 41 74  id->refNum, fsAt
5730: 4d 61 72 6b 2c 20 30 2c 0a 20 20 20 20 20 20 20  Mark, 0,.       
5740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5750: 20 28 42 79 74 65 43 6f 75 6e 74 29 61 6d 74 2c   (ByteCount)amt,
5760: 20 70 42 75 66 2c 20 28 42 79 74 65 43 6f 75 6e   pBuf, (ByteCoun
5770: 74 2a 29 26 77 72 6f 74 65 29 3b 0a 23 20 65 6c  t*)&wrote);.# el
5780: 73 65 0a 20 20 20 20 77 72 6f 74 65 20 3d 20 61  se.    wrote = a
5790: 6d 74 3b 0a 20 20 20 20 6f 73 65 72 72 20 3d 20  mt;.    oserr = 
57a0: 46 53 57 72 69 74 65 28 69 64 2d 3e 72 65 66 4e  FSWrite(id->refN
57b0: 75 6d 2c 20 26 77 72 6f 74 65 2c 20 70 42 75 66  um, &wrote, pBuf
57c0: 29 3b 0a 23 20 65 6e 64 69 66 0a 20 20 20 20 69  );.# endif.    i
57d0: 66 28 20 77 72 6f 74 65 20 3d 3d 20 30 20 7c 7c  f( wrote == 0 ||
57e0: 20 6f 73 65 72 72 20 21 3d 20 6e 6f 45 72 72 29   oserr != noErr)
57f0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
5800: 20 20 61 6d 74 20 2d 3d 20 77 72 6f 74 65 3b 0a    amt -= wrote;.
5810: 20 20 20 20 70 42 75 66 20 3d 20 26 28 28 63 68      pBuf = &((ch
5820: 61 72 2a 29 70 42 75 66 29 5b 77 72 6f 74 65 5d  ar*)pBuf)[wrote]
5830: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 73 65 72  ;.  }.  if( oser
5840: 72 20 21 3d 20 6e 6f 45 72 72 20 7c 7c 20 61 6d  r != noErr || am
5850: 74 3e 77 72 6f 74 65 20 29 7b 0a 20 20 20 20 72  t>wrote ){.    r
5860: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c  eturn SQLITE_FUL
5870: 4c 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  L;.  }.  return 
5880: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69  SQLITE_OK;.#endi
5890: 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  f.}../*.** Move 
58a0: 74 68 65 20 72 65 61 64 2f 77 72 69 74 65 20 70  the read/write p
58b0: 6f 69 6e 74 65 72 20 69 6e 20 61 20 66 69 6c 65  ointer in a file
58c0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 4f  ..*/.int sqliteO
58d0: 73 53 65 65 6b 28 4f 73 46 69 6c 65 20 2a 69 64  sSeek(OsFile *id
58e0: 2c 20 6f 66 66 5f 74 20 6f 66 66 73 65 74 29 7b  , off_t offset){
58f0: 0a 20 20 53 45 45 4b 28 6f 66 66 73 65 74 2f 31  .  SEEK(offset/1
5900: 30 32 34 20 2b 20 31 29 3b 0a 23 69 66 20 4f 53  024 + 1);.#if OS
5910: 5f 55 4e 49 58 0a 20 20 6c 73 65 65 6b 28 69 64  _UNIX.  lseek(id
5920: 2d 3e 66 64 2c 20 6f 66 66 73 65 74 2c 20 53 45  ->fd, offset, SE
5930: 45 4b 5f 53 45 54 29 3b 0a 20 20 72 65 74 75 72  EK_SET);.  retur
5940: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e  n SQLITE_OK;.#en
5950: 64 69 66 0a 23 69 66 20 4f 53 5f 57 49 4e 0a 20  dif.#if OS_WIN. 
5960: 20 7b 0a 20 20 20 20 4c 4f 4e 47 20 75 70 70 65   {.    LONG uppe
5970: 72 42 69 74 73 20 3d 20 6f 66 66 73 65 74 3e 3e  rBits = offset>>
5980: 33 32 3b 0a 20 20 20 20 4c 4f 4e 47 20 6c 6f 77  32;.    LONG low
5990: 65 72 42 69 74 73 20 3d 20 6f 66 66 73 65 74 20  erBits = offset 
59a0: 26 20 30 78 66 66 66 66 66 66 66 66 3b 0a 20 20  & 0xffffffff;.  
59b0: 20 20 44 57 4f 52 44 20 72 63 3b 0a 20 20 20 20    DWORD rc;.    
59c0: 72 63 20 3d 20 53 65 74 46 69 6c 65 50 6f 69 6e  rc = SetFilePoin
59d0: 74 65 72 28 69 64 2d 3e 68 2c 20 6c 6f 77 65 72  ter(id->h, lower
59e0: 42 69 74 73 2c 20 26 75 70 70 65 72 42 69 74 73  Bits, &upperBits
59f0: 2c 20 46 49 4c 45 5f 42 45 47 49 4e 29 3b 0a 20  , FILE_BEGIN);. 
5a00: 20 20 20 2f 2a 20 54 52 41 43 45 33 28 22 53 45     /* TRACE3("SE
5a10: 45 4b 20 72 63 3d 30 78 25 78 20 75 70 70 65 72  EK rc=0x%x upper
5a20: 3d 30 78 25 78 5c 6e 22 2c 20 72 63 2c 20 75 70  =0x%x\n", rc, up
5a30: 70 65 72 42 69 74 73 29 3b 20 2a 2f 0a 20 20 7d  perBits); */.  }
5a40: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
5a50: 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  _OK;.#endif.#if 
5a60: 4f 53 5f 4d 41 43 0a 20 20 7b 0a 20 20 20 20 6f  OS_MAC.  {.    o
5a70: 66 66 5f 74 20 63 75 72 53 69 7a 65 3b 0a 20 20  ff_t curSize;.  
5a80: 20 20 69 66 28 20 73 71 6c 69 74 65 4f 73 46 69    if( sqliteOsFi
5a90: 6c 65 53 69 7a 65 28 69 64 2c 20 26 63 75 72 53  leSize(id, &curS
5aa0: 69 7a 65 29 20 21 3d 20 53 51 4c 49 54 45 5f 4f  ize) != SQLITE_O
5ab0: 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
5ac0: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a  n SQLITE_IOERR;.
5ad0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 66      }.    if( of
5ae0: 66 73 65 74 20 3e 3d 20 63 75 72 53 69 7a 65 20  fset >= curSize 
5af0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
5b00: 69 74 65 4f 73 54 72 75 6e 63 61 74 65 28 69 64  iteOsTruncate(id
5b10: 2c 20 6f 66 66 73 65 74 2b 31 29 20 21 3d 20 53  , offset+1) != S
5b20: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
5b30: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
5b40: 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 20 20 7d  E_IOERR;.      }
5b50: 0a 20 20 20 20 7d 0a 23 20 69 66 64 65 66 20 5f  .    }.# ifdef _
5b60: 4c 41 52 47 45 5f 46 49 4c 45 0a 20 20 20 20 69  LARGE_FILE.    i
5b70: 66 28 20 46 53 53 65 74 46 6f 72 6b 50 6f 73 69  f( FSSetForkPosi
5b80: 74 69 6f 6e 28 69 64 2d 3e 72 65 66 4e 75 6d 2c  tion(id->refNum,
5b90: 20 66 73 46 72 6f 6d 53 74 61 72 74 2c 20 6f 66   fsFromStart, of
5ba0: 66 73 65 74 29 20 21 3d 20 6e 6f 45 72 72 20 29  fset) != noErr )
5bb0: 7b 0a 23 20 65 6c 73 65 0a 20 20 20 20 69 66 28  {.# else.    if(
5bc0: 20 53 65 74 46 50 6f 73 28 69 64 2d 3e 72 65 66   SetFPos(id->ref
5bd0: 4e 75 6d 2c 20 66 73 46 72 6f 6d 53 74 61 72 74  Num, fsFromStart
5be0: 2c 20 6f 66 66 73 65 74 29 20 21 3d 20 6e 6f 45  , offset) != noE
5bf0: 72 72 20 29 7b 0a 23 20 65 6e 64 69 66 0a 20 20  rr ){.# endif.  
5c00: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
5c10: 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 7d 65 6c  E_IOERR;.    }el
5c20: 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  se{.      return
5c30: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
5c40: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a  }.  }.#endif.}..
5c50: 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  /*.** Make sure 
5c60: 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 61 20  all writes to a 
5c70: 70 61 72 74 69 63 75 6c 61 72 20 66 69 6c 65 20  particular file 
5c80: 61 72 65 20 63 6f 6d 6d 69 74 74 65 64 20 74 6f  are committed to
5c90: 20 64 69 73 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71   disk..*/.int sq
5ca0: 6c 69 74 65 4f 73 53 79 6e 63 28 4f 73 46 69 6c  liteOsSync(OsFil
5cb0: 65 20 2a 69 64 29 7b 0a 23 69 66 20 4f 53 5f 55  e *id){.#if OS_U
5cc0: 4e 49 58 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  NIX.  SimulateIO
5cd0: 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
5ce0: 52 52 29 3b 0a 20 20 54 52 41 43 45 32 28 22 53  RR);.  TRACE2("S
5cf0: 59 4e 43 20 20 20 20 25 2d 33 64 5c 6e 22 2c 20  YNC    %-3d\n", 
5d00: 69 64 2d 3e 66 64 29 3b 0a 20 20 69 66 28 20 66  id->fd);.  if( f
5d10: 73 79 6e 63 28 69 64 2d 3e 66 64 29 20 29 7b 0a  sync(id->fd) ){.
5d20: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
5d30: 45 5f 49 4f 45 52 52 3b 0a 20 20 7d 65 6c 73 65  E_IOERR;.  }else
5d40: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
5d50: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 23 65 6e 64  ITE_OK;.  }.#end
5d60: 69 66 0a 23 69 66 20 4f 53 5f 57 49 4e 0a 20 20  if.#if OS_WIN.  
5d70: 69 66 28 20 46 6c 75 73 68 46 69 6c 65 42 75 66  if( FlushFileBuf
5d80: 66 65 72 73 28 69 64 2d 3e 68 29 20 29 7b 0a 20  fers(id->h) ){. 
5d90: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
5da0: 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _OK;.  }else{.  
5db0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
5dc0: 49 4f 45 52 52 3b 0a 20 20 7d 0a 23 65 6e 64 69  IOERR;.  }.#endi
5dd0: 66 0a 23 69 66 20 4f 53 5f 4d 41 43 0a 23 20 69  f.#if OS_MAC.# i
5de0: 66 64 65 66 20 5f 4c 41 52 47 45 5f 46 49 4c 45  fdef _LARGE_FILE
5df0: 0a 20 20 69 66 28 20 46 53 46 6c 75 73 68 46 6f  .  if( FSFlushFo
5e00: 72 6b 28 69 64 2d 3e 72 65 66 4e 75 6d 29 20 21  rk(id->refNum) !
5e10: 3d 20 6e 6f 45 72 72 20 29 7b 0a 23 20 65 6c 73  = noErr ){.# els
5e20: 65 0a 20 20 50 61 72 61 6d 42 6c 6f 63 6b 52 65  e.  ParamBlockRe
5e30: 63 20 70 61 72 61 6d 73 3b 0a 20 20 6d 65 6d 73  c params;.  mems
5e40: 65 74 28 26 70 61 72 61 6d 73 2c 20 30 2c 20 73  et(&params, 0, s
5e50: 69 7a 65 6f 66 28 50 61 72 61 6d 42 6c 6f 63 6b  izeof(ParamBlock
5e60: 52 65 63 29 29 3b 0a 20 20 70 61 72 61 6d 73 2e  Rec));.  params.
5e70: 69 6f 50 61 72 61 6d 2e 69 6f 52 65 66 4e 75 6d  ioParam.ioRefNum
5e80: 20 3d 20 69 64 2d 3e 72 65 66 4e 75 6d 3b 0a 20   = id->refNum;. 
5e90: 20 69 66 28 20 50 42 46 6c 75 73 68 46 69 6c 65   if( PBFlushFile
5ea0: 53 79 6e 63 28 26 70 61 72 61 6d 73 29 20 21 3d  Sync(&params) !=
5eb0: 20 6e 6f 45 72 72 20 29 7b 0a 23 20 65 6e 64 69   noErr ){.# endi
5ec0: 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  f.    return SQL
5ed0: 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 7d 65 6c  ITE_IOERR;.  }el
5ee0: 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  se{.    return S
5ef0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 23 65  QLITE_OK;.  }.#e
5f00: 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72  ndif.}../*.** Tr
5f10: 75 6e 63 61 74 65 20 61 6e 20 6f 70 65 6e 20 66  uncate an open f
5f20: 69 6c 65 20 74 6f 20 61 20 73 70 65 63 69 66 69  ile to a specifi
5f30: 65 64 20 73 69 7a 65 0a 2a 2f 0a 69 6e 74 20 73  ed size.*/.int s
5f40: 71 6c 69 74 65 4f 73 54 72 75 6e 63 61 74 65 28  qliteOsTruncate(
5f50: 4f 73 46 69 6c 65 20 2a 69 64 2c 20 6f 66 66 5f  OsFile *id, off_
5f60: 74 20 6e 42 79 74 65 29 7b 0a 20 20 53 69 6d 75  t nByte){.  Simu
5f70: 6c 61 74 65 49 4f 45 72 72 6f 72 28 53 51 4c 49  lateIOError(SQLI
5f80: 54 45 5f 49 4f 45 52 52 29 3b 0a 23 69 66 20 4f  TE_IOERR);.#if O
5f90: 53 5f 55 4e 49 58 0a 20 20 72 65 74 75 72 6e 20  S_UNIX.  return 
5fa0: 66 74 72 75 6e 63 61 74 65 28 69 64 2d 3e 66 64  ftruncate(id->fd
5fb0: 2c 20 6e 42 79 74 65 29 3d 3d 30 20 3f 20 53 51  , nByte)==0 ? SQ
5fc0: 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c 49 54 45  LITE_OK : SQLITE
5fd0: 5f 49 4f 45 52 52 3b 0a 23 65 6e 64 69 66 0a 23  _IOERR;.#endif.#
5fe0: 69 66 20 4f 53 5f 57 49 4e 0a 20 20 7b 0a 20 20  if OS_WIN.  {.  
5ff0: 20 20 4c 4f 4e 47 20 75 70 70 65 72 42 69 74 73    LONG upperBits
6000: 20 3d 20 6e 42 79 74 65 3e 3e 33 32 3b 0a 20 20   = nByte>>32;.  
6010: 20 20 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72    SetFilePointer
6020: 28 69 64 2d 3e 68 2c 20 6e 42 79 74 65 2c 20 26  (id->h, nByte, &
6030: 75 70 70 65 72 42 69 74 73 2c 20 46 49 4c 45 5f  upperBits, FILE_
6040: 42 45 47 49 4e 29 3b 0a 20 20 20 20 53 65 74 45  BEGIN);.    SetE
6050: 6e 64 4f 66 46 69 6c 65 28 69 64 2d 3e 68 29 3b  ndOfFile(id->h);
6060: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
6070: 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a  LITE_OK;.#endif.
6080: 23 69 66 20 4f 53 5f 4d 41 43 0a 23 20 69 66 64  #if OS_MAC.# ifd
6090: 65 66 20 5f 4c 41 52 47 45 5f 46 49 4c 45 0a 20  ef _LARGE_FILE. 
60a0: 20 69 66 28 20 46 53 53 65 74 46 6f 72 6b 53 69   if( FSSetForkSi
60b0: 7a 65 28 69 64 2d 3e 72 65 66 4e 75 6d 2c 20 66  ze(id->refNum, f
60c0: 73 46 72 6f 6d 53 74 61 72 74 2c 20 6e 42 79 74  sFromStart, nByt
60d0: 65 29 20 21 3d 20 6e 6f 45 72 72 29 7b 0a 23 20  e) != noErr){.# 
60e0: 65 6c 73 65 0a 20 20 69 66 28 20 53 65 74 45 4f  else.  if( SetEO
60f0: 46 28 69 64 2d 3e 72 65 66 4e 75 6d 2c 20 6e 42  F(id->refNum, nB
6100: 79 74 65 29 20 21 3d 20 6e 6f 45 72 72 20 29 7b  yte) != noErr ){
6110: 0a 23 20 65 6e 64 69 66 0a 20 20 20 20 72 65 74  .# endif.    ret
6120: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
6130: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
6140: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
6150: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  .  }.#endif.}../
6160: 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 74  *.** Determine t
6170: 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20  he current size 
6180: 6f 66 20 61 20 66 69 6c 65 20 69 6e 20 62 79 74  of a file in byt
6190: 65 73 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  es.*/.int sqlite
61a0: 4f 73 46 69 6c 65 53 69 7a 65 28 4f 73 46 69 6c  OsFileSize(OsFil
61b0: 65 20 2a 69 64 2c 20 6f 66 66 5f 74 20 2a 70 53  e *id, off_t *pS
61c0: 69 7a 65 29 7b 0a 23 69 66 20 4f 53 5f 55 4e 49  ize){.#if OS_UNI
61d0: 58 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20  X.  struct stat 
61e0: 62 75 66 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49  buf;.  SimulateI
61f0: 4f 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  OError(SQLITE_IO
6200: 45 52 52 29 3b 0a 20 20 69 66 28 20 66 73 74 61  ERR);.  if( fsta
6210: 74 28 69 64 2d 3e 66 64 2c 20 26 62 75 66 29 21  t(id->fd, &buf)!
6220: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
6230: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20   SQLITE_IOERR;. 
6240: 20 7d 0a 20 20 2a 70 53 69 7a 65 20 3d 20 62 75   }.  *pSize = bu
6250: 66 2e 73 74 5f 73 69 7a 65 3b 0a 20 20 72 65 74  f.st_size;.  ret
6260: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23  urn SQLITE_OK;.#
6270: 65 6e 64 69 66 0a 23 69 66 20 4f 53 5f 57 49 4e  endif.#if OS_WIN
6280: 0a 20 20 44 57 4f 52 44 20 75 70 70 65 72 42 69  .  DWORD upperBi
6290: 74 73 2c 20 6c 6f 77 65 72 42 69 74 73 3b 0a 20  ts, lowerBits;. 
62a0: 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
62b0: 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 3b 0a  (SQLITE_IOERR);.
62c0: 20 20 6c 6f 77 65 72 42 69 74 73 20 3d 20 47 65    lowerBits = Ge
62d0: 74 46 69 6c 65 53 69 7a 65 28 69 64 2d 3e 68 2c  tFileSize(id->h,
62e0: 20 26 75 70 70 65 72 42 69 74 73 29 3b 0a 20 20   &upperBits);.  
62f0: 2a 70 53 69 7a 65 20 3d 20 28 28 28 6f 66 66 5f  *pSize = (((off_
6300: 74 29 75 70 70 65 72 42 69 74 73 29 3c 3c 33 32  t)upperBits)<<32
6310: 29 20 2b 20 6c 6f 77 65 72 42 69 74 73 3b 0a 20  ) + lowerBits;. 
6320: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
6330: 4b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f 53  K;.#endif.#if OS
6340: 5f 4d 41 43 0a 23 20 69 66 64 65 66 20 5f 4c 41  _MAC.# ifdef _LA
6350: 52 47 45 5f 46 49 4c 45 0a 20 20 69 66 28 20 46  RGE_FILE.  if( F
6360: 53 47 65 74 46 6f 72 6b 53 69 7a 65 28 69 64 2d  SGetForkSize(id-
6370: 3e 72 65 66 4e 75 6d 2c 20 70 53 69 7a 65 29 20  >refNum, pSize) 
6380: 21 3d 20 6e 6f 45 72 72 29 7b 0a 23 20 65 6c 73  != noErr){.# els
6390: 65 0a 20 20 69 66 28 20 47 65 74 45 4f 46 28 69  e.  if( GetEOF(i
63a0: 64 2d 3e 72 65 66 4e 75 6d 2c 20 70 53 69 7a 65  d->refNum, pSize
63b0: 29 20 21 3d 20 6e 6f 45 72 72 20 29 7b 0a 23 20  ) != noErr ){.# 
63c0: 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e  endif.    return
63d0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20   SQLITE_IOERR;. 
63e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
63f0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
6400: 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23 69 66 20  }.#endif.}..#if 
6410: 4f 53 5f 57 49 4e 0a 2f 2a 0a 2a 2a 20 52 65 74  OS_WIN./*.** Ret
6420: 75 72 6e 20 74 72 75 65 20 28 6e 6f 6e 2d 7a 65  urn true (non-ze
6430: 72 6f 29 20 69 66 20 77 65 20 61 72 65 20 72 75  ro) if we are ru
6440: 6e 6e 69 6e 67 20 75 6e 64 65 72 20 57 69 6e 4e  nning under WinN
6450: 54 2c 20 57 69 6e 32 4b 20 6f 72 20 57 69 6e 58  T, Win2K or WinX
6460: 50 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 66 61 6c  P..** Return fal
6470: 73 65 20 28 7a 65 72 6f 29 20 66 6f 72 20 57 69  se (zero) for Wi
6480: 6e 39 35 2c 20 57 69 6e 39 38 2c 20 6f 72 20 57  n95, Win98, or W
6490: 69 6e 4d 45 2e 0a 2a 2a 0a 2a 2a 20 48 65 72 65  inME..**.** Here
64a0: 20 69 73 20 61 6e 20 69 6e 74 65 72 65 73 74 69   is an interesti
64b0: 6e 67 20 6f 62 73 65 72 76 61 74 69 6f 6e 3a 20  ng observation: 
64c0: 20 57 69 6e 39 35 2c 20 57 69 6e 39 38 2c 20 61   Win95, Win98, a
64d0: 6e 64 20 57 69 6e 4d 45 20 6c 61 63 6b 0a 2a 2a  nd WinME lack.**
64e0: 20 74 68 65 20 4c 6f 63 6b 46 69 6c 65 45 78 28   the LockFileEx(
64f0: 29 20 41 50 49 2e 20 20 42 75 74 20 77 65 20 63  ) API.  But we c
6500: 61 6e 20 73 74 69 6c 6c 20 73 74 61 74 69 63 61  an still statica
6510: 6c 6c 79 20 6c 69 6e 6b 20 61 67 61 69 6e 73 74  lly link against
6520: 20 74 68 61 74 0a 2a 2a 20 41 50 49 20 61 73 20   that.** API as 
6530: 6c 6f 6e 67 20 61 73 20 77 65 20 64 6f 6e 27 74  long as we don't
6540: 20 63 61 6c 6c 20 69 74 20 77 69 6e 20 72 75 6e   call it win run
6550: 6e 69 6e 67 20 57 69 6e 39 35 2f 39 38 2f 4d 45  ning Win95/98/ME
6560: 2e 20 20 41 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20  .  A call to.** 
6570: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
6580: 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e  used to determin
6590: 65 20 69 66 20 74 68 65 20 68 6f 73 74 20 69 73  e if the host is
65a0: 20 57 69 6e 39 35 2f 39 38 2f 4d 45 20 6f 72 0a   Win95/98/ME or.
65b0: 2a 2a 20 57 69 6e 4e 54 2f 32 4b 2f 58 50 20 73  ** WinNT/2K/XP s
65c0: 6f 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20 6b  o that we will k
65d0: 6e 6f 77 20 77 68 65 74 68 65 72 20 6f 72 20 6e  now whether or n
65e0: 6f 74 20 77 65 20 63 61 6e 20 73 61 66 65 6c 79  ot we can safely
65f0: 20 63 61 6c 6c 0a 2a 2a 20 74 68 65 20 4c 6f 63   call.** the Loc
6600: 6b 46 69 6c 65 45 78 28 29 20 41 50 49 2e 0a 2a  kFileEx() API..*
6610: 2f 0a 69 6e 74 20 69 73 4e 54 28 76 6f 69 64 29  /.int isNT(void)
6620: 7b 0a 20 20 73 74 61 74 69 63 20 6f 73 54 79 70  {.  static osTyp
6630: 65 20 3d 20 30 3b 20 20 20 2f 2a 20 30 3d 75 6e  e = 0;   /* 0=un
6640: 6b 6e 6f 77 6e 20 31 3d 77 69 6e 39 35 20 32 3d  known 1=win95 2=
6650: 77 69 6e 4e 54 20 2a 2f 0a 20 20 69 66 28 20 6f  winNT */.  if( o
6660: 73 54 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20  sType==0 ){.    
6670: 4f 53 56 45 52 53 49 4f 4e 49 4e 46 4f 20 73 49  OSVERSIONINFO sI
6680: 6e 66 6f 3b 0a 20 20 20 20 73 49 6e 66 6f 2e 64  nfo;.    sInfo.d
6690: 77 4f 53 56 65 72 73 69 6f 6e 49 6e 66 6f 53 69  wOSVersionInfoSi
66a0: 7a 65 20 3d 20 73 69 7a 65 6f 66 28 73 49 6e 66  ze = sizeof(sInf
66b0: 6f 29 3b 0a 20 20 20 20 47 65 74 56 65 72 73 69  o);.    GetVersi
66c0: 6f 6e 45 78 28 26 73 49 6e 66 6f 29 3b 0a 20 20  onEx(&sInfo);.  
66d0: 20 20 6f 73 54 79 70 65 20 3d 20 73 49 6e 66 6f    osType = sInfo
66e0: 2e 64 77 50 6c 61 74 66 6f 72 6d 49 64 3d 3d 56  .dwPlatformId==V
66f0: 45 52 5f 50 4c 41 54 46 4f 52 4d 5f 57 49 4e 33  ER_PLATFORM_WIN3
6700: 32 5f 4e 54 20 3f 20 32 20 3a 20 31 3b 0a 20 20  2_NT ? 2 : 1;.  
6710: 7d 0a 20 20 72 65 74 75 72 6e 20 6f 73 54 79 70  }.  return osTyp
6720: 65 3d 3d 32 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  e==2;.}.#endif..
6730: 2f 2a 0a 2a 2a 20 57 69 6e 64 6f 77 73 20 66 69  /*.** Windows fi
6740: 6c 65 20 6c 6f 63 6b 69 6e 67 20 6e 6f 74 65 73  le locking notes
6750: 3a 20 20 5b 73 69 6d 69 6c 61 72 20 69 73 73 75  :  [similar issu
6760: 65 73 20 61 70 70 6c 79 20 74 6f 20 4d 61 63 4f  es apply to MacO
6770: 53 5d 0a 2a 2a 0a 2a 2a 20 57 65 20 63 61 6e 6e  S].**.** We cann
6780: 6f 74 20 75 73 65 20 4c 6f 63 6b 46 69 6c 65 45  ot use LockFileE
6790: 78 28 29 20 6f 72 20 55 6e 6c 6f 63 6b 46 69 6c  x() or UnlockFil
67a0: 65 45 78 28 29 20 6f 6e 20 57 69 6e 39 35 2f 39  eEx() on Win95/9
67b0: 38 2f 4d 45 20 62 65 63 61 75 73 65 0a 2a 2a 20  8/ME because.** 
67c0: 74 68 6f 73 65 20 66 75 6e 63 74 69 6f 6e 73 20  those functions 
67d0: 61 72 65 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c  are not availabl
67e0: 65 2e 20 20 53 6f 20 77 65 20 75 73 65 20 6f 6e  e.  So we use on
67f0: 6c 79 20 4c 6f 63 6b 46 69 6c 65 28 29 20 61 6e  ly LockFile() an
6800: 64 0a 2a 2a 20 55 6e 6c 6f 63 6b 46 69 6c 65 28  d.** UnlockFile(
6810: 29 2e 0a 2a 2a 0a 2a 2a 20 4c 6f 63 6b 46 69 6c  )..**.** LockFil
6820: 65 28 29 20 70 72 65 76 65 6e 74 73 20 6e 6f 74  e() prevents not
6830: 20 6a 75 73 74 20 77 72 69 74 69 6e 67 20 62 75   just writing bu
6840: 74 20 61 6c 73 6f 20 72 65 61 64 69 6e 67 20 62  t also reading b
6850: 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65  y other processe
6860: 73 2e 0a 2a 2a 20 28 54 68 69 73 20 69 73 20 61  s..** (This is a
6870: 20 64 65 73 69 67 6e 20 65 72 72 6f 72 20 6f 6e   design error on
6880: 20 74 68 65 20 70 61 72 74 20 6f 66 20 57 69 6e   the part of Win
6890: 64 6f 77 73 2c 20 62 75 74 20 74 68 65 72 65 20  dows, but there 
68a0: 69 73 20 6e 6f 74 68 69 6e 67 0a 2a 2a 20 77 65  is nothing.** we
68b0: 20 63 61 6e 20 64 6f 20 61 62 6f 75 74 20 74 68   can do about th
68c0: 61 74 2e 29 20 20 53 6f 20 74 68 65 20 72 65 67  at.)  So the reg
68d0: 69 6f 6e 20 75 73 65 64 20 66 6f 72 20 6c 6f 63  ion used for loc
68e0: 6b 69 6e 67 20 69 73 20 61 74 20 74 68 65 0a 2a  king is at the.*
68f0: 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c  * end of the fil
6900: 65 20 77 68 65 72 65 20 69 74 20 69 73 20 75 6e  e where it is un
6910: 6c 69 6b 65 6c 79 20 74 6f 20 65 76 65 72 20 69  likely to ever i
6920: 6e 74 65 72 66 65 72 65 20 77 69 74 68 20 61 6e  nterfere with an
6930: 0a 2a 2a 20 61 63 74 75 61 6c 20 72 65 61 64 20  .** actual read 
6940: 61 74 74 65 6d 70 74 2e 0a 2a 2a 0a 2a 2a 20 41  attempt..**.** A
6950: 20 64 61 74 61 62 61 73 65 20 72 65 61 64 20 6c   database read l
6960: 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20  ock is obtained 
6970: 62 79 20 6c 6f 63 6b 69 6e 67 20 61 20 73 69 6e  by locking a sin
6980: 67 6c 65 20 72 61 6e 64 6f 6d 6c 79 2d 63 68 6f  gle randomly-cho
6990: 73 65 6e 20 0a 2a 2a 20 62 79 74 65 20 6f 75 74  sen .** byte out
69a0: 20 6f 66 20 61 20 73 70 65 63 69 66 69 63 20 72   of a specific r
69b0: 61 6e 67 65 20 6f 66 20 62 79 74 65 73 2e 20 54  ange of bytes. T
69c0: 68 65 20 6c 6f 63 6b 20 62 79 74 65 20 69 73 20  he lock byte is 
69d0: 6f 62 74 61 69 6e 65 64 20 61 74 20 0a 2a 2a 20  obtained at .** 
69e0: 72 61 6e 64 6f 6d 20 73 6f 20 74 77 6f 20 73 65  random so two se
69f0: 70 61 72 61 74 65 20 72 65 61 64 65 72 73 20 63  parate readers c
6a00: 61 6e 20 70 72 6f 62 61 62 6c 79 20 61 63 63 65  an probably acce
6a10: 73 73 20 74 68 65 20 66 69 6c 65 20 61 74 20 74  ss the file at t
6a20: 68 65 20 0a 2a 2a 20 73 61 6d 65 20 74 69 6d 65  he .** same time
6a30: 2c 20 75 6e 6c 65 73 73 20 74 68 65 79 20 61 72  , unless they ar
6a40: 65 20 75 6e 6c 75 63 6b 79 20 61 6e 64 20 63 68  e unlucky and ch
6a50: 6f 6f 73 65 20 74 68 65 20 73 61 6d 65 20 6c 6f  oose the same lo
6a60: 63 6b 20 62 79 74 65 2e 0a 2a 2a 20 41 20 64 61  ck byte..** A da
6a70: 74 61 62 61 73 65 20 77 72 69 74 65 20 6c 6f 63  tabase write loc
6a80: 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20 62 79  k is obtained by
6a90: 20 6c 6f 63 6b 69 6e 67 20 61 6c 6c 20 62 79 74   locking all byt
6aa0: 65 73 20 69 6e 20 74 68 65 20 72 61 6e 67 65 2e  es in the range.
6ab0: 0a 2a 2a 20 54 68 65 72 65 20 63 61 6e 20 6f 6e  .** There can on
6ac0: 6c 79 20 62 65 20 6f 6e 65 20 77 72 69 74 65 72  ly be one writer
6ad0: 2e 0a 2a 2a 0a 2a 2a 20 41 20 6c 6f 63 6b 20 69  ..**.** A lock i
6ae0: 73 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68  s obtained on th
6af0: 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20  e first byte of 
6b00: 74 68 65 20 6c 6f 63 6b 20 72 61 6e 67 65 20 62  the lock range b
6b10: 65 66 6f 72 65 20 61 63 71 75 69 72 69 6e 67 0a  efore acquiring.
6b20: 2a 2a 20 65 69 74 68 65 72 20 61 20 72 65 61 64  ** either a read
6b30: 20 6c 6f 63 6b 20 6f 72 20 61 20 77 72 69 74 65   lock or a write
6b40: 20 6c 6f 63 6b 2e 20 20 54 68 69 73 20 70 72 65   lock.  This pre
6b50: 76 65 6e 74 73 20 74 77 6f 20 70 72 6f 63 65 73  vents two proces
6b60: 73 65 73 20 66 72 6f 6d 0a 2a 2a 20 61 74 74 65  ses from.** atte
6b70: 6d 70 74 69 6e 67 20 74 6f 20 67 65 74 20 61 20  mpting to get a 
6b80: 6c 6f 63 6b 20 61 74 20 61 20 73 61 6d 65 20 74  lock at a same t
6b90: 69 6d 65 2e 20 20 54 68 65 20 73 65 6d 61 6e 74  ime.  The semant
6ba0: 69 63 73 20 6f 66 20 0a 2a 2a 20 73 71 6c 69 74  ics of .** sqlit
6bb0: 65 4f 73 52 65 61 64 4c 6f 63 6b 28 29 20 72 65  eOsReadLock() re
6bc0: 71 75 69 72 65 20 74 68 61 74 20 69 66 20 74 68  quire that if th
6bd0: 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61  ere is already a
6be0: 20 77 72 69 74 65 20 6c 6f 63 6b 2c 20 74 68 61   write lock, tha
6bf0: 74 0a 2a 2a 20 6c 6f 63 6b 20 69 73 20 63 6f 6e  t.** lock is con
6c00: 76 65 72 74 65 64 20 69 6e 74 6f 20 61 20 72 65  verted into a re
6c10: 61 64 20 6c 6f 63 6b 20 61 74 6f 6d 69 63 61 6c  ad lock atomical
6c20: 6c 79 2e 20 20 54 68 65 20 6c 6f 63 6b 20 6f 6e  ly.  The lock on
6c30: 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 62 79   the first.** by
6c40: 74 65 20 61 6c 6c 6f 77 73 20 75 73 20 74 6f 20  te allows us to 
6c50: 64 72 6f 70 20 74 68 65 20 6f 6c 64 20 77 72 69  drop the old wri
6c60: 74 65 20 6c 6f 63 6b 20 61 6e 64 20 67 65 74 20  te lock and get 
6c70: 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 20 77 69  the read lock wi
6c80: 74 68 6f 75 74 0a 2a 2a 20 61 6e 6f 74 68 65 72  thout.** another
6c90: 20 70 72 6f 63 65 73 73 20 6a 75 6d 70 69 6e 67   process jumping
6ca0: 20 69 6e 74 6f 20 74 68 65 20 6d 69 64 64 6c 65   into the middle
6cb0: 20 61 6e 64 20 6d 65 73 73 69 6e 67 20 75 73 20   and messing us 
6cc0: 75 70 2e 20 20 54 68 65 20 73 61 6d 65 0a 2a 2a  up.  The same.**
6cd0: 20 61 72 67 75 6d 65 6e 74 20 61 70 70 6c 69 65   argument applie
6ce0: 73 20 74 6f 20 73 71 6c 69 74 65 4f 73 57 72 69  s to sqliteOsWri
6cf0: 74 65 4c 6f 63 6b 28 29 2e 0a 2a 2a 0a 2a 2a 20  teLock()..**.** 
6d00: 4f 6e 20 57 69 6e 4e 54 2f 32 4b 2f 58 50 20 73  On WinNT/2K/XP s
6d10: 79 73 74 65 6d 73 2c 20 4c 6f 63 6b 46 69 6c 65  ystems, LockFile
6d20: 45 78 28 29 20 61 6e 64 20 55 6e 6c 6f 63 6b 46  Ex() and UnlockF
6d30: 69 6c 65 45 78 28 29 20 61 72 65 20 61 76 61 69  ileEx() are avai
6d40: 6c 61 62 6c 65 2c 0a 2a 2a 20 77 68 69 63 68 20  lable,.** which 
6d50: 6d 65 61 6e 73 20 77 65 20 63 61 6e 20 75 73 65  means we can use
6d60: 20 72 65 61 64 65 72 2f 77 72 69 74 65 72 20 6c   reader/writer l
6d70: 6f 63 6b 73 2e 20 20 57 68 65 6e 20 72 65 61 64  ocks.  When read
6d80: 65 72 20 77 72 69 74 65 72 20 6c 6f 63 6b 73 0a  er writer locks.
6d90: 2a 2a 20 61 72 65 20 75 73 65 64 2c 20 74 68 65  ** are used, the
6da0: 20 6c 6f 63 6b 20 69 73 20 70 6c 61 63 65 64 20   lock is placed 
6db0: 6f 6e 20 74 68 65 20 73 61 6d 65 20 72 61 6e 67  on the same rang
6dc0: 65 20 6f 66 20 62 79 74 65 73 20 74 68 61 74 20  e of bytes that 
6dd0: 69 73 20 75 73 65 64 0a 2a 2a 20 66 6f 72 20 70  is used.** for p
6de0: 72 6f 62 61 62 69 6c 69 73 74 69 63 20 6c 6f 63  robabilistic loc
6df0: 6b 69 6e 67 20 69 6e 20 57 69 6e 39 35 2f 39 38  king in Win95/98
6e00: 2f 4d 45 2e 20 20 48 65 6e 63 65 2c 20 74 68 65  /ME.  Hence, the
6e10: 20 6c 6f 63 6b 69 6e 67 20 73 63 68 65 6d 65 0a   locking scheme.
6e20: 2a 2a 20 77 69 6c 6c 20 73 75 70 70 6f 72 74 20  ** will support 
6e30: 74 77 6f 20 6f 72 20 6d 6f 72 65 20 57 69 6e 39  two or more Win9
6e40: 35 20 72 65 61 64 65 72 73 20 6f 72 20 74 77 6f  5 readers or two
6e50: 20 6f 72 20 6d 6f 72 65 20 57 69 6e 4e 54 20 72   or more WinNT r
6e60: 65 61 64 65 72 73 2e 0a 2a 2a 20 42 75 74 20 61  eaders..** But a
6e70: 20 73 69 6e 67 6c 65 20 57 69 6e 39 35 20 72 65   single Win95 re
6e80: 61 64 65 72 20 77 69 6c 6c 20 6c 6f 63 6b 20 6f  ader will lock o
6e90: 75 74 20 61 6c 6c 20 57 69 6e 4e 54 20 72 65 61  ut all WinNT rea
6ea0: 64 65 72 73 20 61 6e 64 20 61 20 73 69 6e 67 6c  ders and a singl
6eb0: 65 0a 2a 2a 20 57 69 6e 4e 54 20 72 65 61 64 65  e.** WinNT reade
6ec0: 72 20 77 69 6c 6c 20 6c 6f 63 6b 20 6f 75 74 20  r will lock out 
6ed0: 61 6c 6c 20 6f 74 68 65 72 20 57 69 6e 39 35 20  all other Win95 
6ee0: 72 65 61 64 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 4e  readers..**.** N
6ef0: 6f 74 65 3a 20 4f 6e 20 4d 61 63 4f 53 20 77 65  ote: On MacOS we
6f00: 20 75 73 65 20 74 68 65 20 72 65 73 6f 75 72 63   use the resourc
6f10: 65 20 66 6f 72 6b 20 66 6f 72 20 6c 6f 63 6b 69  e fork for locki
6f20: 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  ng..**.** The fo
6f30: 6c 6c 6f 77 69 6e 67 20 23 64 65 66 69 6e 65 73  llowing #defines
6f40: 20 73 70 65 63 69 66 79 20 74 68 65 20 72 61 6e   specify the ran
6f50: 67 65 20 6f 66 20 62 79 74 65 73 20 75 73 65 64  ge of bytes used
6f60: 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2a   for locking..**
6f70: 20 4e 5f 4c 4f 43 4b 42 59 54 45 20 69 73 20 74   N_LOCKBYTE is t
6f80: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
6f90: 65 73 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72  es available for
6fa0: 20 64 6f 69 6e 67 20 74 68 65 20 6c 6f 63 6b 69   doing the locki
6fb0: 6e 67 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  ng..** The first
6fc0: 20 62 79 74 65 20 75 73 65 64 20 74 6f 20 68 6f   byte used to ho
6fd0: 6c 64 20 74 68 65 20 6c 6f 63 6b 20 77 68 69 6c  ld the lock whil
6fe0: 65 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 63 68  e the lock is ch
6ff0: 61 6e 67 69 6e 67 20 64 6f 65 73 0a 2a 2a 20 6e  anging does.** n
7000: 6f 74 20 63 6f 75 6e 74 20 74 6f 77 61 72 64 20  ot count toward 
7010: 74 68 69 73 20 6e 75 6d 62 65 72 2e 20 20 46 49  this number.  FI
7020: 52 53 54 5f 4c 4f 43 4b 42 59 54 45 20 69 73 20  RST_LOCKBYTE is 
7030: 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 0a 2a  the address of.*
7040: 2a 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65  * the first byte
7050: 20 69 6e 20 74 68 65 20 72 61 6e 67 65 20 6f 66   in the range of
7060: 20 62 79 74 65 73 20 75 73 65 64 20 66 6f 72 20   bytes used for 
7070: 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 23 64 65 66  locking..*/.#def
7080: 69 6e 65 20 4e 5f 4c 4f 43 4b 42 59 54 45 20 20  ine N_LOCKBYTE  
7090: 20 20 20 20 20 31 30 32 33 39 0a 23 69 66 20 4f       10239.#if O
70a0: 53 5f 4d 41 43 0a 23 20 64 65 66 69 6e 65 20 46  S_MAC.# define F
70b0: 49 52 53 54 5f 4c 4f 43 4b 42 59 54 45 20 20 20  IRST_LOCKBYTE   
70c0: 28 30 78 30 30 30 66 66 66 66 66 20 2d 20 4e 5f  (0x000fffff - N_
70d0: 4c 4f 43 4b 42 59 54 45 29 0a 23 65 6c 73 65 0a  LOCKBYTE).#else.
70e0: 23 20 64 65 66 69 6e 65 20 46 49 52 53 54 5f 4c  # define FIRST_L
70f0: 4f 43 4b 42 59 54 45 20 20 20 28 30 78 66 66 66  OCKBYTE   (0xfff
7100: 66 66 66 66 66 20 2d 20 4e 5f 4c 4f 43 4b 42 59  fffff - N_LOCKBY
7110: 54 45 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  TE).#endif../*.*
7120: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 73 74 61  * Change the sta
7130: 74 75 73 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20  tus of the lock 
7140: 6f 6e 20 74 68 65 20 66 69 6c 65 20 22 69 64 22  on the file "id"
7150: 20 74 6f 20 62 65 20 61 20 72 65 61 64 6c 6f 63   to be a readloc
7160: 6b 2e 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c  k..** If the fil
7170: 65 20 77 61 73 20 77 72 69 74 65 20 6c 6f 63 6b  e was write lock
7180: 65 64 2c 20 74 68 65 6e 20 74 68 69 73 20 72 65  ed, then this re
7190: 64 75 63 65 73 20 74 68 65 20 6c 6f 63 6b 20 74  duces the lock t
71a0: 6f 20 61 20 72 65 61 64 2e 0a 2a 2a 20 49 66 20  o a read..** If 
71b0: 74 68 65 20 66 69 6c 65 20 77 61 73 20 72 65 61  the file was rea
71c0: 64 20 6c 6f 63 6b 65 64 2c 20 74 68 65 6e 20 74  d locked, then t
71d0: 68 69 73 20 61 63 71 75 69 72 65 73 20 61 20 6e  his acquires a n
71e0: 65 77 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2a  ew read lock..**
71f0: 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
7200: 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20  E_OK on success 
7210: 61 6e 64 20 53 51 4c 49 54 45 5f 42 55 53 59 20  and SQLITE_BUSY 
7220: 6f 6e 20 66 61 69 6c 75 72 65 2e 20 20 49 66 20  on failure.  If 
7230: 74 68 69 73 0a 2a 2a 20 6c 69 62 72 61 72 79 20  this.** library 
7240: 77 61 73 20 63 6f 6d 70 69 6c 65 64 20 77 69 74  was compiled wit
7250: 68 20 6c 61 72 67 65 20 66 69 6c 65 20 73 75 70  h large file sup
7260: 70 6f 72 74 20 28 4c 46 53 29 20 62 75 74 20 4c  port (LFS) but L
7270: 46 53 20 69 73 20 6e 6f 74 0a 2a 2a 20 61 76 61  FS is not.** ava
7280: 69 6c 61 62 6c 65 20 6f 6e 20 74 68 65 20 68 6f  ilable on the ho
7290: 73 74 2c 20 74 68 65 6e 20 61 6e 20 53 51 4c 49  st, then an SQLI
72a0: 54 45 5f 4e 4f 4c 46 53 20 69 73 20 72 65 74 75  TE_NOLFS is retu
72b0: 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rned..*/.int sql
72c0: 69 74 65 4f 73 52 65 61 64 4c 6f 63 6b 28 4f 73  iteOsReadLock(Os
72d0: 46 69 6c 65 20 2a 69 64 29 7b 0a 23 69 66 20 4f  File *id){.#if O
72e0: 53 5f 55 4e 49 58 0a 20 20 69 6e 74 20 72 63 3b  S_UNIX.  int rc;
72f0: 0a 20 20 73 71 6c 69 74 65 4f 73 45 6e 74 65 72  .  sqliteOsEnter
7300: 4d 75 74 65 78 28 29 3b 0a 20 20 69 66 28 20 69  Mutex();.  if( i
7310: 64 2d 3e 70 4c 6f 63 6b 2d 3e 63 6e 74 3e 30 20  d->pLock->cnt>0 
7320: 29 7b 0a 20 20 20 20 69 66 28 20 21 69 64 2d 3e  ){.    if( !id->
7330: 6c 6f 63 6b 65 64 20 29 7b 0a 20 20 20 20 20 20  locked ){.      
7340: 69 64 2d 3e 70 4c 6f 63 6b 2d 3e 63 6e 74 2b 2b  id->pLock->cnt++
7350: 3b 0a 20 20 20 20 20 20 69 64 2d 3e 6c 6f 63 6b  ;.      id->lock
7360: 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ed = 1;.    }.  
7370: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
7380: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69 64  ;.  }else if( id
7390: 2d 3e 6c 6f 63 6b 65 64 20 7c 7c 20 69 64 2d 3e  ->locked || id->
73a0: 70 4c 6f 63 6b 2d 3e 63 6e 74 3d 3d 30 20 29 7b  pLock->cnt==0 ){
73b0: 0a 20 20 20 20 73 74 72 75 63 74 20 66 6c 6f 63  .    struct floc
73c0: 6b 20 6c 6f 63 6b 3b 0a 20 20 20 20 69 6e 74 20  k lock;.    int 
73d0: 73 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79  s;.    lock.l_ty
73e0: 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20  pe = F_RDLCK;.  
73f0: 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20    lock.l_whence 
7400: 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20  = SEEK_SET;.    
7410: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 6c  lock.l_start = l
7420: 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 30 4c 3b 0a  ock.l_len = 0L;.
7430: 20 20 20 20 73 20 3d 20 66 63 6e 74 6c 28 69 64      s = fcntl(id
7440: 2d 3e 66 64 2c 20 46 5f 53 45 54 4c 4b 2c 20 26  ->fd, F_SETLK, &
7450: 6c 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28 20 73  lock);.    if( s
7460: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  !=0 ){.      rc 
7470: 3d 20 28 65 72 72 6e 6f 3d 3d 45 49 4e 56 41 4c  = (errno==EINVAL
7480: 29 20 3f 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53  ) ? SQLITE_NOLFS
7490: 20 3a 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   : SQLITE_BUSY;.
74a0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
74b0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
74c0: 0a 20 20 20 20 20 20 69 64 2d 3e 70 4c 6f 63 6b  .      id->pLock
74d0: 2d 3e 63 6e 74 20 3d 20 31 3b 0a 20 20 20 20 20  ->cnt = 1;.     
74e0: 20 69 64 2d 3e 6c 6f 63 6b 65 64 20 3d 20 31 3b   id->locked = 1;
74f0: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
7500: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
7510: 42 55 53 59 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  BUSY;.  }.  sqli
7520: 74 65 4f 73 4c 65 61 76 65 4d 75 74 65 78 28 29  teOsLeaveMutex()
7530: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23  ;.  return rc;.#
7540: 65 6e 64 69 66 0a 23 69 66 20 4f 53 5f 57 49 4e  endif.#if OS_WIN
7550: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28  .  int rc;.  if(
7560: 20 69 64 2d 3e 6c 6f 63 6b 65 64 3e 30 20 29 7b   id->locked>0 ){
7570: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
7580: 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _OK;.  }else{.  
7590: 20 20 69 6e 74 20 6c 6b 20 3d 20 28 73 71 6c 69    int lk = (sqli
75a0: 74 65 52 61 6e 64 6f 6d 49 6e 74 65 67 65 72 28  teRandomInteger(
75b0: 29 20 26 20 30 78 37 66 66 66 66 66 66 29 25 4e  ) & 0x7ffffff)%N
75c0: 5f 4c 4f 43 4b 42 59 54 45 2b 31 3b 0a 20 20 20  _LOCKBYTE+1;.   
75d0: 20 69 6e 74 20 72 65 73 3b 0a 20 20 20 20 69 6e   int res;.    in
75e0: 74 20 63 6e 74 20 3d 20 31 30 30 3b 0a 20 20 20  t cnt = 100;.   
75f0: 20 77 68 69 6c 65 28 20 63 6e 74 2d 2d 3e 30 20   while( cnt-->0 
7600: 26 26 20 28 72 65 73 20 3d 20 4c 6f 63 6b 46 69  && (res = LockFi
7610: 6c 65 28 69 64 2d 3e 68 2c 20 46 49 52 53 54 5f  le(id->h, FIRST_
7620: 4c 4f 43 4b 42 59 54 45 2c 20 30 2c 20 31 2c 20  LOCKBYTE, 0, 1, 
7630: 30 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  0))==0 ){.      
7640: 53 6c 65 65 70 28 31 29 3b 0a 20 20 20 20 7d 0a  Sleep(1);.    }.
7650: 20 20 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20      if( res ){. 
7660: 20 20 20 20 20 55 6e 6c 6f 63 6b 46 69 6c 65 28       UnlockFile(
7670: 69 64 2d 3e 68 2c 20 46 49 52 53 54 5f 4c 4f 43  id->h, FIRST_LOC
7680: 4b 42 59 54 45 2b 31 2c 20 30 2c 20 4e 5f 4c 4f  KBYTE+1, 0, N_LO
7690: 43 4b 42 59 54 45 2c 20 30 29 3b 0a 20 20 20 20  CKBYTE, 0);.    
76a0: 20 20 69 66 28 20 69 73 4e 54 28 29 20 29 7b 0a    if( isNT() ){.
76b0: 20 20 20 20 20 20 20 20 4f 56 45 52 4c 41 50 50          OVERLAPP
76c0: 45 44 20 6f 76 6c 70 3b 0a 20 20 20 20 20 20 20  ED ovlp;.       
76d0: 20 6f 76 6c 70 2e 4f 66 66 73 65 74 20 3d 20 46   ovlp.Offset = F
76e0: 49 52 53 54 5f 4c 4f 43 4b 42 59 54 45 2b 31 3b  IRST_LOCKBYTE+1;
76f0: 0a 20 20 20 20 20 20 20 20 6f 76 6c 70 2e 4f 66  .        ovlp.Of
7700: 66 73 65 74 48 69 67 68 20 3d 20 30 3b 0a 20 20  fsetHigh = 0;.  
7710: 20 20 20 20 20 20 6f 76 6c 70 2e 68 45 76 65 6e        ovlp.hEven
7720: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72  t = 0;.        r
7730: 65 73 20 3d 20 4c 6f 63 6b 46 69 6c 65 45 78 28  es = LockFileEx(
7740: 69 64 2d 3e 68 2c 20 4c 4f 43 4b 46 49 4c 45 5f  id->h, LOCKFILE_
7750: 46 41 49 4c 5f 49 4d 4d 45 44 49 41 54 45 4c 59  FAIL_IMMEDIATELY
7760: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
7770: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20               0, 
7780: 4e 5f 4c 4f 43 4b 42 59 54 45 2c 20 30 2c 20 26  N_LOCKBYTE, 0, &
7790: 6f 76 6c 70 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ovlp);.      }el
77a0: 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65 73 20  se{.        res 
77b0: 3d 20 4c 6f 63 6b 46 69 6c 65 28 69 64 2d 3e 68  = LockFile(id->h
77c0: 2c 20 46 49 52 53 54 5f 4c 4f 43 4b 42 59 54 45  , FIRST_LOCKBYTE
77d0: 2b 6c 6b 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20  +lk, 0, 1, 0);. 
77e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 55 6e 6c       }.      Unl
77f0: 6f 63 6b 46 69 6c 65 28 69 64 2d 3e 68 2c 20 46  ockFile(id->h, F
7800: 49 52 53 54 5f 4c 4f 43 4b 42 59 54 45 2c 20 30  IRST_LOCKBYTE, 0
7810: 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  , 1, 0);.    }. 
7820: 20 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20     if( res ){.  
7830: 20 20 20 20 69 64 2d 3e 6c 6f 63 6b 65 64 20 3d      id->locked =
7840: 20 6c 6b 3b 0a 20 20 20 20 20 20 72 63 20 3d 20   lk;.      rc = 
7850: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
7860: 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
7870: 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
7880: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
7890: 20 72 63 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20   rc;.#endif.#if 
78a0: 4f 53 5f 4d 41 43 0a 20 20 69 6e 74 20 72 63 3b  OS_MAC.  int rc;
78b0: 0a 20 20 69 66 28 20 69 64 2d 3e 6c 6f 63 6b 65  .  if( id->locke
78c0: 64 3e 30 20 7c 7c 20 69 64 2d 3e 72 65 66 4e 75  d>0 || id->refNu
78d0: 6d 52 46 20 3d 3d 20 2d 31 20 29 7b 0a 20 20 20  mRF == -1 ){.   
78e0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
78f0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
7900: 74 20 6c 6b 20 3d 20 28 73 71 6c 69 74 65 52 61  t lk = (sqliteRa
7910: 6e 64 6f 6d 49 6e 74 65 67 65 72 28 29 20 26 20  ndomInteger() & 
7920: 30 78 37 66 66 66 66 66 66 29 25 4e 5f 4c 4f 43  0x7ffffff)%N_LOC
7930: 4b 42 59 54 45 2b 31 3b 0a 20 20 20 20 4f 53 45  KBYTE+1;.    OSE
7940: 72 72 20 72 65 73 3b 0a 20 20 20 20 69 6e 74 20  rr res;.    int 
7950: 63 6e 74 20 3d 20 35 3b 0a 20 20 20 20 50 61 72  cnt = 5;.    Par
7960: 61 6d 42 6c 6f 63 6b 52 65 63 20 70 61 72 61 6d  amBlockRec param
7970: 73 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 70  s;.    memset(&p
7980: 61 72 61 6d 73 2c 20 30 2c 20 73 69 7a 65 6f 66  arams, 0, sizeof
7990: 28 70 61 72 61 6d 73 29 29 3b 0a 20 20 20 20 70  (params));.    p
79a0: 61 72 61 6d 73 2e 69 6f 50 61 72 61 6d 2e 69 6f  arams.ioParam.io
79b0: 52 65 66 4e 75 6d 20 3d 20 69 64 2d 3e 72 65 66  RefNum = id->ref
79c0: 4e 75 6d 52 46 3b 0a 20 20 20 20 70 61 72 61 6d  NumRF;.    param
79d0: 73 2e 69 6f 50 61 72 61 6d 2e 69 6f 50 6f 73 4d  s.ioParam.ioPosM
79e0: 6f 64 65 20 3d 20 66 73 46 72 6f 6d 53 74 61 72  ode = fsFromStar
79f0: 74 3b 0a 20 20 20 20 70 61 72 61 6d 73 2e 69 6f  t;.    params.io
7a00: 50 61 72 61 6d 2e 69 6f 50 6f 73 4f 66 66 73 65  Param.ioPosOffse
7a10: 74 20 3d 20 46 49 52 53 54 5f 4c 4f 43 4b 42 59  t = FIRST_LOCKBY
7a20: 54 45 3b 0a 20 20 20 20 70 61 72 61 6d 73 2e 69  TE;.    params.i
7a30: 6f 50 61 72 61 6d 2e 69 6f 52 65 71 43 6f 75 6e  oParam.ioReqCoun
7a40: 74 20 3d 20 31 3b 0a 20 20 20 20 77 68 69 6c 65  t = 1;.    while
7a50: 28 20 63 6e 74 2d 2d 3e 30 20 26 26 20 28 72 65  ( cnt-->0 && (re
7a60: 73 20 3d 20 50 42 4c 6f 63 6b 52 61 6e 67 65 53  s = PBLockRangeS
7a70: 79 6e 63 28 26 70 61 72 61 6d 73 29 29 21 3d 6e  ync(&params))!=n
7a80: 6f 45 72 72 20 29 7b 0a 20 20 20 20 20 20 55 49  oErr ){.      UI
7a90: 6e 74 33 32 20 66 69 6e 61 6c 54 69 63 6b 73 3b  nt32 finalTicks;
7aa0: 0a 20 20 20 20 20 20 44 65 6c 61 79 28 31 2c 20  .      Delay(1, 
7ab0: 26 66 69 6e 61 6c 54 69 63 6b 73 29 3b 20 2f 2a  &finalTicks); /*
7ac0: 20 31 2f 36 30 20 73 65 63 20 2a 2f 0a 20 20 20   1/60 sec */.   
7ad0: 20 7d 0a 20 20 20 20 69 66 28 20 72 65 73 20 3d   }.    if( res =
7ae0: 3d 20 6e 6f 45 72 72 20 29 7b 0a 20 20 20 20 20  = noErr ){.     
7af0: 20 70 61 72 61 6d 73 2e 69 6f 50 61 72 61 6d 2e   params.ioParam.
7b00: 69 6f 50 6f 73 4f 66 66 73 65 74 20 3d 20 46 49  ioPosOffset = FI
7b10: 52 53 54 5f 4c 4f 43 4b 42 59 54 45 2b 31 3b 0a  RST_LOCKBYTE+1;.
7b20: 20 20 20 20 20 20 70 61 72 61 6d 73 2e 69 6f 50        params.ioP
7b30: 61 72 61 6d 2e 69 6f 52 65 71 43 6f 75 6e 74 20  aram.ioReqCount 
7b40: 3d 20 4e 5f 4c 4f 43 4b 42 59 54 45 3b 0a 20 20  = N_LOCKBYTE;.  
7b50: 20 20 20 20 50 42 55 6e 6c 6f 63 6b 52 61 6e 67      PBUnlockRang
7b60: 65 53 79 6e 63 28 26 70 61 72 61 6d 73 29 3b 0a  eSync(&params);.
7b70: 20 20 20 20 20 20 70 61 72 61 6d 73 2e 69 6f 50        params.ioP
7b80: 61 72 61 6d 2e 69 6f 50 6f 73 4f 66 66 73 65 74  aram.ioPosOffset
7b90: 20 3d 20 46 49 52 53 54 5f 4c 4f 43 4b 42 59 54   = FIRST_LOCKBYT
7ba0: 45 2b 6c 6b 3b 0a 20 20 20 20 20 20 70 61 72 61  E+lk;.      para
7bb0: 6d 73 2e 69 6f 50 61 72 61 6d 2e 69 6f 52 65 71  ms.ioParam.ioReq
7bc0: 43 6f 75 6e 74 20 3d 20 31 3b 0a 20 20 20 20 20  Count = 1;.     
7bd0: 20 72 65 73 20 3d 20 50 42 4c 6f 63 6b 52 61 6e   res = PBLockRan
7be0: 67 65 53 79 6e 63 28 26 70 61 72 61 6d 73 29 3b  geSync(&params);
7bf0: 0a 20 20 20 20 20 20 70 61 72 61 6d 73 2e 69 6f  .      params.io
7c00: 50 61 72 61 6d 2e 69 6f 50 6f 73 4f 66 66 73 65  Param.ioPosOffse
7c10: 74 20 3d 20 46 49 52 53 54 5f 4c 4f 43 4b 42 59  t = FIRST_LOCKBY
7c20: 54 45 3b 0a 20 20 20 20 20 20 70 61 72 61 6d 73  TE;.      params
7c30: 2e 69 6f 50 61 72 61 6d 2e 69 6f 52 65 71 43 6f  .ioParam.ioReqCo
7c40: 75 6e 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 50  unt = 1;.      P
7c50: 42 55 6e 6c 6f 63 6b 52 61 6e 67 65 53 79 6e 63  BUnlockRangeSync
7c60: 28 26 70 61 72 61 6d 73 29 3b 0a 20 20 20 20 7d  (&params);.    }
7c70: 0a 20 20 20 20 69 66 28 20 72 65 73 20 3d 3d 20  .    if( res == 
7c80: 6e 6f 45 72 72 20 29 7b 0a 20 20 20 20 20 20 69  noErr ){.      i
7c90: 64 2d 3e 6c 6f 63 6b 65 64 20 3d 20 6c 6b 3b 0a  d->locked = lk;.
7ca0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
7cb0: 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  E_OK;.    }else{
7cc0: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
7cd0: 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20  TE_BUSY;.    }. 
7ce0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
7cf0: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
7d00: 43 68 61 6e 67 65 20 74 68 65 20 6c 6f 63 6b 20  Change the lock 
7d10: 73 74 61 74 75 73 20 74 6f 20 62 65 20 61 6e 20  status to be an 
7d20: 65 78 63 6c 75 73 69 76 65 20 6f 72 20 77 72 69  exclusive or wri
7d30: 74 65 20 6c 6f 63 6b 2e 20 20 52 65 74 75 72 6e  te lock.  Return
7d40: 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  .** SQLITE_OK on
7d50: 20 73 75 63 63 65 73 73 20 61 6e 64 20 53 51 4c   success and SQL
7d60: 49 54 45 5f 42 55 53 59 20 6f 6e 20 61 20 66 61  ITE_BUSY on a fa
7d70: 69 6c 75 72 65 2e 20 20 49 66 20 74 68 69 73 0a  ilure.  If this.
7d80: 2a 2a 20 6c 69 62 72 61 72 79 20 77 61 73 20 63  ** library was c
7d90: 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 6c 61 72  ompiled with lar
7da0: 67 65 20 66 69 6c 65 20 73 75 70 70 6f 72 74 20  ge file support 
7db0: 28 4c 46 53 29 20 62 75 74 20 4c 46 53 20 69 73  (LFS) but LFS is
7dc0: 20 6e 6f 74 0a 2a 2a 20 61 76 61 69 6c 61 62 6c   not.** availabl
7dd0: 65 20 6f 6e 20 74 68 65 20 68 6f 73 74 2c 20 74  e on the host, t
7de0: 68 65 6e 20 61 6e 20 53 51 4c 49 54 45 5f 4e 4f  hen an SQLITE_NO
7df0: 4c 46 53 20 69 73 20 72 65 74 75 72 6e 65 64 2e  LFS is returned.
7e00: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 4f 73  .*/.int sqliteOs
7e10: 57 72 69 74 65 4c 6f 63 6b 28 4f 73 46 69 6c 65  WriteLock(OsFile
7e20: 20 2a 69 64 29 7b 0a 23 69 66 20 4f 53 5f 55 4e   *id){.#if OS_UN
7e30: 49 58 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  IX.  int rc;.  s
7e40: 71 6c 69 74 65 4f 73 45 6e 74 65 72 4d 75 74 65  qliteOsEnterMute
7e50: 78 28 29 3b 0a 20 20 69 66 28 20 69 64 2d 3e 70  x();.  if( id->p
7e60: 4c 6f 63 6b 2d 3e 63 6e 74 3d 3d 30 20 7c 7c 20  Lock->cnt==0 || 
7e70: 28 69 64 2d 3e 70 4c 6f 63 6b 2d 3e 63 6e 74 3d  (id->pLock->cnt=
7e80: 3d 31 20 26 26 20 69 64 2d 3e 6c 6f 63 6b 65 64  =1 && id->locked
7e90: 3d 3d 31 29 20 29 7b 0a 20 20 20 20 73 74 72 75  ==1) ){.    stru
7ea0: 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20  ct flock lock;. 
7eb0: 20 20 20 69 6e 74 20 73 3b 0a 20 20 20 20 6c 6f     int s;.    lo
7ec0: 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52  ck.l_type = F_WR
7ed0: 4c 43 4b 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  LCK;.    lock.l_
7ee0: 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
7ef0: 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74  T;.    lock.l_st
7f00: 61 72 74 20 3d 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e  art = lock.l_len
7f10: 20 3d 20 30 4c 3b 0a 20 20 20 20 73 20 3d 20 66   = 0L;.    s = f
7f20: 63 6e 74 6c 28 69 64 2d 3e 66 64 2c 20 46 5f 53  cntl(id->fd, F_S
7f30: 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3b 0a 20 20  ETLK, &lock);.  
7f40: 20 20 69 66 28 20 73 21 3d 30 20 29 7b 0a 20 20    if( s!=0 ){.  
7f50: 20 20 20 20 72 63 20 3d 20 28 65 72 72 6e 6f 3d      rc = (errno=
7f60: 3d 45 49 4e 56 41 4c 29 20 3f 20 53 51 4c 49 54  =EINVAL) ? SQLIT
7f70: 45 5f 4e 4f 4c 46 53 20 3a 20 53 51 4c 49 54 45  E_NOLFS : SQLITE
7f80: 5f 42 55 53 59 3b 0a 20 20 20 20 7d 65 6c 73 65  _BUSY;.    }else
7f90: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
7fa0: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69 64  ITE_OK;.      id
7fb0: 2d 3e 70 4c 6f 63 6b 2d 3e 63 6e 74 20 3d 20 2d  ->pLock->cnt = -
7fc0: 31 3b 0a 20 20 20 20 20 20 69 64 2d 3e 6c 6f 63  1;.      id->loc
7fd0: 6b 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  ked = 1;.    }. 
7fe0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
7ff0: 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
8000: 7d 0a 20 20 73 71 6c 69 74 65 4f 73 4c 65 61 76  }.  sqliteOsLeav
8010: 65 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74 75  eMutex();.  retu
8020: 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 23 69  rn rc;.#endif.#i
8030: 66 20 4f 53 5f 57 49 4e 0a 20 20 69 6e 74 20 72  f OS_WIN.  int r
8040: 63 3b 0a 20 20 69 66 28 20 69 64 2d 3e 6c 6f 63  c;.  if( id->loc
8050: 6b 65 64 3c 30 20 29 7b 0a 20 20 20 20 72 63 20  ked<0 ){.    rc 
8060: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  = SQLITE_OK;.  }
8070: 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72 65  else{.    int re
8080: 73 3b 0a 20 20 20 20 69 6e 74 20 63 6e 74 20 3d  s;.    int cnt =
8090: 20 31 30 30 3b 0a 20 20 20 20 77 68 69 6c 65 28   100;.    while(
80a0: 20 63 6e 74 2d 2d 3e 30 20 26 26 20 28 72 65 73   cnt-->0 && (res
80b0: 20 3d 20 4c 6f 63 6b 46 69 6c 65 28 69 64 2d 3e   = LockFile(id->
80c0: 68 2c 20 46 49 52 53 54 5f 4c 4f 43 4b 42 59 54  h, FIRST_LOCKBYT
80d0: 45 2c 20 30 2c 20 31 2c 20 30 29 29 3d 3d 30 20  E, 0, 1, 0))==0 
80e0: 29 7b 0a 20 20 20 20 20 20 53 6c 65 65 70 28 31  ){.      Sleep(1
80f0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
8100: 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20 69 66   res ){.      if
8110: 28 20 69 64 2d 3e 6c 6f 63 6b 65 64 3e 30 20 29  ( id->locked>0 )
8120: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 73  {.        if( is
8130: 4e 54 28 29 20 29 7b 0a 20 20 20 20 20 20 20 20  NT() ){.        
8140: 20 20 55 6e 6c 6f 63 6b 46 69 6c 65 28 69 64 2d    UnlockFile(id-
8150: 3e 68 2c 20 46 49 52 53 54 5f 4c 4f 43 4b 42 59  >h, FIRST_LOCKBY
8160: 54 45 2b 31 2c 20 30 2c 20 4e 5f 4c 4f 43 4b 42  TE+1, 0, N_LOCKB
8170: 59 54 45 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  YTE, 0);.       
8180: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
8190: 20 20 72 65 73 20 3d 20 55 6e 6c 6f 63 6b 46 69    res = UnlockFi
81a0: 6c 65 28 69 64 2d 3e 68 2c 20 46 49 52 53 54 5f  le(id->h, FIRST_
81b0: 4c 4f 43 4b 42 59 54 45 20 2b 20 69 64 2d 3e 6c  LOCKBYTE + id->l
81c0: 6f 63 6b 65 64 2c 20 30 2c 20 31 2c 20 30 29 3b  ocked, 0, 1, 0);
81d0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
81e0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 65 73   }.      if( res
81f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 73 20   ){.        res 
8200: 3d 20 4c 6f 63 6b 46 69 6c 65 28 69 64 2d 3e 68  = LockFile(id->h
8210: 2c 20 46 49 52 53 54 5f 4c 4f 43 4b 42 59 54 45  , FIRST_LOCKBYTE
8220: 2b 31 2c 20 30 2c 20 4e 5f 4c 4f 43 4b 42 59 54  +1, 0, N_LOCKBYT
8230: 45 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c  E, 0);.      }el
8240: 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65 73 20  se{.        res 
8250: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
8260: 20 20 20 55 6e 6c 6f 63 6b 46 69 6c 65 28 69 64     UnlockFile(id
8270: 2d 3e 68 2c 20 46 49 52 53 54 5f 4c 4f 43 4b 42  ->h, FIRST_LOCKB
8280: 59 54 45 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20  YTE, 0, 1, 0);. 
8290: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 65 73     }.    if( res
82a0: 20 29 7b 0a 20 20 20 20 20 20 69 64 2d 3e 6c 6f   ){.      id->lo
82b0: 63 6b 65 64 20 3d 20 2d 31 3b 0a 20 20 20 20 20  cked = -1;.     
82c0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
82d0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
82e0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
82f0: 53 59 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  SY;.    }.  }.  
8300: 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69  return rc;.#endi
8310: 66 0a 23 69 66 20 4f 53 5f 4d 41 43 0a 20 20 69  f.#if OS_MAC.  i
8320: 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 69 64 2d  nt rc;.  if( id-
8330: 3e 6c 6f 63 6b 65 64 3c 30 20 7c 7c 20 69 64 2d  >locked<0 || id-
8340: 3e 72 65 66 4e 75 6d 52 46 20 3d 3d 20 2d 31 20  >refNumRF == -1 
8350: 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
8360: 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  TE_OK;.  }else{.
8370: 20 20 20 20 4f 53 45 72 72 20 72 65 73 3b 0a 20      OSErr res;. 
8380: 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 35 3b 0a     int cnt = 5;.
8390: 20 20 20 20 50 61 72 61 6d 42 6c 6f 63 6b 52 65      ParamBlockRe
83a0: 63 20 70 61 72 61 6d 73 3b 0a 20 20 20 20 6d 65  c params;.    me
83b0: 6d 73 65 74 28 26 70 61 72 61 6d 73 2c 20 30 2c  mset(&params, 0,
83c0: 20 73 69 7a 65 6f 66 28 70 61 72 61 6d 73 29 29   sizeof(params))
83d0: 3b 0a 20 20 20 20 70 61 72 61 6d 73 2e 69 6f 50  ;.    params.ioP
83e0: 61 72 61 6d 2e 69 6f 52 65 66 4e 75 6d 20 3d 20  aram.ioRefNum = 
83f0: 69 64 2d 3e 72 65 66 4e 75 6d 52 46 3b 0a 20 20  id->refNumRF;.  
8400: 20 20 70 61 72 61 6d 73 2e 69 6f 50 61 72 61 6d    params.ioParam
8410: 2e 69 6f 50 6f 73 4d 6f 64 65 20 3d 20 66 73 46  .ioPosMode = fsF
8420: 72 6f 6d 53 74 61 72 74 3b 0a 20 20 20 20 70 61  romStart;.    pa
8430: 72 61 6d 73 2e 69 6f 50 61 72 61 6d 2e 69 6f 50  rams.ioParam.ioP
8440: 6f 73 4f 66 66 73 65 74 20 3d 20 46 49 52 53 54  osOffset = FIRST
8450: 5f 4c 4f 43 4b 42 59 54 45 3b 0a 20 20 20 20 70  _LOCKBYTE;.    p
8460: 61 72 61 6d 73 2e 69 6f 50 61 72 61 6d 2e 69 6f  arams.ioParam.io
8470: 52 65 71 43 6f 75 6e 74 20 3d 20 31 3b 0a 20 20  ReqCount = 1;.  
8480: 20 20 77 68 69 6c 65 28 20 63 6e 74 2d 2d 3e 30    while( cnt-->0
8490: 20 26 26 20 28 72 65 73 20 3d 20 50 42 4c 6f 63   && (res = PBLoc
84a0: 6b 52 61 6e 67 65 53 79 6e 63 28 26 70 61 72 61  kRangeSync(&para
84b0: 6d 73 29 29 21 3d 6e 6f 45 72 72 20 29 7b 0a 20  ms))!=noErr ){. 
84c0: 20 20 20 20 20 55 49 6e 74 33 32 20 66 69 6e 61       UInt32 fina
84d0: 6c 54 69 63 6b 73 3b 0a 20 20 20 20 20 20 44 65  lTicks;.      De
84e0: 6c 61 79 28 31 2c 20 26 66 69 6e 61 6c 54 69 63  lay(1, &finalTic
84f0: 6b 73 29 3b 20 2f 2a 20 31 2f 36 30 20 73 65 63  ks); /* 1/60 sec
8500: 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   */.    }.    if
8510: 28 20 72 65 73 20 3d 3d 20 6e 6f 45 72 72 20 29  ( res == noErr )
8520: 7b 0a 20 20 20 20 20 20 70 61 72 61 6d 73 2e 69  {.      params.i
8530: 6f 50 61 72 61 6d 2e 69 6f 50 6f 73 4f 66 66 73  oParam.ioPosOffs
8540: 65 74 20 3d 20 46 49 52 53 54 5f 4c 4f 43 4b 42  et = FIRST_LOCKB
8550: 59 54 45 20 2b 20 69 64 2d 3e 6c 6f 63 6b 65 64  YTE + id->locked
8560: 3b 0a 20 20 20 20 20 20 70 61 72 61 6d 73 2e 69  ;.      params.i
8570: 6f 50 61 72 61 6d 2e 69 6f 52 65 71 43 6f 75 6e  oParam.ioReqCoun
8580: 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28  t = 1;.      if(
8590: 20 69 64 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 0a   id->locked==0 .
85a0: 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 50              || P
85b0: 42 55 6e 6c 6f 63 6b 52 61 6e 67 65 53 79 6e 63  BUnlockRangeSync
85c0: 28 26 70 61 72 61 6d 73 29 3d 3d 6e 6f 45 72 72  (&params)==noErr
85d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61 72 61   ){.        para
85e0: 6d 73 2e 69 6f 50 61 72 61 6d 2e 69 6f 50 6f 73  ms.ioParam.ioPos
85f0: 4f 66 66 73 65 74 20 3d 20 46 49 52 53 54 5f 4c  Offset = FIRST_L
8600: 4f 43 4b 42 59 54 45 2b 31 3b 0a 20 20 20 20 20  OCKBYTE+1;.     
8610: 20 20 20 70 61 72 61 6d 73 2e 69 6f 50 61 72 61     params.ioPara
8620: 6d 2e 69 6f 52 65 71 43 6f 75 6e 74 20 3d 20 4e  m.ioReqCount = N
8630: 5f 4c 4f 43 4b 42 59 54 45 3b 0a 20 20 20 20 20  _LOCKBYTE;.     
8640: 20 20 20 72 65 73 20 3d 20 50 42 4c 6f 63 6b 52     res = PBLockR
8650: 61 6e 67 65 53 79 6e 63 28 26 70 61 72 61 6d 73  angeSync(&params
8660: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
8670: 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 61 66          res = af
8680: 70 52 61 6e 67 65 4e 6f 74 4c 6f 63 6b 65 64 3b  pRangeNotLocked;
8690: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
86a0: 61 72 61 6d 73 2e 69 6f 50 61 72 61 6d 2e 69 6f  arams.ioParam.io
86b0: 50 6f 73 4f 66 66 73 65 74 20 3d 20 46 49 52 53  PosOffset = FIRS
86c0: 54 5f 4c 4f 43 4b 42 59 54 45 3b 0a 20 20 20 20  T_LOCKBYTE;.    
86d0: 20 20 70 61 72 61 6d 73 2e 69 6f 50 61 72 61 6d    params.ioParam
86e0: 2e 69 6f 52 65 71 43 6f 75 6e 74 20 3d 20 31 3b  .ioReqCount = 1;
86f0: 0a 20 20 20 20 20 20 50 42 55 6e 6c 6f 63 6b 52  .      PBUnlockR
8700: 61 6e 67 65 53 79 6e 63 28 26 70 61 72 61 6d 73  angeSync(&params
8710: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
8720: 20 72 65 73 20 3d 3d 20 6e 6f 45 72 72 20 29 7b   res == noErr ){
8730: 0a 20 20 20 20 20 20 69 64 2d 3e 6c 6f 63 6b 65  .      id->locke
8740: 64 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 72 63  d = -1;.      rc
8750: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
8760: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
8770: 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
8780: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
8790: 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d  urn rc;.#endif.}
87a0: 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74  ../*.** Unlock t
87b0: 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65  he given file de
87c0: 73 63 72 69 70 74 6f 72 2e 20 20 49 66 20 74 68  scriptor.  If th
87d0: 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
87e0: 72 20 77 61 73 0a 2a 2a 20 6e 6f 74 20 70 72 65  r was.** not pre
87f0: 76 69 6f 75 73 6c 79 20 6c 6f 63 6b 65 64 2c 20  viously locked, 
8800: 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  then this routin
8810: 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 49  e is a no-op.  I
8820: 66 20 74 68 69 73 0a 2a 2a 20 6c 69 62 72 61 72  f this.** librar
8830: 79 20 77 61 73 20 63 6f 6d 70 69 6c 65 64 20 77  y was compiled w
8840: 69 74 68 20 6c 61 72 67 65 20 66 69 6c 65 20 73  ith large file s
8850: 75 70 70 6f 72 74 20 28 4c 46 53 29 20 62 75 74  upport (LFS) but
8860: 20 4c 46 53 20 69 73 20 6e 6f 74 0a 2a 2a 20 61   LFS is not.** a
8870: 76 61 69 6c 61 62 6c 65 20 6f 6e 20 74 68 65 20  vailable on the 
8880: 68 6f 73 74 2c 20 74 68 65 6e 20 61 6e 20 53 51  host, then an SQ
8890: 4c 49 54 45 5f 4e 4f 4c 46 53 20 69 73 20 72 65  LITE_NOLFS is re
88a0: 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  turned..*/.int s
88b0: 71 6c 69 74 65 4f 73 55 6e 6c 6f 63 6b 28 4f 73  qliteOsUnlock(Os
88c0: 46 69 6c 65 20 2a 69 64 29 7b 0a 23 69 66 20 4f  File *id){.#if O
88d0: 53 5f 55 4e 49 58 0a 20 20 69 6e 74 20 72 63 3b  S_UNIX.  int rc;
88e0: 0a 20 20 69 66 28 20 21 69 64 2d 3e 6c 6f 63 6b  .  if( !id->lock
88f0: 65 64 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  ed ) return SQLI
8900: 54 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 4f  TE_OK;.  sqliteO
8910: 73 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  sEnterMutex();. 
8920: 20 61 73 73 65 72 74 28 20 69 64 2d 3e 70 4c 6f   assert( id->pLo
8930: 63 6b 2d 3e 63 6e 74 21 3d 30 20 29 3b 0a 20 20  ck->cnt!=0 );.  
8940: 69 66 28 20 69 64 2d 3e 70 4c 6f 63 6b 2d 3e 63  if( id->pLock->c
8950: 6e 74 3e 31 20 29 7b 0a 20 20 20 20 69 64 2d 3e  nt>1 ){.    id->
8960: 70 4c 6f 63 6b 2d 3e 63 6e 74 2d 2d 3b 0a 20 20  pLock->cnt--;.  
8970: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
8980: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
8990: 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b  truct flock lock
89a0: 3b 0a 20 20 20 20 69 6e 74 20 73 3b 0a 20 20 20  ;.    int s;.   
89b0: 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46   lock.l_type = F
89c0: 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 6c 6f 63 6b  _UNLCK;.    lock
89d0: 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b  .l_whence = SEEK
89e0: 5f 53 45 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  _SET;.    lock.l
89f0: 5f 73 74 61 72 74 20 3d 20 6c 6f 63 6b 2e 6c 5f  _start = lock.l_
8a00: 6c 65 6e 20 3d 20 30 4c 3b 0a 20 20 20 20 73 20  len = 0L;.    s 
8a10: 3d 20 66 63 6e 74 6c 28 69 64 2d 3e 66 64 2c 20  = fcntl(id->fd, 
8a20: 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3b  F_SETLK, &lock);
8a30: 0a 20 20 20 20 69 66 28 20 73 21 3d 30 20 29 7b  .    if( s!=0 ){
8a40: 0a 20 20 20 20 20 20 72 63 20 3d 20 28 65 72 72  .      rc = (err
8a50: 6e 6f 3d 3d 45 49 4e 56 41 4c 29 20 3f 20 53 51  no==EINVAL) ? SQ
8a60: 4c 49 54 45 5f 4e 4f 4c 46 53 20 3a 20 53 51 4c  LITE_NOLFS : SQL
8a70: 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 65  ITE_BUSY;.    }e
8a80: 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
8a90: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
8aa0: 20 69 64 2d 3e 70 4c 6f 63 6b 2d 3e 63 6e 74 20   id->pLock->cnt 
8ab0: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 0;.    }.  }. 
8ac0: 20 73 71 6c 69 74 65 4f 73 4c 65 61 76 65 4d 75   sqliteOsLeaveMu
8ad0: 74 65 78 28 29 3b 0a 20 20 69 64 2d 3e 6c 6f 63  tex();.  id->loc
8ae0: 6b 65 64 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  ked = 0;.  retur
8af0: 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 23 69 66  n rc;.#endif.#if
8b00: 20 4f 53 5f 57 49 4e 0a 20 20 69 6e 74 20 72 63   OS_WIN.  int rc
8b10: 3b 0a 20 20 69 66 28 20 69 64 2d 3e 6c 6f 63 6b  ;.  if( id->lock
8b20: 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  ed==0 ){.    rc 
8b30: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  = SQLITE_OK;.  }
8b40: 65 6c 73 65 20 69 66 28 20 69 73 4e 54 28 29 20  else if( isNT() 
8b50: 7c 7c 20 69 64 2d 3e 6c 6f 63 6b 65 64 3c 30 20  || id->locked<0 
8b60: 29 7b 0a 20 20 20 20 55 6e 6c 6f 63 6b 46 69 6c  ){.    UnlockFil
8b70: 65 28 69 64 2d 3e 68 2c 20 46 49 52 53 54 5f 4c  e(id->h, FIRST_L
8b80: 4f 43 4b 42 59 54 45 2b 31 2c 20 30 2c 20 4e 5f  OCKBYTE+1, 0, N_
8b90: 4c 4f 43 4b 42 59 54 45 2c 20 30 29 3b 0a 20 20  LOCKBYTE, 0);.  
8ba0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
8bb0: 3b 0a 20 20 20 20 69 64 2d 3e 6c 6f 63 6b 65 64  ;.    id->locked
8bc0: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
8bd0: 20 20 20 55 6e 6c 6f 63 6b 46 69 6c 65 28 69 64     UnlockFile(id
8be0: 2d 3e 68 2c 20 46 49 52 53 54 5f 4c 4f 43 4b 42  ->h, FIRST_LOCKB
8bf0: 59 54 45 2b 69 64 2d 3e 6c 6f 63 6b 65 64 2c 20  YTE+id->locked, 
8c00: 30 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 72 63  0, 1, 0);.    rc
8c10: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
8c20: 20 20 69 64 2d 3e 6c 6f 63 6b 65 64 20 3d 20 30    id->locked = 0
8c30: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
8c40: 63 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f 53  c;.#endif.#if OS
8c50: 5f 4d 41 43 0a 20 20 69 6e 74 20 72 63 3b 0a 20  _MAC.  int rc;. 
8c60: 20 50 61 72 61 6d 42 6c 6f 63 6b 52 65 63 20 70   ParamBlockRec p
8c70: 61 72 61 6d 73 3b 0a 20 20 6d 65 6d 73 65 74 28  arams;.  memset(
8c80: 26 70 61 72 61 6d 73 2c 20 30 2c 20 73 69 7a 65  &params, 0, size
8c90: 6f 66 28 70 61 72 61 6d 73 29 29 3b 0a 20 20 70  of(params));.  p
8ca0: 61 72 61 6d 73 2e 69 6f 50 61 72 61 6d 2e 69 6f  arams.ioParam.io
8cb0: 52 65 66 4e 75 6d 20 3d 20 69 64 2d 3e 72 65 66  RefNum = id->ref
8cc0: 4e 75 6d 52 46 3b 0a 20 20 70 61 72 61 6d 73 2e  NumRF;.  params.
8cd0: 69 6f 50 61 72 61 6d 2e 69 6f 50 6f 73 4d 6f 64  ioParam.ioPosMod
8ce0: 65 20 3d 20 66 73 46 72 6f 6d 53 74 61 72 74 3b  e = fsFromStart;
8cf0: 0a 20 20 69 66 28 20 69 64 2d 3e 6c 6f 63 6b 65  .  if( id->locke
8d00: 64 3d 3d 30 20 7c 7c 20 69 64 2d 3e 72 65 66 4e  d==0 || id->refN
8d10: 75 6d 52 46 20 3d 3d 20 2d 31 20 29 7b 0a 20 20  umRF == -1 ){.  
8d20: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
8d30: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69 64  ;.  }else if( id
8d40: 2d 3e 6c 6f 63 6b 65 64 3c 30 20 29 7b 0a 20 20  ->locked<0 ){.  
8d50: 20 20 70 61 72 61 6d 73 2e 69 6f 50 61 72 61 6d    params.ioParam
8d60: 2e 69 6f 50 6f 73 4f 66 66 73 65 74 20 3d 20 46  .ioPosOffset = F
8d70: 49 52 53 54 5f 4c 4f 43 4b 42 59 54 45 2b 31 3b  IRST_LOCKBYTE+1;
8d80: 0a 20 20 20 20 70 61 72 61 6d 73 2e 69 6f 50 61  .    params.ioPa
8d90: 72 61 6d 2e 69 6f 52 65 71 43 6f 75 6e 74 20 3d  ram.ioReqCount =
8da0: 20 4e 5f 4c 4f 43 4b 42 59 54 45 3b 0a 20 20 20   N_LOCKBYTE;.   
8db0: 20 50 42 55 6e 6c 6f 63 6b 52 61 6e 67 65 53 79   PBUnlockRangeSy
8dc0: 6e 63 28 26 70 61 72 61 6d 73 29 3b 0a 20 20 20  nc(&params);.   
8dd0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
8de0: 0a 20 20 20 20 69 64 2d 3e 6c 6f 63 6b 65 64 20  .    id->locked 
8df0: 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
8e00: 20 20 70 61 72 61 6d 73 2e 69 6f 50 61 72 61 6d    params.ioParam
8e10: 2e 69 6f 50 6f 73 4f 66 66 73 65 74 20 3d 20 46  .ioPosOffset = F
8e20: 49 52 53 54 5f 4c 4f 43 4b 42 59 54 45 2b 69 64  IRST_LOCKBYTE+id
8e30: 2d 3e 6c 6f 63 6b 65 64 3b 0a 20 20 20 20 70 61  ->locked;.    pa
8e40: 72 61 6d 73 2e 69 6f 50 61 72 61 6d 2e 69 6f 52  rams.ioParam.ioR
8e50: 65 71 43 6f 75 6e 74 20 3d 20 31 3b 0a 20 20 20  eqCount = 1;.   
8e60: 20 50 42 55 6e 6c 6f 63 6b 52 61 6e 67 65 53 79   PBUnlockRangeSy
8e70: 6e 63 28 26 70 61 72 61 6d 73 29 3b 0a 20 20 20  nc(&params);.   
8e80: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
8e90: 0a 20 20 20 20 69 64 2d 3e 6c 6f 63 6b 65 64 20  .    id->locked 
8ea0: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
8eb0: 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  n rc;.#endif.}..
8ec0: 2f 2a 0a 2a 2a 20 47 65 74 20 69 6e 66 6f 72 6d  /*.** Get inform
8ed0: 61 74 69 6f 6e 20 74 6f 20 73 65 65 64 20 74 68  ation to seed th
8ee0: 65 20 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20  e random number 
8ef0: 67 65 6e 65 72 61 74 6f 72 2e 20 20 54 68 65 20  generator.  The 
8f00: 73 65 65 64 0a 2a 2a 20 69 73 20 77 72 69 74 74  seed.** is writt
8f10: 65 6e 20 69 6e 74 6f 20 74 68 65 20 62 75 66 66  en into the buff
8f20: 65 72 20 7a 42 75 66 5b 32 35 36 5d 2e 20 20 54  er zBuf[256].  T
8f30: 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
8f40: 69 6f 6e 20 6d 75 73 74 0a 2a 2a 20 73 75 70 70  ion must.** supp
8f50: 6c 79 20 61 20 73 75 66 66 69 63 69 65 6e 74 6c  ly a sufficientl
8f60: 79 20 6c 61 72 67 65 20 62 75 66 66 65 72 2e 0a  y large buffer..
8f70: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 4f 73 52  */.int sqliteOsR
8f80: 61 6e 64 6f 6d 53 65 65 64 28 63 68 61 72 20 2a  andomSeed(char *
8f90: 7a 42 75 66 29 7b 0a 23 69 66 64 65 66 20 53 51  zBuf){.#ifdef SQ
8fa0: 4c 49 54 45 5f 54 45 53 54 0a 20 20 2f 2a 20 57  LITE_TEST.  /* W
8fb0: 68 65 6e 20 74 65 73 74 69 6e 67 2c 20 61 6c 77  hen testing, alw
8fc0: 61 79 73 20 75 73 65 20 74 68 65 20 73 61 6d 65  ays use the same
8fd0: 20 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 73   random number s
8fe0: 65 71 75 65 6e 63 65 2e 0a 20 20 2a 2a 20 54 68  equence..  ** Th
8ff0: 69 73 20 6d 61 6b 65 73 20 74 68 65 20 74 65 73  is makes the tes
9000: 74 73 20 72 65 70 65 61 74 61 62 6c 65 2e 0a 20  ts repeatable.. 
9010: 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 7a 42 75   */.  memset(zBu
9020: 66 2c 20 30 2c 20 32 35 36 29 3b 0a 23 65 6e 64  f, 0, 256);.#end
9030: 69 66 0a 23 69 66 20 4f 53 5f 55 4e 49 58 20 26  if.#if OS_UNIX &
9040: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
9050: 45 5f 54 45 53 54 29 0a 20 20 69 6e 74 20 70 69  E_TEST).  int pi
9060: 64 3b 0a 20 20 74 69 6d 65 28 28 74 69 6d 65 5f  d;.  time((time_
9070: 74 2a 29 7a 42 75 66 29 3b 0a 20 20 70 69 64 20  t*)zBuf);.  pid 
9080: 3d 20 67 65 74 70 69 64 28 29 3b 0a 20 20 6d 65  = getpid();.  me
9090: 6d 63 70 79 28 26 7a 42 75 66 5b 73 69 7a 65 6f  mcpy(&zBuf[sizeo
90a0: 66 28 74 69 6d 65 5f 74 29 5d 2c 20 26 70 69 64  f(time_t)], &pid
90b0: 2c 20 73 69 7a 65 6f 66 28 70 69 64 29 29 3b 0a  , sizeof(pid));.
90c0: 23 65 6e 64 69 66 0a 23 69 66 20 4f 53 5f 57 49  #endif.#if OS_WI
90d0: 4e 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  N && !defined(SQ
90e0: 4c 49 54 45 5f 54 45 53 54 29 0a 20 20 47 65 74  LITE_TEST).  Get
90f0: 53 79 73 74 65 6d 54 69 6d 65 28 28 4c 50 53 59  SystemTime((LPSY
9100: 53 54 45 4d 54 49 4d 45 29 7a 42 75 66 29 3b 0a  STEMTIME)zBuf);.
9110: 23 65 6e 64 69 66 0a 23 69 66 20 4f 53 5f 4d 41  #endif.#if OS_MA
9120: 43 0a 20 20 69 6e 74 20 70 69 64 3b 0a 20 20 4d  C.  int pid;.  M
9130: 69 63 72 6f 73 65 63 6f 6e 64 73 28 28 55 6e 73  icroseconds((Uns
9140: 69 67 6e 65 64 57 69 64 65 2a 29 7a 42 75 66 29  ignedWide*)zBuf)
9150: 3b 0a 20 20 70 69 64 20 3d 20 67 65 74 70 69 64  ;.  pid = getpid
9160: 28 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 7a 42  ();.  memcpy(&zB
9170: 75 66 5b 73 69 7a 65 6f 66 28 55 6e 73 69 67 6e  uf[sizeof(Unsign
9180: 65 64 57 69 64 65 29 5d 2c 20 26 70 69 64 2c 20  edWide)], &pid, 
9190: 73 69 7a 65 6f 66 28 70 69 64 29 29 3b 0a 23 65  sizeof(pid));.#e
91a0: 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51  ndif.  return SQ
91b0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
91c0: 2a 20 53 6c 65 65 70 20 66 6f 72 20 61 20 6c 69  * Sleep for a li
91d0: 74 74 6c 65 20 77 68 69 6c 65 2e 20 20 52 65 74  ttle while.  Ret
91e0: 75 72 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f  urn the amount o
91f0: 66 20 74 69 6d 65 20 73 6c 65 70 74 2e 0a 2a 2f  f time slept..*/
9200: 0a 69 6e 74 20 73 71 6c 69 74 65 4f 73 53 6c 65  .int sqliteOsSle
9210: 65 70 28 69 6e 74 20 6d 73 29 7b 0a 23 69 66 20  ep(int ms){.#if 
9220: 4f 53 5f 55 4e 49 58 0a 23 69 66 20 64 65 66 69  OS_UNIX.#if defi
9230: 6e 65 64 28 48 41 56 45 5f 55 53 4c 45 45 50 29  ned(HAVE_USLEEP)
9240: 20 26 26 20 48 41 56 45 5f 55 53 4c 45 45 50 0a   && HAVE_USLEEP.
9250: 20 20 75 73 6c 65 65 70 28 6d 73 2a 31 30 30 30    usleep(ms*1000
9260: 29 3b 0a 20 20 72 65 74 75 72 6e 20 6d 73 3b 0a  );.  return ms;.
9270: 23 65 6c 73 65 0a 20 20 73 6c 65 65 70 28 28 6d  #else.  sleep((m
9280: 73 2b 39 39 39 29 2f 31 30 30 30 29 3b 0a 20 20  s+999)/1000);.  
9290: 72 65 74 75 72 6e 20 31 30 30 30 2a 28 28 6d 73  return 1000*((ms
92a0: 2b 39 39 39 29 2f 31 30 30 30 29 3b 0a 23 65 6e  +999)/1000);.#en
92b0: 64 69 66 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f  dif.#endif.#if O
92c0: 53 5f 57 49 4e 0a 20 20 53 6c 65 65 70 28 6d 73  S_WIN.  Sleep(ms
92d0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 6d 73 3b 0a  );.  return ms;.
92e0: 23 65 6e 64 69 66 0a 23 69 66 20 4f 53 5f 4d 41  #endif.#if OS_MA
92f0: 43 0a 20 20 55 49 6e 74 33 32 20 66 69 6e 61 6c  C.  UInt32 final
9300: 54 69 63 6b 73 3b 0a 20 20 55 49 6e 74 33 32 20  Ticks;.  UInt32 
9310: 74 69 63 6b 73 20 3d 20 28 28 28 55 49 6e 74 33  ticks = (((UInt3
9320: 32 29 6d 73 2b 31 36 29 2a 33 29 2f 35 30 3b 20  2)ms+16)*3)/50; 
9330: 20 2f 2a 20 31 2f 36 30 20 73 65 63 20 70 65 72   /* 1/60 sec per
9340: 20 74 69 63 6b 20 2a 2f 0a 20 20 44 65 6c 61 79   tick */.  Delay
9350: 28 74 69 63 6b 73 2c 20 26 66 69 6e 61 6c 54 69  (ticks, &finalTi
9360: 63 6b 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  cks);.  return (
9370: 69 6e 74 29 28 28 74 69 63 6b 73 2a 35 30 29 2f  int)((ticks*50)/
9380: 33 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a  3);.#endif.}../*
9390: 0a 2a 2a 20 4d 61 63 72 6f 73 20 75 73 65 64 20  .** Macros used 
93a0: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65  to determine whe
93b0: 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 6f 20 75  ther or not to u
93c0: 73 65 20 74 68 72 65 61 64 73 2e 20 20 54 68 65  se threads.  The
93d0: 0a 2a 2a 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f  .** SQLITE_UNIX_
93e0: 54 48 52 45 41 44 53 20 6d 61 63 72 6f 20 69 73  THREADS macro is
93f0: 20 64 65 66 69 6e 65 64 20 69 66 20 77 65 20 61   defined if we a
9400: 72 65 20 73 79 6e 63 68 72 6f 6e 69 7a 69 6e 67  re synchronizing
9410: 20 66 6f 72 0a 2a 2a 20 50 6f 73 69 78 20 74 68   for.** Posix th
9420: 72 65 61 64 73 20 61 6e 64 20 53 51 4c 49 54 45  reads and SQLITE
9430: 5f 57 33 32 5f 54 48 52 45 41 44 53 20 69 73 20  _W32_THREADS is 
9440: 64 65 66 69 6e 65 64 20 69 66 20 77 65 20 61 72  defined if we ar
9450: 65 0a 2a 2a 20 73 79 6e 63 68 72 6f 6e 69 7a 69  e.** synchronizi
9460: 6e 67 20 75 73 69 6e 67 20 57 69 6e 33 32 20 74  ng using Win32 t
9470: 68 72 65 61 64 73 2e 0a 2a 2f 0a 23 69 66 20 4f  hreads..*/.#if O
9480: 53 5f 55 4e 49 58 20 26 26 20 64 65 66 69 6e 65  S_UNIX && define
9490: 64 28 54 48 52 45 41 44 53 41 46 45 29 20 26 26  d(THREADSAFE) &&
94a0: 20 54 48 52 45 41 44 53 41 46 45 0a 23 20 69 6e   THREADSAFE.# in
94b0: 63 6c 75 64 65 20 3c 70 74 68 72 65 61 64 2e 68  clude <pthread.h
94c0: 3e 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54  >.# define SQLIT
94d0: 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 20 31  E_UNIX_THREADS 1
94e0: 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f 53 5f 57  .#endif.#if OS_W
94f0: 49 4e 20 26 26 20 64 65 66 69 6e 65 64 28 54 48  IN && defined(TH
9500: 52 45 41 44 53 41 46 45 29 20 26 26 20 54 48 52  READSAFE) && THR
9510: 45 41 44 53 41 46 45 0a 23 20 64 65 66 69 6e 65  EADSAFE.# define
9520: 20 53 51 4c 49 54 45 5f 57 33 32 5f 54 48 52 45   SQLITE_W32_THRE
9530: 41 44 53 20 31 0a 23 65 6e 64 69 66 0a 23 69 66  ADS 1.#endif.#if
9540: 20 4f 53 5f 4d 41 43 20 26 26 20 64 65 66 69 6e   OS_MAC && defin
9550: 65 64 28 54 48 52 45 41 44 53 41 46 45 29 20 26  ed(THREADSAFE) &
9560: 26 20 54 48 52 45 41 44 53 41 46 45 0a 23 20 69  & THREADSAFE.# i
9570: 6e 63 6c 75 64 65 20 3c 4d 75 6c 74 69 70 72 6f  nclude <Multipro
9580: 63 65 73 73 69 6e 67 2e 68 3e 0a 23 20 64 65 66  cessing.h>.# def
9590: 69 6e 65 20 53 51 4c 49 54 45 5f 4d 41 43 4f 53  ine SQLITE_MACOS
95a0: 5f 4d 55 4c 54 49 54 41 53 4b 49 4e 47 20 31 0a  _MULTITASKING 1.
95b0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 74  #endif../*.** St
95c0: 61 74 69 63 20 76 61 72 69 61 62 6c 65 73 20 75  atic variables u
95d0: 73 65 64 20 66 6f 72 20 74 68 72 65 61 64 20 73  sed for thread s
95e0: 79 6e 63 68 72 6f 6e 69 7a 61 74 69 6f 6e 0a 2a  ynchronization.*
95f0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 4d  /.static int inM
9600: 75 74 65 78 20 3d 20 30 3b 0a 23 69 66 64 65 66  utex = 0;.#ifdef
9610: 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f 54 48 52   SQLITE_UNIX_THR
9620: 45 41 44 53 0a 20 20 73 74 61 74 69 63 20 70 74  EADS.  static pt
9630: 68 72 65 61 64 5f 6d 75 74 65 78 5f 74 20 6d 75  hread_mutex_t mu
9640: 74 65 78 20 3d 20 50 54 48 52 45 41 44 5f 4d 55  tex = PTHREAD_MU
9650: 54 45 58 5f 49 4e 49 54 49 41 4c 49 5a 45 52 3b  TEX_INITIALIZER;
9660: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
9670: 51 4c 49 54 45 5f 57 33 32 5f 54 48 52 45 41 44  QLITE_W32_THREAD
9680: 53 0a 20 20 73 74 61 74 69 63 20 43 52 49 54 49  S.  static CRITI
9690: 43 41 4c 5f 53 45 43 54 49 4f 4e 20 63 73 3b 0a  CAL_SECTION cs;.
96a0: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51  #endif.#ifdef SQ
96b0: 4c 49 54 45 5f 4d 41 43 4f 53 5f 4d 55 4c 54 49  LITE_MACOS_MULTI
96c0: 54 41 53 4b 49 4e 47 0a 20 20 73 74 61 74 69 63  TASKING.  static
96d0: 20 4d 50 43 72 69 74 69 63 61 6c 52 65 67 69 6f   MPCriticalRegio
96e0: 6e 49 44 20 63 72 69 74 69 63 61 6c 52 65 67 69  nID criticalRegi
96f0: 6f 6e 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  on;.#endif../*.*
9700: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
9710: 70 61 69 72 20 6f 66 20 72 6f 75 74 69 6e 65 20  pair of routine 
9720: 69 6d 70 6c 65 6d 65 6e 74 20 6d 75 74 75 61 6c  implement mutual
9730: 20 65 78 63 6c 75 73 69 6f 6e 20 66 6f 72 0a 2a   exclusion for.*
9740: 2a 20 6d 75 6c 74 69 2d 74 68 72 65 61 64 65 64  * multi-threaded
9750: 20 70 72 6f 63 65 73 73 65 73 2e 20 20 4f 6e 6c   processes.  Onl
9760: 79 20 61 20 73 69 6e 67 6c 65 20 74 68 72 65 61  y a single threa
9770: 64 20 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f 0a  d is allowed to.
9780: 2a 2a 20 65 78 65 63 75 74 65 64 20 63 6f 64 65  ** executed code
9790: 20 74 68 61 74 20 69 73 20 73 75 72 72 6f 75 6e   that is surroun
97a0: 64 65 64 20 62 79 20 45 6e 74 65 72 4d 75 74 65  ded by EnterMute
97b0: 78 28 29 20 61 6e 64 20 4c 65 61 76 65 4d 75 74  x() and LeaveMut
97c0: 65 78 28 29 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69  ex()..**.** SQLi
97d0: 74 65 20 75 73 65 73 20 6f 6e 6c 79 20 61 20 73  te uses only a s
97e0: 69 6e 67 6c 65 20 4d 75 74 65 78 2e 20 20 54 68  ingle Mutex.  Th
97f0: 65 72 65 20 69 73 20 6e 6f 74 20 6d 75 63 68 20  ere is not much 
9800: 63 72 69 74 69 63 61 6c 0a 2a 2a 20 63 6f 64 65  critical.** code
9810: 20 61 6e 64 20 77 68 61 74 20 6c 69 74 74 6c 65   and what little
9820: 20 74 68 65 72 65 20 69 73 20 65 78 65 63 75 74   there is execut
9830: 65 73 20 71 75 69 63 6b 6c 79 20 61 6e 64 20 77  es quickly and w
9840: 69 74 68 6f 75 74 20 62 6c 6f 63 6b 69 6e 67 2e  ithout blocking.
9850: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 4f  .*/.void sqliteO
9860: 73 45 6e 74 65 72 4d 75 74 65 78 28 29 7b 0a 23  sEnterMutex(){.#
9870: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 55 4e 49  ifdef SQLITE_UNI
9880: 58 5f 54 48 52 45 41 44 53 0a 20 20 70 74 68 72  X_THREADS.  pthr
9890: 65 61 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 26  ead_mutex_lock(&
98a0: 6d 75 74 65 78 29 3b 0a 23 65 6e 64 69 66 0a 23  mutex);.#endif.#
98b0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 33 32  ifdef SQLITE_W32
98c0: 5f 54 48 52 45 41 44 53 0a 20 20 73 74 61 74 69  _THREADS.  stati
98d0: 63 20 69 6e 74 20 69 73 49 6e 69 74 20 3d 20 30  c int isInit = 0
98e0: 3b 0a 20 20 77 68 69 6c 65 28 20 21 69 73 49 6e  ;.  while( !isIn
98f0: 69 74 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63  it ){.    static
9900: 20 6c 6f 6e 67 20 6c 6f 63 6b 20 3d 20 30 3b 0a   long lock = 0;.
9910: 20 20 20 20 69 66 28 20 49 6e 74 65 72 6c 6f 63      if( Interloc
9920: 6b 65 64 49 6e 63 72 65 6d 65 6e 74 28 26 6c 6f  kedIncrement(&lo
9930: 63 6b 29 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  ck)==1 ){.      
9940: 49 6e 69 74 69 61 6c 69 7a 65 43 72 69 74 69 63  InitializeCritic
9950: 61 6c 53 65 63 74 69 6f 6e 28 26 63 73 29 3b 0a  alSection(&cs);.
9960: 20 20 20 20 20 20 69 73 49 6e 69 74 20 3d 20 31        isInit = 1
9970: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
9980: 20 20 20 53 6c 65 65 70 28 31 29 3b 0a 20 20 20     Sleep(1);.   
9990: 20 7d 0a 20 20 7d 0a 20 20 45 6e 74 65 72 43 72   }.  }.  EnterCr
99a0: 69 74 69 63 61 6c 53 65 63 74 69 6f 6e 28 26 63  iticalSection(&c
99b0: 73 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  s);.#endif.#ifde
99c0: 66 20 53 51 4c 49 54 45 5f 4d 41 43 4f 53 5f 4d  f SQLITE_MACOS_M
99d0: 55 4c 54 49 54 41 53 4b 49 4e 47 0a 20 20 73 74  ULTITASKING.  st
99e0: 61 74 69 63 20 76 6f 6c 61 74 69 6c 65 20 69 6e  atic volatile in
99f0: 74 20 6e 6f 74 49 6e 69 74 20 3d 20 31 3b 0a 20  t notInit = 1;. 
9a00: 20 69 66 28 20 6e 6f 74 49 6e 69 74 20 29 7b 0a   if( notInit ){.
9a10: 20 20 20 20 69 66 28 20 6e 6f 74 49 6e 69 74 20      if( notInit 
9a20: 3d 3d 20 32 20 29 20 2f 2a 20 61 73 20 63 6c 6f  == 2 ) /* as clo
9a30: 73 65 20 61 73 20 79 6f 75 20 63 61 6e 20 67 65  se as you can ge
9a40: 74 20 74 6f 20 74 68 72 65 61 64 20 73 61 66 65  t to thread safe
9a50: 20 69 6e 69 74 20 2a 2f 0a 20 20 20 20 20 20 4d   init */.      M
9a60: 50 59 69 65 6c 64 28 29 3b 0a 20 20 20 20 65 6c  PYield();.    el
9a70: 73 65 7b 0a 20 20 20 20 20 20 6e 6f 74 49 6e 69  se{.      notIni
9a80: 74 20 3d 20 32 3b 0a 20 20 20 20 20 20 4d 50 43  t = 2;.      MPC
9a90: 72 65 61 74 65 43 72 69 74 69 63 61 6c 52 65 67  reateCriticalReg
9aa0: 69 6f 6e 28 26 63 72 69 74 69 63 61 6c 52 65 67  ion(&criticalReg
9ab0: 69 6f 6e 29 3b 0a 20 20 20 20 20 20 6e 6f 74 49  ion);.      notI
9ac0: 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  nit = 0;.    }. 
9ad0: 20 7d 0a 20 20 4d 50 45 6e 74 65 72 43 72 69 74   }.  MPEnterCrit
9ae0: 69 63 61 6c 52 65 67 69 6f 6e 28 63 72 69 74 69  icalRegion(criti
9af0: 63 61 6c 52 65 67 69 6f 6e 2c 20 6b 44 75 72 61  calRegion, kDura
9b00: 74 69 6f 6e 46 6f 72 65 76 65 72 29 3b 0a 23 65  tionForever);.#e
9b10: 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 21  ndif.  assert( !
9b20: 69 6e 4d 75 74 65 78 20 29 3b 0a 20 20 69 6e 4d  inMutex );.  inM
9b30: 75 74 65 78 20 3d 20 31 3b 0a 7d 0a 76 6f 69 64  utex = 1;.}.void
9b40: 20 73 71 6c 69 74 65 4f 73 4c 65 61 76 65 4d 75   sqliteOsLeaveMu
9b50: 74 65 78 28 29 7b 0a 20 20 61 73 73 65 72 74 28  tex(){.  assert(
9b60: 20 69 6e 4d 75 74 65 78 20 29 3b 0a 20 20 69 6e   inMutex );.  in
9b70: 4d 75 74 65 78 20 3d 20 30 3b 0a 23 69 66 64 65  Mutex = 0;.#ifde
9b80: 66 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f 54 48  f SQLITE_UNIX_TH
9b90: 52 45 41 44 53 0a 20 20 70 74 68 72 65 61 64 5f  READS.  pthread_
9ba0: 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 26 6d 75  mutex_unlock(&mu
9bb0: 74 65 78 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  tex);.#endif.#if
9bc0: 64 65 66 20 53 51 4c 49 54 45 5f 57 33 32 5f 54  def SQLITE_W32_T
9bd0: 48 52 45 41 44 53 0a 20 20 4c 65 61 76 65 43 72  HREADS.  LeaveCr
9be0: 69 74 69 63 61 6c 53 65 63 74 69 6f 6e 28 26 63  iticalSection(&c
9bf0: 73 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  s);.#endif.#ifde
9c00: 66 20 53 51 4c 49 54 45 5f 4d 41 43 4f 53 5f 4d  f SQLITE_MACOS_M
9c10: 55 4c 54 49 54 41 53 4b 49 4e 47 0a 20 20 4d 50  ULTITASKING.  MP
9c20: 45 78 69 74 43 72 69 74 69 63 61 6c 52 65 67 69  ExitCriticalRegi
9c30: 6f 6e 28 63 72 69 74 69 63 61 6c 52 65 67 69 6f  on(criticalRegio
9c40: 6e 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a  n);.#endif.}../*
9c50: 0a 2a 2a 20 54 75 72 6e 20 61 20 72 65 6c 61 74  .** Turn a relat
9c60: 69 76 65 20 70 61 74 68 6e 61 6d 65 20 69 6e 74  ive pathname int
9c70: 6f 20 61 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d  o a full pathnam
9c80: 65 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69  e.  Return a poi
9c90: 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 66  nter.** to the f
9ca0: 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 73 74 6f  ull pathname sto
9cb0: 72 65 64 20 69 6e 20 73 70 61 63 65 20 6f 62 74  red in space obt
9cc0: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
9cd0: 65 4d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 54 68  eMalloc()..** Th
9ce0: 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
9cf0: 6f 6e 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  on is responsibl
9d00: 65 20 66 6f 72 20 66 72 65 65 69 6e 67 20 74 68  e for freeing th
9d10: 69 73 20 73 70 61 63 65 20 6f 6e 63 65 20 69 74  is space once it
9d20: 0a 2a 2a 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72  .** is no longer
9d30: 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 63 68 61 72   needed..*/.char
9d40: 20 2a 73 71 6c 69 74 65 4f 73 46 75 6c 6c 50 61   *sqliteOsFullPa
9d50: 74 68 6e 61 6d 65 28 63 6f 6e 73 74 20 63 68 61  thname(const cha
9d60: 72 20 2a 7a 52 65 6c 61 74 69 76 65 29 7b 0a 23  r *zRelative){.#
9d70: 69 66 20 4f 53 5f 55 4e 49 58 0a 20 20 63 68 61  if OS_UNIX.  cha
9d80: 72 20 2a 7a 46 75 6c 6c 20 3d 20 30 3b 0a 20 20  r *zFull = 0;.  
9d90: 69 66 28 20 7a 52 65 6c 61 74 69 76 65 5b 30 5d  if( zRelative[0]
9da0: 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 73 71 6c  =='/' ){.    sql
9db0: 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 7a 46  iteSetString(&zF
9dc0: 75 6c 6c 2c 20 7a 52 65 6c 61 74 69 76 65 2c 20  ull, zRelative, 
9dd0: 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  0);.  }else{.   
9de0: 20 63 68 61 72 20 7a 42 75 66 5b 35 30 30 30 5d   char zBuf[5000]
9df0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 53  ;.    sqliteSetS
9e00: 74 72 69 6e 67 28 26 7a 46 75 6c 6c 2c 20 67 65  tring(&zFull, ge
9e10: 74 63 77 64 28 7a 42 75 66 2c 20 73 69 7a 65 6f  tcwd(zBuf, sizeo
9e20: 66 28 7a 42 75 66 29 29 2c 20 22 2f 22 2c 20 7a  f(zBuf)), "/", z
9e30: 52 65 6c 61 74 69 76 65 2c 20 30 29 3b 0a 20 20  Relative, 0);.  
9e40: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 46 75 6c 6c  }.  return zFull
9e50: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f 53 5f  ;.#endif.#if OS_
9e60: 57 49 4e 0a 20 20 63 68 61 72 20 2a 7a 4e 6f 74  WIN.  char *zNot
9e70: 55 73 65 64 3b 0a 20 20 63 68 61 72 20 2a 7a 46  Used;.  char *zF
9e80: 75 6c 6c 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65  ull;.  int nByte
9e90: 3b 0a 20 20 6e 42 79 74 65 20 3d 20 47 65 74 46  ;.  nByte = GetF
9ea0: 75 6c 6c 50 61 74 68 4e 61 6d 65 28 7a 52 65 6c  ullPathName(zRel
9eb0: 61 74 69 76 65 2c 20 30 2c 20 30 2c 20 26 7a 4e  ative, 0, 0, &zN
9ec0: 6f 74 55 73 65 64 29 20 2b 20 31 3b 0a 20 20 7a  otUsed) + 1;.  z
9ed0: 46 75 6c 6c 20 3d 20 73 71 6c 69 74 65 4d 61 6c  Full = sqliteMal
9ee0: 6c 6f 63 28 20 6e 42 79 74 65 20 29 3b 0a 20 20  loc( nByte );.  
9ef0: 69 66 28 20 7a 46 75 6c 6c 3d 3d 30 20 29 20 72  if( zFull==0 ) r
9f00: 65 74 75 72 6e 20 30 3b 0a 20 20 47 65 74 46 75  eturn 0;.  GetFu
9f10: 6c 6c 50 61 74 68 4e 61 6d 65 28 7a 52 65 6c 61  llPathName(zRela
9f20: 74 69 76 65 2c 20 6e 42 79 74 65 2c 20 7a 46 75  tive, nByte, zFu
9f30: 6c 6c 2c 20 26 7a 4e 6f 74 55 73 65 64 29 3b 0a  ll, &zNotUsed);.
9f40: 20 20 72 65 74 75 72 6e 20 7a 46 75 6c 6c 3b 0a    return zFull;.
9f50: 23 65 6e 64 69 66 0a 23 69 66 20 4f 53 5f 4d 41  #endif.#if OS_MA
9f60: 43 0a 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 20  C.  char *zFull 
9f70: 3d 20 30 3b 0a 20 20 69 66 28 20 7a 52 65 6c 61  = 0;.  if( zRela
9f80: 74 69 76 65 5b 30 5d 3d 3d 27 3a 27 20 29 7b 0a  tive[0]==':' ){.
9f90: 20 20 20 20 63 68 61 72 20 7a 42 75 66 5b 5f 4d      char zBuf[_M
9fa0: 41 58 5f 50 41 54 48 2b 31 5d 3b 0a 20 20 20 20  AX_PATH+1];.    
9fb0: 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28  sqliteSetString(
9fc0: 26 7a 46 75 6c 6c 2c 20 67 65 74 63 77 64 28 7a  &zFull, getcwd(z
9fd0: 42 75 66 2c 20 73 69 7a 65 6f 66 28 7a 42 75 66  Buf, sizeof(zBuf
9fe0: 29 29 2c 20 26 28 7a 52 65 6c 61 74 69 76 65 5b  )), &(zRelative[
9ff0: 31 5d 29 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65  1]), 0);.  }else
a000: 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 68 72  {.    if( strchr
a010: 28 7a 52 65 6c 61 74 69 76 65 2c 20 27 3a 27 29  (zRelative, ':')
a020: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
a030: 53 65 74 53 74 72 69 6e 67 28 26 7a 46 75 6c 6c  SetString(&zFull
a040: 2c 20 7a 52 65 6c 61 74 69 76 65 2c 20 30 29 3b  , zRelative, 0);
a050: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
a060: 63 68 61 72 20 7a 42 75 66 5b 5f 4d 41 58 5f 50  char zBuf[_MAX_P
a070: 41 54 48 2b 31 5d 3b 0a 20 20 20 20 20 20 73 71  ATH+1];.      sq
a080: 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 7a  liteSetString(&z
a090: 46 75 6c 6c 2c 20 67 65 74 63 77 64 28 7a 42 75  Full, getcwd(zBu
a0a0: 66 2c 20 73 69 7a 65 6f 66 28 7a 42 75 66 29 29  f, sizeof(zBuf))
a0b0: 2c 20 7a 52 65 6c 61 74 69 76 65 2c 20 30 29 3b  , zRelative, 0);
a0c0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
a0d0: 75 72 6e 20 7a 46 75 6c 6c 3b 0a 23 65 6e 64 69  urn zFull;.#endi
a0e0: 66 0a 7d 0a                                      f.}.