/ Hex Artifact Content
Login

Artifact c33ebb320921b8df6d09ea19fe846348df86a0c9:


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 65  LOW 0.# endif.#e
03a0: 6e 64 69 66 0a 0a 23 69 66 20 4f 53 5f 57 49 4e  ndif..#if OS_WIN
03b0: 0a 23 20 69 6e 63 6c 75 64 65 20 3c 77 69 6e 62  .# include <winb
03c0: 61 73 65 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 23  ase.h>.#endif..#
03d0: 69 66 20 4f 53 5f 4d 41 43 0a 23 20 69 6e 63 6c  if OS_MAC.# incl
03e0: 75 64 65 20 3c 65 78 74 72 61 73 2e 68 3e 0a 23  ude <extras.h>.#
03f0: 20 69 6e 63 6c 75 64 65 20 3c 70 61 74 68 32 66   include <path2f
0400: 73 73 2e 68 3e 0a 23 20 69 6e 63 6c 75 64 65 20  ss.h>.# include 
0410: 3c 54 65 78 74 55 74 69 6c 73 2e 68 3e 0a 23 20  <TextUtils.h>.# 
0420: 69 6e 63 6c 75 64 65 20 3c 46 69 6e 64 65 72 52  include <FinderR
0430: 65 67 69 73 74 72 79 2e 68 3e 0a 23 20 69 6e 63  egistry.h>.# inc
0440: 6c 75 64 65 20 3c 46 6f 6c 64 65 72 73 2e 68 3e  lude <Folders.h>
0450: 0a 23 20 69 6e 63 6c 75 64 65 20 3c 54 69 6d 65  .# include <Time
0460: 72 2e 68 3e 0a 23 20 69 6e 63 6c 75 64 65 20 3c  r.h>.# include <
0470: 4f 53 55 74 69 6c 73 2e 68 3e 0a 23 65 6e 64 69  OSUtils.h>.#endi
0480: 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 63 72 6f 73 20  f../*.** Macros 
0490: 66 6f 72 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  for performance 
04a0: 74 72 61 63 69 6e 67 2e 20 20 4e 6f 72 6d 61 6c  tracing.  Normal
04b0: 6c 79 20 74 75 72 6e 65 64 20 6f 66 66 0a 2a 2f  ly turned off.*/
04c0: 0a 23 69 66 20 30 0a 73 74 61 74 69 63 20 69 6e  .#if 0.static in
04d0: 74 20 6c 61 73 74 5f 70 61 67 65 20 3d 20 30 3b  t last_page = 0;
04e0: 0a 5f 5f 69 6e 6c 69 6e 65 5f 5f 20 75 6e 73 69  .__inline__ unsi
04f0: 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 69  gned long long i
0500: 6e 74 20 68 77 74 69 6d 65 28 76 6f 69 64 29 7b  nt hwtime(void){
0510: 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  .  unsigned long
0520: 20 6c 6f 6e 67 20 69 6e 74 20 78 3b 0a 20 20 5f   long int x;.  _
0530: 5f 61 73 6d 5f 5f 28 22 72 64 74 73 63 5c 6e 5c  _asm__("rdtsc\n\
0540: 74 22 0a 20 20 20 20 20 20 20 20 20 20 22 6d 6f  t".          "mo
0550: 76 20 25 25 65 64 78 2c 20 25 25 65 63 78 5c 6e  v %%edx, %%ecx\n
0560: 5c 74 22 0a 20 20 20 20 20 20 20 20 20 20 3a 22  \t".          :"
0570: 3d 41 22 20 28 78 29 29 3b 0a 20 20 72 65 74 75  =A" (x));.  retu
0580: 72 6e 20 78 3b 0a 7d 0a 73 74 61 74 69 63 20 75  rn x;.}.static u
0590: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e  nsigned long lon
05a0: 67 20 69 6e 74 20 67 5f 73 74 61 72 74 3b 0a 73  g int g_start;.s
05b0: 74 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20 69  tatic unsigned i
05c0: 6e 74 20 65 6c 61 70 73 65 3b 0a 23 64 65 66 69  nt elapse;.#defi
05d0: 6e 65 20 54 49 4d 45 52 5f 53 54 41 52 54 20 20  ne TIMER_START  
05e0: 20 20 20 20 20 67 5f 73 74 61 72 74 3d 68 77 74       g_start=hwt
05f0: 69 6d 65 28 29 0a 23 64 65 66 69 6e 65 20 54 49  ime().#define TI
0600: 4d 45 52 5f 45 4e 44 20 20 20 20 20 20 20 20 20  MER_END         
0610: 65 6c 61 70 73 65 3d 68 77 74 69 6d 65 28 29 2d  elapse=hwtime()-
0620: 67 5f 73 74 61 72 74 0a 23 64 65 66 69 6e 65 20  g_start.#define 
0630: 53 45 45 4b 28 58 29 20 20 20 20 20 20 20 20 20  SEEK(X)         
0640: 20 20 6c 61 73 74 5f 70 61 67 65 3d 28 58 29 0a    last_page=(X).
0650: 23 64 65 66 69 6e 65 20 54 52 41 43 45 31 28 58  #define TRACE1(X
0660: 29 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  )         fprint
0670: 66 28 73 74 64 65 72 72 2c 58 29 0a 23 64 65 66  f(stderr,X).#def
0680: 69 6e 65 20 54 52 41 43 45 32 28 58 2c 59 29 20  ine TRACE2(X,Y) 
0690: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74        fprintf(st
06a0: 64 65 72 72 2c 58 2c 59 29 0a 23 64 65 66 69 6e  derr,X,Y).#defin
06b0: 65 20 54 52 41 43 45 33 28 58 2c 59 2c 5a 29 20  e TRACE3(X,Y,Z) 
06c0: 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65      fprintf(stde
06d0: 72 72 2c 58 2c 59 2c 5a 29 0a 23 64 65 66 69 6e  rr,X,Y,Z).#defin
06e0: 65 20 54 52 41 43 45 34 28 58 2c 59 2c 5a 2c 41  e TRACE4(X,Y,Z,A
06f0: 29 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65  )   fprintf(stde
0700: 72 72 2c 58 2c 59 2c 5a 2c 41 29 0a 23 64 65 66  rr,X,Y,Z,A).#def
0710: 69 6e 65 20 54 52 41 43 45 35 28 58 2c 59 2c 5a  ine TRACE5(X,Y,Z
0720: 2c 41 2c 42 29 20 66 70 72 69 6e 74 66 28 73 74  ,A,B) fprintf(st
0730: 64 65 72 72 2c 58 2c 59 2c 5a 2c 41 2c 42 29 0a  derr,X,Y,Z,A,B).
0740: 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 54 49  #else.#define TI
0750: 4d 45 52 5f 53 54 41 52 54 0a 23 64 65 66 69 6e  MER_START.#defin
0760: 65 20 54 49 4d 45 52 5f 45 4e 44 0a 23 64 65 66  e TIMER_END.#def
0770: 69 6e 65 20 53 45 45 4b 28 58 29 0a 23 64 65 66  ine SEEK(X).#def
0780: 69 6e 65 20 54 52 41 43 45 31 28 58 29 0a 23 64  ine TRACE1(X).#d
0790: 65 66 69 6e 65 20 54 52 41 43 45 32 28 58 2c 59  efine TRACE2(X,Y
07a0: 29 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45 33  ).#define TRACE3
07b0: 28 58 2c 59 2c 5a 29 0a 23 64 65 66 69 6e 65 20  (X,Y,Z).#define 
07c0: 54 52 41 43 45 34 28 58 2c 59 2c 5a 2c 41 29 0a  TRACE4(X,Y,Z,A).
07d0: 23 64 65 66 69 6e 65 20 54 52 41 43 45 35 28 58  #define TRACE5(X
07e0: 2c 59 2c 5a 2c 41 2c 42 29 0a 23 65 6e 64 69 66  ,Y,Z,A,B).#endif
07f0: 0a 0a 0a 23 69 66 20 4f 53 5f 55 4e 49 58 0a 2f  ...#if OS_UNIX./
0800: 2a 0a 2a 2a 20 48 65 72 65 20 69 73 20 74 68 65  *.** Here is the
0810: 20 64 69 72 74 20 6f 6e 20 50 4f 53 49 58 20 61   dirt on POSIX a
0820: 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 3a 20 20  dvisory locks:  
0830: 41 4e 53 49 20 53 54 44 20 31 30 30 33 2e 31 20  ANSI STD 1003.1 
0840: 28 31 39 39 36 29 0a 2a 2a 20 73 65 63 74 69 6f  (1996).** sectio
0850: 6e 20 36 2e 35 2e 32 2e 32 20 6c 69 6e 65 73 20  n 6.5.2.2 lines 
0860: 34 38 33 20 74 68 72 6f 75 67 68 20 34 39 30 20  483 through 490 
0870: 73 70 65 63 69 66 79 20 74 68 61 74 20 77 68 65  specify that whe
0880: 6e 20 61 20 70 72 6f 63 65 73 73 0a 2a 2a 20 73  n a process.** s
0890: 65 74 73 20 6f 72 20 63 6c 65 61 72 73 20 61 20  ets or clears a 
08a0: 6c 6f 63 6b 2c 20 74 68 61 74 20 6f 70 65 72 61  lock, that opera
08b0: 74 69 6f 6e 20 6f 76 65 72 72 69 64 65 73 20 61  tion overrides a
08c0: 6e 79 20 70 72 69 6f 72 20 6c 6f 63 6b 73 20 73  ny prior locks s
08d0: 65 74 0a 2a 2a 20 62 79 20 74 68 65 20 73 61 6d  et.** by the sam
08e0: 65 20 70 72 6f 63 65 73 73 2e 20 20 49 74 20 64  e process.  It d
08f0: 6f 65 73 20 6e 6f 74 20 65 78 70 6c 69 63 69 74  oes not explicit
0900: 6c 79 20 73 61 79 20 73 6f 2c 20 62 75 74 20 74  ly say so, but t
0910: 68 69 73 20 69 6d 70 6c 69 65 73 0a 2a 2a 20 74  his implies.** t
0920: 68 61 74 20 69 74 20 6f 76 65 72 72 69 64 65 73  hat it overrides
0930: 20 6c 6f 63 6b 73 20 73 65 74 20 62 79 20 74 68   locks set by th
0940: 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 75  e same process u
0950: 73 69 6e 67 20 61 20 64 69 66 66 65 72 65 6e 74  sing a different
0960: 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70  .** file descrip
0970: 74 6f 72 2e 20 20 43 6f 6e 73 69 64 65 72 20 74  tor.  Consider t
0980: 68 69 73 20 74 65 73 74 20 63 61 73 65 3a 0a 2a  his test case:.*
0990: 2a 0a 2a 2a 20 20 20 20 20 20 20 69 6e 74 20 66  *.**       int f
09a0: 64 31 20 3d 20 6f 70 65 6e 28 22 2e 2f 66 69 6c  d1 = open("./fil
09b0: 65 31 22 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43 52  e1", O_RDWR|O_CR
09c0: 45 41 54 2c 20 30 36 34 34 29 3b 0a 2a 2a 20 20  EAT, 0644);.**  
09d0: 20 20 20 20 20 69 6e 74 20 66 64 32 20 3d 20 6f       int fd2 = o
09e0: 70 65 6e 28 22 2e 2f 66 69 6c 65 32 22 2c 20 4f  pen("./file2", O
09f0: 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 2c 20 30  _RDWR|O_CREAT, 0
0a00: 36 34 34 29 3b 0a 2a 2a 0a 2a 2a 20 53 75 70 70  644);.**.** Supp
0a10: 6f 73 65 20 2e 2f 66 69 6c 65 31 20 61 6e 64 20  ose ./file1 and 
0a20: 2e 2f 66 69 6c 65 32 20 61 72 65 20 72 65 61 6c  ./file2 are real
0a30: 6c 79 20 62 65 20 74 68 65 20 73 61 6d 65 20 66  ly be the same f
0a40: 69 6c 65 20 28 62 65 63 61 75 73 65 0a 2a 2a 20  ile (because.** 
0a50: 6f 6e 65 20 69 73 20 61 20 68 61 72 64 20 6f 72  one is a hard or
0a60: 20 73 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b 20 74   symbolic link t
0a70: 6f 20 74 68 65 20 6f 74 68 65 72 29 20 74 68 65  o the other) the
0a80: 6e 20 69 66 20 79 6f 75 20 73 65 74 0a 2a 2a 20  n if you set.** 
0a90: 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
0aa0: 6b 20 6f 6e 20 66 64 31 2c 20 74 68 65 6e 20 74  k on fd1, then t
0ab0: 72 79 20 74 6f 20 67 65 74 20 61 6e 20 65 78 63  ry to get an exc
0ac0: 6c 75 73 69 76 65 20 6c 6f 63 6b 0a 2a 2a 20 6f  lusive lock.** o
0ad0: 6e 20 66 64 32 2c 20 69 74 20 77 6f 72 6b 73 2e  n fd2, it works.
0ae0: 20 20 49 20 77 6f 75 6c 64 20 68 61 76 65 20 65    I would have e
0af0: 78 70 65 63 74 65 64 20 74 68 65 20 73 65 63 6f  xpected the seco
0b00: 6e 64 20 6c 6f 63 6b 20 74 6f 0a 2a 2a 20 66 61  nd lock to.** fa
0b10: 69 6c 20 73 69 6e 63 65 20 74 68 65 72 65 20 77  il since there w
0b20: 61 73 20 61 6c 72 65 61 64 79 20 61 20 6c 6f 63  as already a loc
0b30: 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 64 75  k on the file du
0b40: 65 20 74 6f 20 66 64 31 2e 0a 2a 2a 20 42 75 74  e to fd1..** But
0b50: 20 6e 6f 74 20 73 6f 2e 20 20 53 69 6e 63 65 20   not so.  Since 
0b60: 62 6f 74 68 20 6c 6f 63 6b 73 20 63 61 6d 65 20  both locks came 
0b70: 66 72 6f 6d 20 74 68 65 20 73 61 6d 65 20 70 72  from the same pr
0b80: 6f 63 65 73 73 2c 20 74 68 65 0a 2a 2a 20 73 65  ocess, the.** se
0b90: 63 6f 6e 64 20 6f 76 65 72 72 69 64 65 73 20 74  cond overrides t
0ba0: 68 65 20 66 69 72 73 74 2c 20 65 76 65 6e 20 74  he first, even t
0bb0: 68 6f 75 67 68 20 74 68 65 79 20 77 65 72 65 20  hough they were 
0bc0: 6f 6e 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20  on different.** 
0bd0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  file descriptors
0be0: 20 6f 70 65 6e 65 64 20 6f 6e 20 64 69 66 66 65   opened on diffe
0bf0: 72 65 6e 74 20 66 69 6c 65 20 6e 61 6d 65 73 2e  rent file names.
0c00: 0a 2a 2a 0a 2a 2a 20 42 75 6d 6d 65 72 2e 20 20  .**.** Bummer.  
0c10: 49 66 20 79 6f 75 20 61 73 6b 20 6d 65 2c 20 74  If you ask me, t
0c20: 68 69 73 20 69 73 20 62 72 6f 6b 65 6e 2e 20 20  his is broken.  
0c30: 42 61 64 6c 79 20 62 72 6f 6b 65 6e 2e 20 20 49  Badly broken.  I
0c40: 74 20 6d 65 61 6e 73 0a 2a 2a 20 74 68 61 74 20  t means.** that 
0c50: 77 65 20 63 61 6e 6e 6f 74 20 75 73 65 20 50 4f  we cannot use PO
0c60: 53 49 58 20 6c 6f 63 6b 73 20 74 6f 20 73 79 6e  SIX locks to syn
0c70: 63 68 72 6f 6e 69 7a 65 20 66 69 6c 65 20 61 63  chronize file ac
0c80: 63 65 73 73 20 61 6d 6f 6e 67 0a 2a 2a 20 63 6f  cess among.** co
0c90: 6d 70 65 74 69 6e 67 20 74 68 72 65 61 64 73 20  mpeting threads 
0ca0: 6f 66 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63  of the same proc
0cb0: 65 73 73 2e 20 20 50 4f 53 49 58 20 6c 6f 63 6b  ess.  POSIX lock
0cc0: 73 20 77 69 6c 6c 20 77 6f 72 6b 20 66 69 6e 65  s will work fine
0cd0: 0a 2a 2a 20 74 6f 20 73 79 6e 63 68 72 6f 6e 69  .** to synchroni
0ce0: 7a 65 20 61 63 63 65 73 73 20 66 6f 72 20 74 68  ze access for th
0cf0: 72 65 61 64 73 20 69 6e 20 73 65 70 61 72 61 74  reads in separat
0d00: 65 20 70 72 6f 63 65 73 73 65 73 2c 20 62 75 74  e processes, but
0d10: 20 6e 6f 74 0a 2a 2a 20 74 68 72 65 61 64 73 20   not.** threads 
0d20: 77 69 74 68 69 6e 20 74 68 65 20 73 61 6d 65 20  within the same 
0d30: 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54  process..**.** T
0d40: 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68  o work around th
0d50: 65 20 70 72 6f 62 6c 65 6d 2c 20 53 51 4c 69 74  e problem, SQLit
0d60: 65 20 68 61 73 20 74 6f 20 6d 61 6e 61 67 65 20  e has to manage 
0d70: 66 69 6c 65 20 6c 6f 63 6b 73 20 69 6e 74 65 72  file locks inter
0d80: 6e 61 6c 6c 79 0a 2a 2a 20 6f 6e 20 69 74 73 20  nally.** on its 
0d90: 6f 77 6e 2e 20 20 57 68 65 6e 65 76 65 72 20 61  own.  Whenever a
0da0: 20 6e 65 77 20 64 61 74 61 62 61 73 65 20 69 73   new database is
0db0: 20 6f 70 65 6e 65 64 2c 20 77 65 20 68 61 76 65   opened, we have
0dc0: 20 74 6f 20 66 69 6e 64 20 74 68 65 0a 2a 2a 20   to find the.** 
0dd0: 73 70 65 63 69 66 69 63 20 69 6e 6f 64 65 20 6f  specific inode o
0de0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
0df0: 69 6c 65 20 28 74 68 65 20 69 6e 6f 64 65 20 69  ile (the inode i
0e00: 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  s determined by 
0e10: 74 68 65 0a 2a 2a 20 73 74 5f 64 65 76 20 61 6e  the.** st_dev an
0e20: 64 20 73 74 5f 69 6e 6f 20 66 69 65 6c 64 73 20  d st_ino fields 
0e30: 6f 66 20 74 68 65 20 73 74 61 74 20 73 74 72 75  of the stat stru
0e40: 63 74 75 72 65 20 74 68 61 74 20 66 73 74 61 74  cture that fstat
0e50: 28 29 20 66 69 6c 6c 73 20 69 6e 29 0a 2a 2a 20  () fills in).** 
0e60: 61 6e 64 20 63 68 65 63 6b 20 66 6f 72 20 6c 6f  and check for lo
0e70: 63 6b 73 20 61 6c 72 65 61 64 79 20 65 78 69 73  cks already exis
0e80: 74 69 6e 67 20 6f 6e 20 74 68 61 74 20 69 6e 6f  ting on that ino
0e90: 64 65 2e 20 20 57 68 65 6e 20 6c 6f 63 6b 73 20  de.  When locks 
0ea0: 61 72 65 0a 2a 2a 20 63 72 65 61 74 65 64 20 6f  are.** created o
0eb0: 72 20 72 65 6d 6f 76 65 64 2c 20 77 65 20 68 61  r removed, we ha
0ec0: 76 65 20 74 6f 20 6c 6f 6f 6b 20 61 74 20 6f 75  ve to look at ou
0ed0: 72 20 6f 77 6e 20 69 6e 74 65 72 6e 61 6c 20 72  r own internal r
0ee0: 65 63 6f 72 64 20 6f 66 20 74 68 65 0a 2a 2a 20  ecord of the.** 
0ef0: 6c 6f 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20  locks to see if 
0f00: 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20 68  another thread h
0f10: 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 73 65  as previously se
0f20: 74 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 61 74  t a lock on that
0f30: 20 73 61 6d 65 0a 2a 2a 20 69 6e 6f 64 65 2e 0a   same.** inode..
0f40: 2a 2a 0a 2a 2a 20 54 68 65 20 4f 73 46 69 6c 65  **.** The OsFile
0f50: 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 50   structure for P
0f60: 4f 53 49 58 20 69 73 20 6e 6f 20 6c 6f 6e 67 65  OSIX is no longe
0f70: 72 20 6a 75 73 74 20 61 6e 20 69 6e 74 65 67 65  r just an intege
0f80: 72 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69  r file.** descri
0f90: 70 74 6f 72 2e 20 20 49 74 20 69 73 20 6e 6f 77  ptor.  It is now
0fa0: 20 61 20 73 74 72 75 63 74 75 72 65 20 74 68 61   a structure tha
0fb0: 74 20 68 6f 6c 64 73 20 74 68 65 20 69 6e 74 65  t holds the inte
0fc0: 67 65 72 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63  ger file.** desc
0fd0: 72 69 70 74 6f 72 20 61 6e 64 20 61 20 70 6f 69  riptor and a poi
0fe0: 6e 74 65 72 20 74 6f 20 61 20 73 74 72 75 63 74  nter to a struct
0ff0: 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62  ure that describ
1000: 65 73 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 0a  es the internal.
1010: 2a 2a 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20  ** locks on the 
1020: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 69 6e  corresponding in
1030: 6f 64 65 2e 20 20 54 68 65 72 65 20 69 73 20 6f  ode.  There is o
1040: 6e 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63  ne locking struc
1050: 74 75 72 65 0a 2a 2a 20 70 65 72 20 69 6e 6f 64  ture.** per inod
1060: 65 2c 20 73 6f 20 69 66 20 74 68 65 20 73 61 6d  e, so if the sam
1070: 65 20 69 6e 6f 64 65 20 69 73 20 6f 70 65 6e 65  e inode is opene
1080: 64 20 74 77 69 63 65 2c 20 62 6f 74 68 20 4f 73  d twice, both Os
1090: 46 69 6c 65 20 73 74 72 75 63 74 75 72 65 73 0a  File structures.
10a0: 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  ** point to the 
10b0: 73 61 6d 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72  same locking str
10c0: 75 63 74 75 72 65 2e 20 20 54 68 65 20 6c 6f 63  ucture.  The loc
10d0: 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 6b  king structure k
10e0: 65 65 70 73 0a 2a 2a 20 61 20 72 65 66 65 72 65  eeps.** a refere
10f0: 6e 63 65 20 63 6f 75 6e 74 20 28 73 6f 20 77 65  nce count (so we
1100: 20 77 69 6c 6c 20 6b 6e 6f 77 20 77 68 65 6e 20   will know when 
1110: 74 6f 20 64 65 6c 65 74 65 20 69 74 29 20 61 6e  to delete it) an
1120: 64 20 61 20 22 63 6e 74 22 0a 2a 2a 20 66 69 65  d a "cnt".** fie
1130: 6c 64 20 74 68 61 74 20 74 65 6c 6c 73 20 75 73  ld that tells us
1140: 20 69 74 73 20 69 6e 74 65 72 6e 61 6c 20 6c 6f   its internal lo
1150: 63 6b 20 73 74 61 74 75 73 2e 20 20 63 6e 74 3d  ck status.  cnt=
1160: 3d 30 20 6d 65 61 6e 73 20 74 68 65 0a 2a 2a 20  =0 means the.** 
1170: 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64  file is unlocked
1180: 2e 20 20 63 6e 74 3d 3d 2d 31 20 6d 65 61 6e 73  .  cnt==-1 means
1190: 20 74 68 65 20 66 69 6c 65 20 68 61 73 20 61 6e   the file has an
11a0: 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e   exclusive lock.
11b0: 0a 2a 2a 20 63 6e 74 3e 30 20 6d 65 61 6e 73 20  .** cnt>0 means 
11c0: 74 68 65 72 65 20 61 72 65 20 63 6e 74 20 73 68  there are cnt sh
11d0: 61 72 65 64 20 6c 6f 63 6b 73 20 6f 6e 20 74 68  ared locks on th
11e0: 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 6e  e file..**.** An
11f0: 79 20 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f 63  y attempt to loc
1200: 6b 20 6f 72 20 75 6e 6c 6f 63 6b 20 61 20 66 69  k or unlock a fi
1210: 6c 65 20 66 69 72 73 74 20 63 68 65 63 6b 73 20  le first checks 
1220: 74 68 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73  the locking.** s
1230: 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 20 66  tructure.  The f
1240: 63 6e 74 6c 28 29 20 73 79 73 74 65 6d 20 63 61  cntl() system ca
1250: 6c 6c 20 69 73 20 6f 6e 6c 79 20 69 6e 76 6f 6b  ll is only invok
1260: 65 64 20 74 6f 20 73 65 74 20 61 20 0a 2a 2a 20  ed to set a .** 
1270: 50 4f 53 49 58 20 6c 6f 63 6b 20 69 66 20 74 68  POSIX lock if th
1280: 65 20 69 6e 74 65 72 6e 61 6c 20 6c 6f 63 6b 20  e internal lock 
1290: 73 74 72 75 63 74 75 72 65 20 74 72 61 6e 73 69  structure transi
12a0: 74 69 6f 6e 73 20 62 65 74 77 65 65 6e 0a 2a 2a  tions between.**
12b0: 20 61 20 6c 6f 63 6b 65 64 20 61 6e 64 20 61 6e   a locked and an
12c0: 20 75 6e 6c 6f 63 6b 65 64 20 73 74 61 74 65 2e   unlocked state.
12d0: 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e  .*/../*.** An in
12e0: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f  stance of the fo
12f0: 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72  llowing structur
1300: 65 20 73 65 72 76 65 73 20 61 73 20 74 68 65 20  e serves as the 
1310: 6b 65 79 20 75 73 65 64 0a 2a 2a 20 74 6f 20 6c  key used.** to l
1320: 6f 63 61 74 65 20 61 20 70 61 72 74 69 63 75 6c  ocate a particul
1330: 61 72 20 6c 6f 63 6b 49 6e 66 6f 20 73 74 72 75  ar lockInfo stru
1340: 63 74 75 72 65 20 67 69 76 65 6e 20 69 74 73 20  cture given its 
1350: 69 6e 6f 64 65 2e 20 0a 2a 2f 0a 73 74 72 75 63  inode. .*/.struc
1360: 74 20 69 6e 6f 64 65 4b 65 79 20 7b 0a 20 20 64  t inodeKey {.  d
1370: 65 76 5f 74 20 64 65 76 3b 20 20 20 2f 2a 20 44  ev_t dev;   /* D
1380: 65 76 69 63 65 20 6e 75 6d 62 65 72 20 2a 2f 0a  evice number */.
1390: 20 20 69 6e 6f 5f 74 20 69 6e 6f 3b 20 20 20 2f    ino_t ino;   /
13a0: 2a 20 49 6e 6f 64 65 20 6e 75 6d 62 65 72 20 2a  * Inode number *
13b0: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69  /.};../*.** An i
13c0: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
13d0: 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75  ollowing structu
13e0: 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  re is allocated 
13f0: 66 6f 72 20 65 61 63 68 20 69 6e 6f 64 65 2e 0a  for each inode..
1400: 2a 2a 20 41 20 73 69 6e 67 6c 65 20 69 6e 6f 64  ** A single inod
1410: 65 20 63 61 6e 20 68 61 76 65 20 6d 75 6c 74 69  e can have multi
1420: 70 6c 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  ple file descrip
1430: 74 6f 72 73 2c 20 73 6f 20 65 61 63 68 20 4f 73  tors, so each Os
1440: 46 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74 75 72  File.** structur
1450: 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69  e contains a poi
1460: 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 73 74 61  nter to an insta
1470: 6e 63 65 20 6f 66 20 74 68 69 73 20 6f 62 6a 65  nce of this obje
1480: 63 74 20 61 6e 64 20 74 68 69 73 0a 2a 2a 20 6f  ct and this.** o
1490: 62 6a 65 63 74 20 6b 65 65 70 73 20 61 20 63 6f  bject keeps a co
14a0: 75 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  unt of the numbe
14b0: 72 20 6f 66 20 4f 73 46 69 6c 65 73 20 70 6f 69  r of OsFiles poi
14c0: 6e 74 69 6e 67 20 74 6f 20 69 74 2e 0a 2a 2f 0a  nting to it..*/.
14d0: 73 74 72 75 63 74 20 6c 6f 63 6b 49 6e 66 6f 20  struct lockInfo 
14e0: 7b 0a 20 20 73 74 72 75 63 74 20 69 6e 6f 64 65  {.  struct inode
14f0: 4b 65 79 20 6b 65 79 3b 20 20 2f 2a 20 54 68 65  Key key;  /* The
1500: 20 6c 6f 6f 6b 75 70 20 6b 65 79 20 2a 2f 0a 20   lookup key */. 
1510: 20 69 6e 74 20 63 6e 74 3b 20 20 20 20 20 20 20   int cnt;       
1520: 20 20 20 20 20 20 20 2f 2a 20 30 3a 20 75 6e 6c         /* 0: unl
1530: 6f 63 6b 65 64 2e 20 20 2d 31 3a 20 77 72 69 74  ocked.  -1: writ
1540: 65 20 6c 6f 63 6b 2e 20 20 31 2e 2e 2e 3a 20 72  e lock.  1...: r
1550: 65 61 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 69  ead lock. */.  i
1560: 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20  nt nRef;        
1570: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1580: 66 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74 68  f pointers to th
1590: 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  is structure */.
15a0: 7d 3b 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20  };../* .** This 
15b0: 68 61 73 68 20 74 61 62 6c 65 20 6d 61 70 73 20  hash table maps 
15c0: 69 6e 6f 64 65 73 20 28 69 6e 20 74 68 65 20 66  inodes (in the f
15d0: 6f 72 6d 20 6f 66 20 69 6e 6f 64 65 4b 65 79 20  orm of inodeKey 
15e0: 73 74 72 75 63 74 75 72 65 73 29 20 69 6e 74 6f  structures) into
15f0: 0a 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  .** pointers to 
1600: 6c 6f 63 6b 49 6e 66 6f 20 73 74 72 75 63 74 75  lockInfo structu
1610: 72 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 48  res..*/.static H
1620: 61 73 68 20 6c 6f 63 6b 48 61 73 68 20 3d 20 7b  ash lockHash = {
1630: 20 53 51 4c 49 54 45 5f 48 41 53 48 5f 42 49 4e   SQLITE_HASH_BIN
1640: 41 52 59 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  ARY, 0, 0, 0, 0,
1650: 20 30 20 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 47 69 76   0 };../*.** Giv
1660: 65 6e 20 61 20 66 69 6c 65 20 64 65 73 63 72 69  en a file descri
1670: 70 74 6f 72 2c 20 6c 6f 63 61 74 65 20 61 20 6c  ptor, locate a l
1680: 6f 63 6b 49 6e 66 6f 20 73 74 72 75 63 74 75 72  ockInfo structur
1690: 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  e that describes
16a0: 0a 2a 2a 20 74 68 61 74 20 66 69 6c 65 20 64 65  .** that file de
16b0: 73 63 72 69 70 74 6f 72 2e 20 20 43 72 65 61 74  scriptor.  Creat
16c0: 65 20 61 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e  e a new one if n
16d0: 65 63 65 73 73 61 72 79 2e 20 20 4e 55 4c 4c 20  ecessary.  NULL 
16e0: 6d 69 67 68 74 0a 2a 2a 20 62 65 20 72 65 74 75  might.** be retu
16f0: 72 6e 65 64 20 69 66 20 6d 61 6c 6c 6f 63 28 29  rned if malloc()
1700: 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69   fails..*/.stati
1710: 63 20 73 74 72 75 63 74 20 6c 6f 63 6b 49 6e 66  c struct lockInf
1720: 6f 20 2a 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28  o *findLockInfo(
1730: 69 6e 74 20 66 64 29 7b 0a 20 20 69 6e 74 20 72  int fd){.  int r
1740: 63 3b 0a 20 20 73 74 72 75 63 74 20 69 6e 6f 64  c;.  struct inod
1750: 65 4b 65 79 20 6b 65 79 3b 0a 20 20 73 74 72 75  eKey key;.  stru
1760: 63 74 20 73 74 61 74 20 73 74 61 74 62 75 66 3b  ct stat statbuf;
1770: 0a 20 20 73 74 72 75 63 74 20 6c 6f 63 6b 49 6e  .  struct lockIn
1780: 66 6f 20 2a 70 49 6e 66 6f 3b 0a 20 20 72 63 20  fo *pInfo;.  rc 
1790: 3d 20 66 73 74 61 74 28 66 64 2c 20 26 73 74 61  = fstat(fd, &sta
17a0: 74 62 75 66 29 3b 0a 20 20 69 66 28 20 72 63 21  tbuf);.  if( rc!
17b0: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
17c0: 20 6d 65 6d 73 65 74 28 26 6b 65 79 2c 20 30 2c   memset(&key, 0,
17d0: 20 73 69 7a 65 6f 66 28 6b 65 79 29 29 3b 0a 20   sizeof(key));. 
17e0: 20 6b 65 79 2e 64 65 76 20 3d 20 73 74 61 74 62   key.dev = statb
17f0: 75 66 2e 73 74 5f 64 65 76 3b 0a 20 20 6b 65 79  uf.st_dev;.  key
1800: 2e 69 6e 6f 20 3d 20 73 74 61 74 62 75 66 2e 73  .ino = statbuf.s
1810: 74 5f 69 6e 6f 3b 0a 20 20 70 49 6e 66 6f 20 3d  t_ino;.  pInfo =
1820: 20 28 73 74 72 75 63 74 20 6c 6f 63 6b 49 6e 66   (struct lockInf
1830: 6f 2a 29 73 71 6c 69 74 65 48 61 73 68 46 69 6e  o*)sqliteHashFin
1840: 64 28 26 6c 6f 63 6b 48 61 73 68 2c 20 26 6b 65  d(&lockHash, &ke
1850: 79 2c 20 73 69 7a 65 6f 66 28 6b 65 79 29 29 3b  y, sizeof(key));
1860: 0a 20 20 69 66 28 20 70 49 6e 66 6f 3d 3d 30 20  .  if( pInfo==0 
1870: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 6c 6f  ){.    struct lo
1880: 63 6b 49 6e 66 6f 20 2a 70 4f 6c 64 3b 0a 20 20  ckInfo *pOld;.  
1890: 20 20 70 49 6e 66 6f 20 3d 20 73 71 6c 69 74 65    pInfo = sqlite
18a0: 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a  Malloc( sizeof(*
18b0: 70 49 6e 66 6f 29 20 29 3b 0a 20 20 20 20 69 66  pInfo) );.    if
18c0: 28 20 70 49 6e 66 6f 3d 3d 30 20 29 20 72 65 74  ( pInfo==0 ) ret
18d0: 75 72 6e 20 30 3b 0a 20 20 20 20 70 49 6e 66 6f  urn 0;.    pInfo
18e0: 2d 3e 6b 65 79 20 3d 20 6b 65 79 3b 0a 20 20 20  ->key = key;.   
18f0: 20 70 49 6e 66 6f 2d 3e 6e 52 65 66 20 3d 20 31   pInfo->nRef = 1
1900: 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 63 6e 74  ;.    pInfo->cnt
1910: 20 3d 20 30 3b 0a 20 20 20 20 70 4f 6c 64 20 3d   = 0;.    pOld =
1920: 20 73 71 6c 69 74 65 48 61 73 68 49 6e 73 65 72   sqliteHashInser
1930: 74 28 26 6c 6f 63 6b 48 61 73 68 2c 20 26 70 49  t(&lockHash, &pI
1940: 6e 66 6f 2d 3e 6b 65 79 2c 20 73 69 7a 65 6f 66  nfo->key, sizeof
1950: 28 6b 65 79 29 2c 20 70 49 6e 66 6f 29 3b 0a 20  (key), pInfo);. 
1960: 20 20 20 69 66 28 20 70 4f 6c 64 21 3d 30 20 29     if( pOld!=0 )
1970: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1980: 70 4f 6c 64 3d 3d 70 49 6e 66 6f 20 29 3b 0a 20  pOld==pInfo );. 
1990: 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
19a0: 70 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 70 49  pInfo);.      pI
19b0: 6e 66 6f 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  nfo = 0;.    }. 
19c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e 66   }else{.    pInf
19d0: 6f 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20  o->nRef++;.  }. 
19e0: 20 72 65 74 75 72 6e 20 70 49 6e 66 6f 3b 0a 7d   return pInfo;.}
19f0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  ../*.** Release 
1a00: 61 20 6c 6f 63 6b 49 6e 66 6f 20 73 74 72 75 63  a lockInfo struc
1a10: 74 75 72 65 20 70 72 65 76 69 6f 75 73 6c 79 20  ture previously 
1a20: 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 66 69 6e  allocated by fin
1a30: 64 4c 6f 63 6b 49 6e 66 6f 28 29 2e 0a 2a 2f 0a  dLockInfo()..*/.
1a40: 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65  static void rele
1a50: 61 73 65 4c 6f 63 6b 49 6e 66 6f 28 73 74 72 75  aseLockInfo(stru
1a60: 63 74 20 6c 6f 63 6b 49 6e 66 6f 20 2a 70 49 6e  ct lockInfo *pIn
1a70: 66 6f 29 7b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 52  fo){.  pInfo->nR
1a80: 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 49 6e 66  ef--;.  if( pInf
1a90: 6f 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20  o->nRef==0 ){.  
1aa0: 20 20 73 71 6c 69 74 65 48 61 73 68 49 6e 73 65    sqliteHashInse
1ab0: 72 74 28 26 6c 6f 63 6b 48 61 73 68 2c 20 26 70  rt(&lockHash, &p
1ac0: 49 6e 66 6f 2d 3e 6b 65 79 2c 20 73 69 7a 65 6f  Info->key, sizeo
1ad0: 66 28 70 49 6e 66 6f 2d 3e 6b 65 79 29 2c 20 30  f(pInfo->key), 0
1ae0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
1af0: 65 28 70 49 6e 66 6f 29 3b 0a 20 20 7d 0a 7d 0a  e(pInfo);.  }.}.
1b00: 23 65 6e 64 69 66 20 20 2f 2a 2a 20 50 4f 53 49  #endif  /** POSI
1b10: 58 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 20  X advisory lock 
1b20: 77 6f 72 6b 2d 61 72 6f 75 6e 64 20 2a 2a 2f 0a  work-around **/.
1b30: 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20 63 6f 6d  ./*.** If we com
1b40: 70 69 6c 65 20 77 69 74 68 20 74 68 65 20 53 51  pile with the SQ
1b50: 4c 49 54 45 5f 54 45 53 54 20 6d 61 63 72 6f 20  LITE_TEST macro 
1b60: 73 65 74 2c 20 74 68 65 6e 20 74 68 65 20 66 6f  set, then the fo
1b70: 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 0a 2a 2a  llowing block.**
1b80: 20 6f 66 20 63 6f 64 65 20 77 69 6c 6c 20 67 69   of code will gi
1b90: 76 65 20 75 73 20 74 68 65 20 61 62 69 6c 69 74  ve us the abilit
1ba0: 79 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 61 20  y to simulate a 
1bb0: 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 2e 20  disk I/O error. 
1bc0: 20 54 68 69 73 0a 2a 2a 20 69 73 20 75 73 65 64   This.** is used
1bd0: 20 66 6f 72 20 74 65 73 74 69 6e 67 20 74 68 65   for testing the
1be0: 20 49 2f 4f 20 72 65 63 6f 76 65 72 79 20 6c 6f   I/O recovery lo
1bf0: 67 69 63 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  gic..*/.#ifdef S
1c00: 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73  QLITE_TEST.int s
1c10: 71 6c 69 74 65 5f 69 6f 5f 65 72 72 6f 72 5f 70  qlite_io_error_p
1c20: 65 6e 64 69 6e 67 20 3d 20 30 3b 0a 23 64 65 66  ending = 0;.#def
1c30: 69 6e 65 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ine SimulateIOEr
1c40: 72 6f 72 28 41 29 20 20 5c 0a 20 20 20 69 66 28  ror(A)  \.   if(
1c50: 20 73 71 6c 69 74 65 5f 69 6f 5f 65 72 72 6f 72   sqlite_io_error
1c60: 5f 70 65 6e 64 69 6e 67 20 29 20 5c 0a 20 20 20  _pending ) \.   
1c70: 20 20 69 66 28 20 73 71 6c 69 74 65 5f 69 6f 5f    if( sqlite_io_
1c80: 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 2d 2d 20  error_pending-- 
1c90: 3d 3d 20 31 20 29 7b 20 6c 6f 63 61 6c 5f 69 6f  == 1 ){ local_io
1ca0: 65 72 72 28 29 3b 20 72 65 74 75 72 6e 20 41 3b  err(); return A;
1cb0: 20 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c   }.static void l
1cc0: 6f 63 61 6c 5f 69 6f 65 72 72 28 29 7b 0a 20 20  ocal_ioerr(){.  
1cd0: 73 71 6c 69 74 65 5f 69 6f 5f 65 72 72 6f 72 5f  sqlite_io_error_
1ce0: 70 65 6e 64 69 6e 67 20 3d 20 30 3b 20 20 2f 2a  pending = 0;  /*
1cf0: 20 52 65 61 6c 6c 79 20 6a 75 73 74 20 61 20 70   Really just a p
1d00: 6c 61 63 65 20 74 6f 20 73 65 74 20 61 20 62 72  lace to set a br
1d10: 65 61 6b 70 6f 69 6e 74 20 2a 2f 0a 7d 0a 23 65  eakpoint */.}.#e
1d20: 6c 73 65 0a 23 64 65 66 69 6e 65 20 53 69 6d 75  lse.#define Simu
1d30: 6c 61 74 65 49 4f 45 72 72 6f 72 28 41 29 0a 23  lateIOError(A).#
1d40: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 68 65  endif../*.** Whe
1d50: 6e 20 74 65 73 74 69 6e 67 2c 20 6b 65 65 70 20  n testing, keep 
1d60: 61 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e  a count of the n
1d70: 75 6d 62 65 72 20 6f 66 20 6f 70 65 6e 20 66 69  umber of open fi
1d80: 6c 65 73 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  les..*/.#ifdef S
1d90: 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73  QLITE_TEST.int s
1da0: 71 6c 69 74 65 5f 6f 70 65 6e 5f 66 69 6c 65 5f  qlite_open_file_
1db0: 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 64 65 66 69  count = 0;.#defi
1dc0: 6e 65 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 58  ne OpenCounter(X
1dd0: 29 20 20 73 71 6c 69 74 65 5f 6f 70 65 6e 5f 66  )  sqlite_open_f
1de0: 69 6c 65 5f 63 6f 75 6e 74 2b 3d 28 58 29 0a 23  ile_count+=(X).#
1df0: 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 4f 70 65  else.#define Ope
1e00: 6e 43 6f 75 6e 74 65 72 28 58 29 0a 23 65 6e 64  nCounter(X).#end
1e10: 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  if.../*.** Delet
1e20: 65 20 74 68 65 20 6e 61 6d 65 64 20 66 69 6c 65  e the named file
1e30: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 4f 73  .*/.int sqliteOs
1e40: 44 65 6c 65 74 65 28 63 6f 6e 73 74 20 63 68 61  Delete(const cha
1e50: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 23  r *zFilename){.#
1e60: 69 66 20 4f 53 5f 55 4e 49 58 0a 20 20 75 6e 6c  if OS_UNIX.  unl
1e70: 69 6e 6b 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  ink(zFilename);.
1e80: 23 65 6e 64 69 66 0a 23 69 66 20 4f 53 5f 57 49  #endif.#if OS_WI
1e90: 4e 0a 20 20 44 65 6c 65 74 65 46 69 6c 65 28 7a  N.  DeleteFile(z
1ea0: 46 69 6c 65 6e 61 6d 65 29 3b 0a 23 65 6e 64 69  Filename);.#endi
1eb0: 66 0a 23 69 66 20 4f 53 5f 4d 41 43 0a 20 20 75  f.#if OS_MAC.  u
1ec0: 6e 6c 69 6e 6b 28 7a 46 69 6c 65 6e 61 6d 65 29  nlink(zFilename)
1ed0: 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  ;.#endif.  retur
1ee0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
1ef0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
1f00: 45 20 69 66 20 74 68 65 20 6e 61 6d 65 64 20 66  E if the named f
1f10: 69 6c 65 20 65 78 69 73 74 73 2e 0a 2a 2f 0a 69  ile exists..*/.i
1f20: 6e 74 20 73 71 6c 69 74 65 4f 73 46 69 6c 65 45  nt sqliteOsFileE
1f30: 78 69 73 74 73 28 63 6f 6e 73 74 20 63 68 61 72  xists(const char
1f40: 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 23 69   *zFilename){.#i
1f50: 66 20 4f 53 5f 55 4e 49 58 0a 20 20 72 65 74 75  f OS_UNIX.  retu
1f60: 72 6e 20 61 63 63 65 73 73 28 7a 46 69 6c 65 6e  rn access(zFilen
1f70: 61 6d 65 2c 20 30 29 3d 3d 30 3b 0a 23 65 6e 64  ame, 0)==0;.#end
1f80: 69 66 0a 23 69 66 20 4f 53 5f 57 49 4e 0a 20 20  if.#if OS_WIN.  
1f90: 72 65 74 75 72 6e 20 47 65 74 46 69 6c 65 41 74  return GetFileAt
1fa0: 74 72 69 62 75 74 65 73 28 7a 46 69 6c 65 6e 61  tributes(zFilena
1fb0: 6d 65 29 20 21 3d 20 30 78 66 66 66 66 66 66 66  me) != 0xfffffff
1fc0: 66 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f 53  f;.#endif.#if OS
1fd0: 5f 4d 41 43 0a 20 20 72 65 74 75 72 6e 20 61 63  _MAC.  return ac
1fe0: 63 65 73 73 28 7a 46 69 6c 65 6e 61 6d 65 2c 20  cess(zFilename, 
1ff0: 30 29 3d 3d 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a  0)==0;.#endif.}.
2000: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
2010: 68 65 20 6e 61 6d 65 20 6f 66 20 61 6e 20 65 78  he name of an ex
2020: 69 73 74 69 6e 67 20 66 69 6c 65 2e 0a 2a 2f 0a  isting file..*/.
2030: 69 6e 74 20 73 71 6c 69 74 65 4f 73 46 69 6c 65  int sqliteOsFile
2040: 52 65 6e 61 6d 65 28 63 6f 6e 73 74 20 63 68 61  Rename(const cha
2050: 72 20 2a 7a 4f 6c 64 4e 61 6d 65 2c 20 63 6f 6e  r *zOldName, con
2060: 73 74 20 63 68 61 72 20 2a 7a 4e 65 77 4e 61 6d  st char *zNewNam
2070: 65 29 7b 0a 23 69 66 20 4f 53 5f 55 4e 49 58 0a  e){.#if OS_UNIX.
2080: 20 20 69 66 28 20 6c 69 6e 6b 28 7a 4f 6c 64 4e    if( link(zOldN
2090: 61 6d 65 2c 20 7a 4e 65 77 4e 61 6d 65 29 20 29  ame, zNewName) )
20a0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
20b0: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  ITE_ERROR;.  }. 
20c0: 20 75 6e 6c 69 6e 6b 28 7a 4f 6c 64 4e 61 6d 65   unlink(zOldName
20d0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
20e0: 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 23 69  TE_OK;.#endif.#i
20f0: 66 20 4f 53 5f 57 49 4e 0a 20 20 69 66 28 20 21  f OS_WIN.  if( !
2100: 4d 6f 76 65 46 69 6c 65 28 7a 4f 6c 64 4e 61 6d  MoveFile(zOldNam
2110: 65 2c 20 7a 4e 65 77 4e 61 6d 65 29 20 29 7b 0a  e, zNewName) ){.
2120: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2130: 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72  E_ERROR;.  }.  r
2140: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2150: 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f 53 5f 4d  .#endif.#if OS_M
2160: 41 43 0a 20 20 2f 2a 2a 2a 2a 20 46 49 58 20 4d  AC.  /**** FIX M
2170: 45 20 2a 2a 2a 2f 0a 20 20 72 65 74 75 72 6e 20  E ***/.  return 
2180: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 23 65  SQLITE_ERROR;.#e
2190: 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41  ndif.}.../*.** A
21a0: 74 74 65 6d 70 74 20 74 6f 20 6f 70 65 6e 20 61  ttempt to open a
21b0: 20 66 69 6c 65 20 66 6f 72 20 62 6f 74 68 20 72   file for both r
21c0: 65 61 64 69 6e 67 20 61 6e 64 20 77 72 69 74 69  eading and writi
21d0: 6e 67 2e 20 20 49 66 20 74 68 61 74 0a 2a 2a 20  ng.  If that.** 
21e0: 66 61 69 6c 73 2c 20 74 72 79 20 6f 70 65 6e 69  fails, try openi
21f0: 6e 67 20 69 74 20 72 65 61 64 2d 6f 6e 6c 79 2e  ng it read-only.
2200: 20 20 49 66 20 74 68 65 20 66 69 6c 65 20 64 6f    If the file do
2210: 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 0a 2a 2a  es not exist,.**
2220: 20 74 72 79 20 74 6f 20 63 72 65 61 74 65 20 69   try to create i
2230: 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63  t..**.** On succ
2240: 65 73 73 2c 20 61 20 68 61 6e 64 6c 65 20 66 6f  ess, a handle fo
2250: 72 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20  r the open file 
2260: 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 69  is written to *i
2270: 64 0a 2a 2a 20 61 6e 64 20 2a 70 52 65 61 64 6f  d.** and *pReado
2280: 6e 6c 79 20 69 73 20 73 65 74 20 74 6f 20 30 20  nly is set to 0 
2290: 69 66 20 74 68 65 20 66 69 6c 65 20 77 61 73 20  if the file was 
22a0: 6f 70 65 6e 65 64 20 66 6f 72 20 72 65 61 64 69  opened for readi
22b0: 6e 67 20 61 6e 64 0a 2a 2a 20 77 72 69 74 69 6e  ng and.** writin
22c0: 67 20 6f 72 20 31 20 69 66 20 74 68 65 20 66 69  g or 1 if the fi
22d0: 6c 65 20 77 61 73 20 6f 70 65 6e 65 64 20 72 65  le was opened re
22e0: 61 64 2d 6f 6e 6c 79 2e 20 20 54 68 65 20 66 75  ad-only.  The fu
22f0: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 0a 2a  nction returns.*
2300: 2a 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a  * SQLITE_OK..**.
2310: 2a 2a 20 4f 6e 20 66 61 69 6c 75 72 65 2c 20 74  ** On failure, t
2320: 68 65 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  he function retu
2330: 72 6e 73 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  rns SQLITE_CANTO
2340: 50 45 4e 20 61 6e 64 20 6c 65 61 76 65 73 0a 2a  PEN and leaves.*
2350: 2a 20 2a 69 64 20 61 6e 64 20 2a 70 52 65 61 64  * *id and *pRead
2360: 6f 6e 6c 79 20 75 6e 63 68 61 6e 67 65 64 2e 0a  only unchanged..
2370: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 4f 73 4f  */.int sqliteOsO
2380: 70 65 6e 52 65 61 64 57 72 69 74 65 28 0a 20 20  penReadWrite(.  
2390: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
23a0: 65 6e 61 6d 65 2c 0a 20 20 4f 73 46 69 6c 65 20  ename,.  OsFile 
23b0: 2a 69 64 2c 0a 20 20 69 6e 74 20 2a 70 52 65 61  *id,.  int *pRea
23c0: 64 6f 6e 6c 79 0a 29 7b 0a 23 69 66 20 4f 53 5f  donly.){.#if OS_
23d0: 55 4e 49 58 0a 20 20 69 64 2d 3e 66 64 20 3d 20  UNIX.  id->fd = 
23e0: 6f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20  open(zFilename, 
23f0: 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 7c 4f  O_RDWR|O_CREAT|O
2400: 5f 4c 41 52 47 45 46 49 4c 45 2c 20 30 36 34 34  _LARGEFILE, 0644
2410: 29 3b 0a 20 20 69 66 28 20 69 64 2d 3e 66 64 3c  );.  if( id->fd<
2420: 30 20 29 7b 0a 20 20 20 20 69 64 2d 3e 66 64 20  0 ){.    id->fd 
2430: 3d 20 6f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d 65  = open(zFilename
2440: 2c 20 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 4c 41 52  , O_RDONLY|O_LAR
2450: 47 45 46 49 4c 45 29 3b 0a 20 20 20 20 69 66 28  GEFILE);.    if(
2460: 20 69 64 2d 3e 66 64 3c 30 20 29 7b 0a 20 20 20   id->fd<0 ){.   
2470: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2480: 5f 43 41 4e 54 4f 50 45 4e 3b 20 0a 20 20 20 20  _CANTOPEN; .    
2490: 7d 0a 20 20 20 20 2a 70 52 65 61 64 6f 6e 6c 79  }.    *pReadonly
24a0: 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 1;.  }else{. 
24b0: 20 20 20 2a 70 52 65 61 64 6f 6e 6c 79 20 3d 20     *pReadonly = 
24c0: 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 4f  0;.  }.  sqliteO
24d0: 73 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  sEnterMutex();. 
24e0: 20 69 64 2d 3e 70 4c 6f 63 6b 20 3d 20 66 69 6e   id->pLock = fin
24f0: 64 4c 6f 63 6b 49 6e 66 6f 28 69 64 2d 3e 66 64  dLockInfo(id->fd
2500: 29 3b 0a 20 20 73 71 6c 69 74 65 4f 73 4c 65 61  );.  sqliteOsLea
2510: 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 69 66 28  veMutex();.  if(
2520: 20 69 64 2d 3e 70 4c 6f 63 6b 3d 3d 30 20 29 7b   id->pLock==0 ){
2530: 0a 20 20 20 20 63 6c 6f 73 65 28 69 64 2d 3e 66  .    close(id->f
2540: 64 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  d);.    return S
2550: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
2560: 0a 20 20 69 64 2d 3e 6c 6f 63 6b 65 64 20 3d 20  .  id->locked = 
2570: 30 3b 0a 20 20 54 52 41 43 45 33 28 22 4f 50 45  0;.  TRACE3("OPE
2580: 4e 20 20 20 20 25 2d 33 64 20 25 73 5c 6e 22 2c  N    %-3d %s\n",
2590: 20 69 64 2d 3e 66 64 2c 20 7a 46 69 6c 65 6e 61   id->fd, zFilena
25a0: 6d 65 29 3b 0a 20 20 4f 70 65 6e 43 6f 75 6e 74  me);.  OpenCount
25b0: 65 72 28 2b 31 29 3b 0a 20 20 72 65 74 75 72 6e  er(+1);.  return
25c0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64   SQLITE_OK;.#end
25d0: 69 66 0a 23 69 66 20 4f 53 5f 57 49 4e 0a 20 20  if.#if OS_WIN.  
25e0: 48 41 4e 44 4c 45 20 68 20 3d 20 43 72 65 61 74  HANDLE h = Creat
25f0: 65 46 69 6c 65 28 7a 46 69 6c 65 6e 61 6d 65 2c  eFile(zFilename,
2600: 0a 20 20 20 20 20 47 45 4e 45 52 49 43 5f 52 45  .     GENERIC_RE
2610: 41 44 20 7c 20 47 45 4e 45 52 49 43 5f 57 52 49  AD | GENERIC_WRI
2620: 54 45 2c 0a 20 20 20 20 20 46 49 4c 45 5f 53 48  TE,.     FILE_SH
2630: 41 52 45 5f 52 45 41 44 20 7c 20 46 49 4c 45 5f  ARE_READ | FILE_
2640: 53 48 41 52 45 5f 57 52 49 54 45 2c 0a 20 20 20  SHARE_WRITE,.   
2650: 20 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 4f 50 45    NULL,.     OPE
2660: 4e 5f 41 4c 57 41 59 53 2c 0a 20 20 20 20 20 46  N_ALWAYS,.     F
2670: 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f 4e 4f  ILE_ATTRIBUTE_NO
2680: 52 4d 41 4c 20 7c 20 46 49 4c 45 5f 46 4c 41 47  RMAL | FILE_FLAG
2690: 5f 52 41 4e 44 4f 4d 5f 41 43 43 45 53 53 2c 0a  _RANDOM_ACCESS,.
26a0: 20 20 20 20 20 4e 55 4c 4c 0a 20 20 29 3b 0a 20       NULL.  );. 
26b0: 20 69 66 28 20 68 3d 3d 49 4e 56 41 4c 49 44 5f   if( h==INVALID_
26c0: 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 7b 0a  HANDLE_VALUE ){.
26d0: 20 20 20 20 68 20 3d 20 43 72 65 61 74 65 46 69      h = CreateFi
26e0: 6c 65 28 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20  le(zFilename,.  
26f0: 20 20 20 20 20 47 45 4e 45 52 49 43 5f 52 45 41       GENERIC_REA
2700: 44 2c 0a 20 20 20 20 20 20 20 46 49 4c 45 5f 53  D,.       FILE_S
2710: 48 41 52 45 5f 52 45 41 44 2c 0a 20 20 20 20 20  HARE_READ,.     
2720: 20 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 4f    NULL,.       O
2730: 50 45 4e 5f 41 4c 57 41 59 53 2c 0a 20 20 20 20  PEN_ALWAYS,.    
2740: 20 20 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54     FILE_ATTRIBUT
2750: 45 5f 4e 4f 52 4d 41 4c 20 7c 20 46 49 4c 45 5f  E_NORMAL | FILE_
2760: 46 4c 41 47 5f 52 41 4e 44 4f 4d 5f 41 43 43 45  FLAG_RANDOM_ACCE
2770: 53 53 2c 0a 20 20 20 20 20 20 20 4e 55 4c 4c 0a  SS,.       NULL.
2780: 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 68      );.    if( h
2790: 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  ==INVALID_HANDLE
27a0: 5f 56 41 4c 55 45 20 29 7b 0a 20 20 20 20 20 20  _VALUE ){.      
27b0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41  return SQLITE_CA
27c0: 4e 54 4f 50 45 4e 3b 0a 20 20 20 20 7d 0a 20 20  NTOPEN;.    }.  
27d0: 20 20 2a 70 52 65 61 64 6f 6e 6c 79 20 3d 20 31    *pReadonly = 1
27e0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a  ;.  }else{.    *
27f0: 70 52 65 61 64 6f 6e 6c 79 20 3d 20 30 3b 0a 20  pReadonly = 0;. 
2800: 20 7d 0a 20 20 69 64 2d 3e 68 20 3d 20 68 3b 0a   }.  id->h = h;.
2810: 20 20 69 64 2d 3e 6c 6f 63 6b 65 64 20 3d 20 30    id->locked = 0
2820: 3b 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28  ;.  OpenCounter(
2830: 2b 31 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  +1);.  return SQ
2840: 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a  LITE_OK;.#endif.
2850: 23 69 66 20 4f 53 5f 4d 41 43 0a 20 20 46 53 53  #if OS_MAC.  FSS
2860: 70 65 63 20 66 73 53 70 65 63 3b 0a 23 20 69 66  pec fsSpec;.# if
2870: 64 65 66 20 5f 4c 41 52 47 45 5f 46 49 4c 45 0a  def _LARGE_FILE.
2880: 20 20 48 46 53 55 6e 69 53 74 72 32 35 35 20 64    HFSUniStr255 d
2890: 66 4e 61 6d 65 3b 0a 20 20 46 53 52 65 66 20 66  fName;.  FSRef f
28a0: 73 52 65 66 3b 0a 20 20 69 66 28 20 5f 5f 70 61  sRef;.  if( __pa
28b0: 74 68 32 66 73 73 28 7a 46 69 6c 65 6e 61 6d 65  th2fss(zFilename
28c0: 2c 20 26 66 73 53 70 65 63 29 20 21 3d 20 6e 6f  , &fsSpec) != no
28d0: 45 72 72 20 29 7b 0a 20 20 20 20 69 66 28 20 48  Err ){.    if( H
28e0: 43 72 65 61 74 65 28 66 73 53 70 65 63 2e 76 52  Create(fsSpec.vR
28f0: 65 66 4e 75 6d 2c 20 66 73 53 70 65 63 2e 70 61  efNum, fsSpec.pa
2900: 72 49 44 2c 20 66 73 53 70 65 63 2e 6e 61 6d 65  rID, fsSpec.name
2910: 2c 20 27 53 51 4c 49 27 2c 20 63 44 6f 63 75 6d  , 'SQLI', cDocum
2920: 65 6e 74 46 69 6c 65 29 20 21 3d 20 6e 6f 45 72  entFile) != noEr
2930: 72 20 29 0a 20 20 20 20 20 20 72 65 74 75 72 6e  r ).      return
2940: 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
2950: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 46 53 70 4d  ;.  }.  if( FSpM
2960: 61 6b 65 46 53 52 65 66 28 26 66 73 53 70 65 63  akeFSRef(&fsSpec
2970: 2c 20 26 66 73 52 65 66 29 20 21 3d 20 6e 6f 45  , &fsRef) != noE
2980: 72 72 20 29 0a 20 20 20 20 72 65 74 75 72 6e 20  rr ).    return 
2990: 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b  SQLITE_CANTOPEN;
29a0: 0a 20 20 46 53 47 65 74 44 61 74 61 46 6f 72 6b  .  FSGetDataFork
29b0: 4e 61 6d 65 28 26 64 66 4e 61 6d 65 29 3b 0a 20  Name(&dfName);. 
29c0: 20 69 66 28 20 46 53 4f 70 65 6e 46 6f 72 6b 28   if( FSOpenFork(
29d0: 26 66 73 52 65 66 2c 20 64 66 4e 61 6d 65 2e 6c  &fsRef, dfName.l
29e0: 65 6e 67 74 68 2c 20 64 66 4e 61 6d 65 2e 75 6e  ength, dfName.un
29f0: 69 63 6f 64 65 2c 0a 20 20 20 20 20 20 20 20 20  icode,.         
2a00: 20 20 20 20 20 20 20 20 66 73 52 64 57 72 53 68          fsRdWrSh
2a10: 50 65 72 6d 2c 20 26 28 69 64 2d 3e 72 65 66 4e  Perm, &(id->refN
2a20: 75 6d 29 29 20 21 3d 20 6e 6f 45 72 72 20 29 7b  um)) != noErr ){
2a30: 0a 20 20 20 20 69 66 28 20 46 53 4f 70 65 6e 46  .    if( FSOpenF
2a40: 6f 72 6b 28 26 66 73 52 65 66 2c 20 64 66 4e 61  ork(&fsRef, dfNa
2a50: 6d 65 2e 6c 65 6e 67 74 68 2c 20 64 66 4e 61 6d  me.length, dfNam
2a60: 65 2e 75 6e 69 63 6f 64 65 2c 0a 20 20 20 20 20  e.unicode,.     
2a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 73                fs
2a80: 52 64 57 72 50 65 72 6d 2c 20 26 28 69 64 2d 3e  RdWrPerm, &(id->
2a90: 72 65 66 4e 75 6d 29 29 20 21 3d 20 6e 6f 45 72  refNum)) != noEr
2aa0: 72 20 29 7b 0a 20 20 20 20 20 20 69 66 20 28 46  r ){.      if (F
2ab0: 53 4f 70 65 6e 46 6f 72 6b 28 26 66 73 52 65 66  SOpenFork(&fsRef
2ac0: 2c 20 64 66 4e 61 6d 65 2e 6c 65 6e 67 74 68 2c  , dfName.length,
2ad0: 20 64 66 4e 61 6d 65 2e 75 6e 69 63 6f 64 65 2c   dfName.unicode,
2ae0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2af0: 20 20 20 20 66 73 52 64 50 65 72 6d 2c 20 26 28      fsRdPerm, &(
2b00: 69 64 2d 3e 72 65 66 4e 75 6d 29 29 20 21 3d 20  id->refNum)) != 
2b10: 6e 6f 45 72 72 20 29 0a 20 20 20 20 20 20 20 20  noErr ).        
2b20: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41  return SQLITE_CA
2b30: 4e 54 4f 50 45 4e 3b 0a 20 20 20 20 20 20 65 6c  NTOPEN;.      el
2b40: 73 65 0a 20 20 20 20 20 20 20 20 2a 70 52 65 61  se.        *pRea
2b50: 64 6f 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20 7d  donly = 1;.    }
2b60: 20 65 6c 73 65 0a 20 20 20 20 20 20 2a 70 52 65   else.      *pRe
2b70: 61 64 6f 6e 6c 79 20 3d 20 30 3b 0a 20 20 7d 20  adonly = 0;.  } 
2b80: 65 6c 73 65 0a 20 20 20 20 2a 70 52 65 61 64 6f  else.    *pReado
2b90: 6e 6c 79 20 3d 20 30 3b 0a 23 20 65 6c 73 65 0a  nly = 0;.# else.
2ba0: 20 20 5f 5f 70 61 74 68 32 66 73 73 28 7a 46 69    __path2fss(zFi
2bb0: 6c 65 6e 61 6d 65 2c 20 26 66 73 53 70 65 63 29  lename, &fsSpec)
2bc0: 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 4f  ;.  if( !sqliteO
2bd0: 73 46 69 6c 65 45 78 69 73 74 73 28 7a 46 69 6c  sFileExists(zFil
2be0: 65 6e 61 6d 65 29 20 29 7b 0a 20 20 20 20 69 66  ename) ){.    if
2bf0: 28 20 48 43 72 65 61 74 65 28 66 73 53 70 65 63  ( HCreate(fsSpec
2c00: 2e 76 52 65 66 4e 75 6d 2c 20 66 73 53 70 65 63  .vRefNum, fsSpec
2c10: 2e 70 61 72 49 44 2c 20 66 73 53 70 65 63 2e 6e  .parID, fsSpec.n
2c20: 61 6d 65 2c 20 27 53 51 4c 49 27 2c 20 63 44 6f  ame, 'SQLI', cDo
2c30: 63 75 6d 65 6e 74 46 69 6c 65 29 20 21 3d 20 6e  cumentFile) != n
2c40: 6f 45 72 72 20 29 0a 20 20 20 20 20 20 72 65 74  oErr ).      ret
2c50: 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  urn SQLITE_CANTO
2c60: 50 45 4e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 48  PEN;.  }.  if( H
2c70: 4f 70 65 6e 44 46 28 66 73 53 70 65 63 2e 76 52  OpenDF(fsSpec.vR
2c80: 65 66 4e 75 6d 2c 20 66 73 53 70 65 63 2e 70 61  efNum, fsSpec.pa
2c90: 72 49 44 2c 20 66 73 53 70 65 63 2e 6e 61 6d 65  rID, fsSpec.name
2ca0: 2c 20 66 73 52 64 57 72 53 68 50 65 72 6d 2c 20  , fsRdWrShPerm, 
2cb0: 26 28 69 64 2d 3e 72 65 66 4e 75 6d 29 29 20 21  &(id->refNum)) !
2cc0: 3d 20 6e 6f 45 72 72 20 29 7b 0a 20 20 20 20 69  = noErr ){.    i
2cd0: 66 28 20 48 4f 70 65 6e 44 46 28 66 73 53 70 65  f( HOpenDF(fsSpe
2ce0: 63 2e 76 52 65 66 4e 75 6d 2c 20 66 73 53 70 65  c.vRefNum, fsSpe
2cf0: 63 2e 70 61 72 49 44 2c 20 66 73 53 70 65 63 2e  c.parID, fsSpec.
2d00: 6e 61 6d 65 2c 20 66 73 52 64 57 72 50 65 72 6d  name, fsRdWrPerm
2d10: 2c 20 26 28 69 64 2d 3e 72 65 66 4e 75 6d 29 29  , &(id->refNum))
2d20: 20 21 3d 20 6e 6f 45 72 72 20 29 7b 0a 20 20 20   != noErr ){.   
2d30: 20 20 20 69 66 28 20 48 4f 70 65 6e 44 46 28 66     if( HOpenDF(f
2d40: 73 53 70 65 63 2e 76 52 65 66 4e 75 6d 2c 20 66  sSpec.vRefNum, f
2d50: 73 53 70 65 63 2e 70 61 72 49 44 2c 20 66 73 53  sSpec.parID, fsS
2d60: 70 65 63 2e 6e 61 6d 65 2c 20 66 73 52 64 50 65  pec.name, fsRdPe
2d70: 72 6d 2c 20 26 28 69 64 2d 3e 72 65 66 4e 75 6d  rm, &(id->refNum
2d80: 29 29 20 21 3d 20 6e 6f 45 72 72 20 29 0a 20 20  )) != noErr ).  
2d90: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
2da0: 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20  ITE_CANTOPEN;.  
2db0: 20 20 20 20 65 6c 73 65 0a 20 20 20 20 20 20 20      else.       
2dc0: 20 2a 70 52 65 61 64 6f 6e 6c 79 20 3d 20 31 3b   *pReadonly = 1;
2dd0: 0a 20 20 20 20 7d 20 65 6c 73 65 0a 20 20 20 20  .    } else.    
2de0: 20 20 2a 70 52 65 61 64 6f 6e 6c 79 20 3d 20 30    *pReadonly = 0
2df0: 3b 0a 20 20 7d 20 65 6c 73 65 0a 20 20 20 20 2a  ;.  } else.    *
2e00: 70 52 65 61 64 6f 6e 6c 79 20 3d 20 30 3b 0a 23  pReadonly = 0;.#
2e10: 20 65 6e 64 69 66 0a 20 20 69 66 28 20 48 4f 70   endif.  if( HOp
2e20: 65 6e 52 46 28 66 73 53 70 65 63 2e 76 52 65 66  enRF(fsSpec.vRef
2e30: 4e 75 6d 2c 20 66 73 53 70 65 63 2e 70 61 72 49  Num, fsSpec.parI
2e40: 44 2c 20 66 73 53 70 65 63 2e 6e 61 6d 65 2c 20  D, fsSpec.name, 
2e50: 66 73 52 64 57 72 53 68 50 65 72 6d 2c 20 26 28  fsRdWrShPerm, &(
2e60: 69 64 2d 3e 72 65 66 4e 75 6d 52 46 29 29 20 21  id->refNumRF)) !
2e70: 3d 20 6e 6f 45 72 72 29 7b 0a 20 20 20 20 69 64  = noErr){.    id
2e80: 2d 3e 72 65 66 4e 75 6d 52 46 20 3d 20 2d 31 3b  ->refNumRF = -1;
2e90: 0a 20 20 7d 0a 20 20 69 64 2d 3e 6c 6f 63 6b 65  .  }.  id->locke
2ea0: 64 20 3d 20 30 3b 0a 20 20 69 64 2d 3e 64 65 6c  d = 0;.  id->del
2eb0: 4f 6e 43 6c 6f 73 65 20 3d 20 30 3b 0a 20 20 4f  OnClose = 0;.  O
2ec0: 70 65 6e 43 6f 75 6e 74 65 72 28 2b 31 29 3b 0a  penCounter(+1);.
2ed0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2ee0: 4f 4b 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f  OK;.#endif.}.../
2ef0: 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20  *.** Attempt to 
2f00: 6f 70 65 6e 20 61 20 6e 65 77 20 66 69 6c 65 20  open a new file 
2f10: 66 6f 72 20 65 78 63 6c 75 73 69 76 65 20 61 63  for exclusive ac
2f20: 63 65 73 73 20 62 79 20 74 68 69 73 20 70 72 6f  cess by this pro
2f30: 63 65 73 73 2e 0a 2a 2a 20 54 68 65 20 66 69 6c  cess..** The fil
2f40: 65 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e 65 64  e will be opened
2f50: 20 66 6f 72 20 62 6f 74 68 20 72 65 61 64 69 6e   for both readin
2f60: 67 20 61 6e 64 20 77 72 69 74 69 6e 67 2e 20 20  g and writing.  
2f70: 54 6f 20 61 76 6f 69 64 0a 2a 2a 20 61 20 70 6f  To avoid.** a po
2f80: 74 65 6e 74 69 61 6c 20 73 65 63 75 72 69 74 79  tential security
2f90: 20 70 72 6f 62 6c 65 6d 2c 20 77 65 20 64 6f 20   problem, we do 
2fa0: 6e 6f 74 20 61 6c 6c 6f 77 20 74 68 65 20 66 69  not allow the fi
2fb0: 6c 65 20 74 6f 20 68 61 76 65 0a 2a 2a 20 70 72  le to have.** pr
2fc0: 65 76 69 6f 75 73 6c 79 20 65 78 69 73 74 65 64  eviously existed
2fd0: 2e 20 20 4e 6f 72 20 64 6f 20 77 65 20 61 6c 6c  .  Nor do we all
2fe0: 6f 77 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62  ow the file to b
2ff0: 65 20 61 20 73 79 6d 62 6f 6c 69 63 0a 2a 2a 20  e a symbolic.** 
3000: 6c 69 6e 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64  link..**.** If d
3010: 65 6c 46 6c 61 67 20 69 73 20 74 72 75 65 2c 20  elFlag is true, 
3020: 74 68 65 6e 20 6d 61 6b 65 20 61 72 72 61 6e 67  then make arrang
3030: 65 6d 65 6e 74 73 20 74 6f 20 61 75 74 6f 6d 61  ements to automa
3040: 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 0a 2a  tically delete.*
3050: 2a 20 74 68 65 20 66 69 6c 65 20 77 68 65 6e 20  * the file when 
3060: 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a  it is closed..**
3070: 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20  .** On success, 
3080: 77 72 69 74 65 20 74 68 65 20 66 69 6c 65 20 68  write the file h
3090: 61 6e 64 6c 65 20 69 6e 74 6f 20 2a 69 64 20 61  andle into *id a
30a0: 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
30b0: 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 66 61  _OK..**.** On fa
30c0: 69 6c 75 72 65 2c 20 72 65 74 75 72 6e 20 53 51  ilure, return SQ
30d0: 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 2e 0a 2a  LITE_CANTOPEN..*
30e0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 4f 73 4f 70  /.int sqliteOsOp
30f0: 65 6e 45 78 63 6c 75 73 69 76 65 28 63 6f 6e 73  enExclusive(cons
3100: 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
3110: 65 2c 20 4f 73 46 69 6c 65 20 2a 69 64 2c 20 69  e, OsFile *id, i
3120: 6e 74 20 64 65 6c 46 6c 61 67 29 7b 0a 23 69 66  nt delFlag){.#if
3130: 20 4f 53 5f 55 4e 49 58 0a 20 20 69 66 28 20 61   OS_UNIX.  if( a
3140: 63 63 65 73 73 28 7a 46 69 6c 65 6e 61 6d 65 2c  ccess(zFilename,
3150: 20 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65   0)==0 ){.    re
3160: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54  turn SQLITE_CANT
3170: 4f 50 45 4e 3b 0a 20 20 7d 0a 20 20 69 64 2d 3e  OPEN;.  }.  id->
3180: 66 64 20 3d 20 6f 70 65 6e 28 7a 46 69 6c 65 6e  fd = open(zFilen
3190: 61 6d 65 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43 52  ame, O_RDWR|O_CR
31a0: 45 41 54 7c 4f 5f 45 58 43 4c 7c 4f 5f 4e 4f 46  EAT|O_EXCL|O_NOF
31b0: 4f 4c 4c 4f 57 7c 4f 5f 4c 41 52 47 45 46 49 4c  OLLOW|O_LARGEFIL
31c0: 45 2c 20 30 36 30 30 29 3b 0a 20 20 69 66 28 20  E, 0600);.  if( 
31d0: 69 64 2d 3e 66 64 3c 30 20 29 7b 0a 20 20 20 20  id->fd<0 ){.    
31e0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41  return SQLITE_CA
31f0: 4e 54 4f 50 45 4e 3b 0a 20 20 7d 0a 20 20 73 71  NTOPEN;.  }.  sq
3200: 6c 69 74 65 4f 73 45 6e 74 65 72 4d 75 74 65 78  liteOsEnterMutex
3210: 28 29 3b 0a 20 20 69 64 2d 3e 70 4c 6f 63 6b 20  ();.  id->pLock 
3220: 3d 20 66 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28 69  = findLockInfo(i
3230: 64 2d 3e 66 64 29 3b 0a 20 20 73 71 6c 69 74 65  d->fd);.  sqlite
3240: 4f 73 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  OsLeaveMutex();.
3250: 20 20 69 66 28 20 69 64 2d 3e 70 4c 6f 63 6b 3d    if( id->pLock=
3260: 3d 30 20 29 7b 0a 20 20 20 20 63 6c 6f 73 65 28  =0 ){.    close(
3270: 69 64 2d 3e 66 64 29 3b 0a 20 20 20 20 75 6e 6c  id->fd);.    unl
3280: 69 6e 6b 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  ink(zFilename);.
3290: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
32a0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69  E_NOMEM;.  }.  i
32b0: 64 2d 3e 6c 6f 63 6b 65 64 20 3d 20 30 3b 0a 20  d->locked = 0;. 
32c0: 20 69 66 28 20 64 65 6c 46 6c 61 67 20 29 7b 0a   if( delFlag ){.
32d0: 20 20 20 20 75 6e 6c 69 6e 6b 28 7a 46 69 6c 65      unlink(zFile
32e0: 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 54 52 41  name);.  }.  TRA
32f0: 43 45 33 28 22 4f 50 45 4e 2d 45 58 20 25 2d 33  CE3("OPEN-EX %-3
3300: 64 20 25 73 5c 6e 22 2c 20 69 64 2d 3e 66 64 2c  d %s\n", id->fd,
3310: 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 4f   zFilename);.  O
3320: 70 65 6e 43 6f 75 6e 74 65 72 28 2b 31 29 3b 0a  penCounter(+1);.
3330: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
3340: 4f 4b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f  OK;.#endif.#if O
3350: 53 5f 57 49 4e 0a 20 20 48 41 4e 44 4c 45 20 68  S_WIN.  HANDLE h
3360: 3b 0a 20 20 69 6e 74 20 66 69 6c 65 66 6c 61 67  ;.  int fileflag
3370: 73 3b 0a 20 20 69 66 28 20 64 65 6c 46 6c 61 67  s;.  if( delFlag
3380: 20 29 7b 0a 20 20 20 20 66 69 6c 65 66 6c 61 67   ){.    fileflag
3390: 73 20 3d 20 46 49 4c 45 5f 41 54 54 52 49 42 55  s = FILE_ATTRIBU
33a0: 54 45 5f 54 45 4d 50 4f 52 41 52 59 20 7c 20 46  TE_TEMPORARY | F
33b0: 49 4c 45 5f 46 4c 41 47 5f 52 41 4e 44 4f 4d 5f  ILE_FLAG_RANDOM_
33c0: 41 43 43 45 53 53 20 0a 20 20 20 20 20 20 20 20  ACCESS .        
33d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 46               | F
33e0: 49 4c 45 5f 46 4c 41 47 5f 44 45 4c 45 54 45 5f  ILE_FLAG_DELETE_
33f0: 4f 4e 5f 43 4c 4f 53 45 3b 0a 20 20 7d 65 6c 73  ON_CLOSE;.  }els
3400: 65 7b 0a 20 20 20 20 66 69 6c 65 66 6c 61 67 73  e{.    fileflags
3410: 20 3d 20 46 49 4c 45 5f 46 4c 41 47 5f 52 41 4e   = FILE_FLAG_RAN
3420: 44 4f 4d 5f 41 43 43 45 53 53 3b 0a 20 20 7d 0a  DOM_ACCESS;.  }.
3430: 20 20 68 20 3d 20 43 72 65 61 74 65 46 69 6c 65    h = CreateFile
3440: 28 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20  (zFilename,.    
3450: 20 47 45 4e 45 52 49 43 5f 52 45 41 44 20 7c 20   GENERIC_READ | 
3460: 47 45 4e 45 52 49 43 5f 57 52 49 54 45 2c 0a 20  GENERIC_WRITE,. 
3470: 20 20 20 20 30 2c 0a 20 20 20 20 20 4e 55 4c 4c      0,.     NULL
3480: 2c 0a 20 20 20 20 20 43 52 45 41 54 45 5f 41 4c  ,.     CREATE_AL
3490: 57 41 59 53 2c 0a 20 20 20 20 20 66 69 6c 65 66  WAYS,.     filef
34a0: 6c 61 67 73 2c 0a 20 20 20 20 20 4e 55 4c 4c 0a  lags,.     NULL.
34b0: 20 20 29 3b 0a 20 20 69 66 28 20 68 3d 3d 49 4e    );.  if( h==IN
34c0: 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c  VALID_HANDLE_VAL
34d0: 55 45 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  UE ){.    return
34e0: 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
34f0: 3b 0a 20 20 7d 0a 20 20 69 64 2d 3e 68 20 3d 20  ;.  }.  id->h = 
3500: 68 3b 0a 20 20 69 64 2d 3e 6c 6f 63 6b 65 64 20  h;.  id->locked 
3510: 3d 20 30 3b 0a 20 20 4f 70 65 6e 43 6f 75 6e 74  = 0;.  OpenCount
3520: 65 72 28 2b 31 29 3b 0a 20 20 72 65 74 75 72 6e  er(+1);.  return
3530: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64   SQLITE_OK;.#end
3540: 69 66 0a 23 69 66 20 4f 53 5f 4d 41 43 0a 20 20  if.#if OS_MAC.  
3550: 46 53 53 70 65 63 20 66 73 53 70 65 63 3b 0a 23  FSSpec fsSpec;.#
3560: 20 69 66 64 65 66 20 5f 4c 41 52 47 45 5f 46 49   ifdef _LARGE_FI
3570: 4c 45 0a 20 20 48 46 53 55 6e 69 53 74 72 32 35  LE.  HFSUniStr25
3580: 35 20 64 66 4e 61 6d 65 3b 0a 20 20 46 53 52 65  5 dfName;.  FSRe
3590: 66 20 66 73 52 65 66 3b 0a 20 20 5f 5f 70 61 74  f fsRef;.  __pat
35a0: 68 32 66 73 73 28 7a 46 69 6c 65 6e 61 6d 65 2c  h2fss(zFilename,
35b0: 20 26 66 73 53 70 65 63 29 3b 0a 20 20 69 66 28   &fsSpec);.  if(
35c0: 20 48 43 72 65 61 74 65 28 66 73 53 70 65 63 2e   HCreate(fsSpec.
35d0: 76 52 65 66 4e 75 6d 2c 20 66 73 53 70 65 63 2e  vRefNum, fsSpec.
35e0: 70 61 72 49 44 2c 20 66 73 53 70 65 63 2e 6e 61  parID, fsSpec.na
35f0: 6d 65 2c 20 27 53 51 4c 49 27 2c 20 63 44 6f 63  me, 'SQLI', cDoc
3600: 75 6d 65 6e 74 46 69 6c 65 29 20 21 3d 20 6e 6f  umentFile) != no
3610: 45 72 72 20 29 0a 20 20 20 20 72 65 74 75 72 6e  Err ).    return
3620: 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
3630: 3b 0a 20 20 69 66 28 20 46 53 70 4d 61 6b 65 46  ;.  if( FSpMakeF
3640: 53 52 65 66 28 26 66 73 53 70 65 63 2c 20 26 66  SRef(&fsSpec, &f
3650: 73 52 65 66 29 20 21 3d 20 6e 6f 45 72 72 20 29  sRef) != noErr )
3660: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
3670: 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 46  TE_CANTOPEN;.  F
3680: 53 47 65 74 44 61 74 61 46 6f 72 6b 4e 61 6d 65  SGetDataForkName
3690: 28 26 64 66 4e 61 6d 65 29 3b 0a 20 20 69 66 28  (&dfName);.  if(
36a0: 20 46 53 4f 70 65 6e 46 6f 72 6b 28 26 66 73 52   FSOpenFork(&fsR
36b0: 65 66 2c 20 64 66 4e 61 6d 65 2e 6c 65 6e 67 74  ef, dfName.lengt
36c0: 68 2c 20 64 66 4e 61 6d 65 2e 75 6e 69 63 6f 64  h, dfName.unicod
36d0: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
36e0: 20 20 20 20 66 73 52 64 57 72 50 65 72 6d 2c 20      fsRdWrPerm, 
36f0: 26 28 69 64 2d 3e 72 65 66 4e 75 6d 29 29 20 21  &(id->refNum)) !
3700: 3d 20 6e 6f 45 72 72 20 29 0a 20 20 20 20 72 65  = noErr ).    re
3710: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54  turn SQLITE_CANT
3720: 4f 50 45 4e 3b 0a 23 20 65 6c 73 65 0a 20 20 5f  OPEN;.# else.  _
3730: 5f 70 61 74 68 32 66 73 73 28 7a 46 69 6c 65 6e  _path2fss(zFilen
3740: 61 6d 65 2c 20 26 66 73 53 70 65 63 29 3b 0a 20  ame, &fsSpec);. 
3750: 20 69 66 28 20 48 43 72 65 61 74 65 28 66 73 53   if( HCreate(fsS
3760: 70 65 63 2e 76 52 65 66 4e 75 6d 2c 20 66 73 53  pec.vRefNum, fsS
3770: 70 65 63 2e 70 61 72 49 44 2c 20 66 73 53 70 65  pec.parID, fsSpe
3780: 63 2e 6e 61 6d 65 2c 20 27 53 51 4c 49 27 2c 20  c.name, 'SQLI', 
3790: 63 44 6f 63 75 6d 65 6e 74 46 69 6c 65 29 20 21  cDocumentFile) !
37a0: 3d 20 6e 6f 45 72 72 20 29 0a 20 20 20 20 72 65  = noErr ).    re
37b0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54  turn SQLITE_CANT
37c0: 4f 50 45 4e 3b 0a 20 20 69 66 28 20 48 4f 70 65  OPEN;.  if( HOpe
37d0: 6e 44 46 28 66 73 53 70 65 63 2e 76 52 65 66 4e  nDF(fsSpec.vRefN
37e0: 75 6d 2c 20 66 73 53 70 65 63 2e 70 61 72 49 44  um, fsSpec.parID
37f0: 2c 20 66 73 53 70 65 63 2e 6e 61 6d 65 2c 20 66  , fsSpec.name, f
3800: 73 52 64 57 72 50 65 72 6d 2c 20 26 28 69 64 2d  sRdWrPerm, &(id-
3810: 3e 72 65 66 4e 75 6d 29 29 20 21 3d 20 6e 6f 45  >refNum)) != noE
3820: 72 72 20 29 0a 20 20 20 20 72 65 74 75 72 6e 20  rr ).    return 
3830: 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b  SQLITE_CANTOPEN;
3840: 0a 23 20 65 6e 64 69 66 0a 20 20 69 64 2d 3e 72  .# endif.  id->r
3850: 65 66 4e 75 6d 52 46 20 3d 20 2d 31 3b 0a 20 20  efNumRF = -1;.  
3860: 69 64 2d 3e 6c 6f 63 6b 65 64 20 3d 20 30 3b 0a  id->locked = 0;.
3870: 20 20 69 64 2d 3e 64 65 6c 4f 6e 43 6c 6f 73 65    id->delOnClose
3880: 20 3d 20 64 65 6c 46 6c 61 67 3b 0a 20 20 69 66   = delFlag;.  if
3890: 20 28 64 65 6c 46 6c 61 67 29 0a 20 20 20 20 69   (delFlag).    i
38a0: 64 2d 3e 70 61 74 68 54 6f 44 65 6c 20 3d 20 73  d->pathToDel = s
38b0: 71 6c 69 74 65 4f 73 46 75 6c 6c 50 61 74 68 6e  qliteOsFullPathn
38c0: 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  ame(zFilename);.
38d0: 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2b 31    OpenCounter(+1
38e0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
38f0: 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 7d 0a  TE_OK;.#endif.}.
3900: 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74  ./*.** Attempt t
3910: 6f 20 6f 70 65 6e 20 61 20 6e 65 77 20 66 69 6c  o open a new fil
3920: 65 20 66 6f 72 20 72 65 61 64 2d 6f 6e 6c 79 20  e for read-only 
3930: 61 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  access..**.** On
3940: 20 73 75 63 63 65 73 73 2c 20 77 72 69 74 65 20   success, write 
3950: 74 68 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20  the file handle 
3960: 69 6e 74 6f 20 2a 69 64 20 61 6e 64 20 72 65 74  into *id and ret
3970: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  urn SQLITE_OK..*
3980: 2a 0a 2a 2a 20 4f 6e 20 66 61 69 6c 75 72 65 2c  *.** On failure,
3990: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
39a0: 41 4e 54 4f 50 45 4e 2e 0a 2a 2f 0a 69 6e 74 20  ANTOPEN..*/.int 
39b0: 73 71 6c 69 74 65 4f 73 4f 70 65 6e 52 65 61 64  sqliteOsOpenRead
39c0: 4f 6e 6c 79 28 63 6f 6e 73 74 20 63 68 61 72 20  Only(const char 
39d0: 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 4f 73 46 69  *zFilename, OsFi
39e0: 6c 65 20 2a 69 64 29 7b 0a 23 69 66 20 4f 53 5f  le *id){.#if OS_
39f0: 55 4e 49 58 0a 20 20 69 64 2d 3e 66 64 20 3d 20  UNIX.  id->fd = 
3a00: 6f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20  open(zFilename, 
3a10: 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 4c 41 52 47 45  O_RDONLY|O_LARGE
3a20: 46 49 4c 45 29 3b 0a 20 20 69 66 28 20 69 64 2d  FILE);.  if( id-
3a30: 3e 66 64 3c 30 20 29 7b 0a 20 20 20 20 72 65 74  >fd<0 ){.    ret
3a40: 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  urn SQLITE_CANTO
3a50: 50 45 4e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  PEN;.  }.  sqlit
3a60: 65 4f 73 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  eOsEnterMutex();
3a70: 0a 20 20 69 64 2d 3e 70 4c 6f 63 6b 20 3d 20 66  .  id->pLock = f
3a80: 69 6e 64 4c 6f 63 6b 49 6e 66 6f 28 69 64 2d 3e  indLockInfo(id->
3a90: 66 64 29 3b 0a 20 20 73 71 6c 69 74 65 4f 73 4c  fd);.  sqliteOsL
3aa0: 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 69  eaveMutex();.  i
3ab0: 66 28 20 69 64 2d 3e 70 4c 6f 63 6b 3d 3d 30 20  f( id->pLock==0 
3ac0: 29 7b 0a 20 20 20 20 63 6c 6f 73 65 28 69 64 2d  ){.    close(id-
3ad0: 3e 66 64 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  >fd);.    return
3ae0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
3af0: 20 7d 0a 20 20 69 64 2d 3e 6c 6f 63 6b 65 64 20   }.  id->locked 
3b00: 3d 20 30 3b 0a 20 20 54 52 41 43 45 33 28 22 4f  = 0;.  TRACE3("O
3b10: 50 45 4e 2d 52 4f 20 25 2d 33 64 20 25 73 5c 6e  PEN-RO %-3d %s\n
3b20: 22 2c 20 69 64 2d 3e 66 64 2c 20 7a 46 69 6c 65  ", id->fd, zFile
3b30: 6e 61 6d 65 29 3b 0a 20 20 4f 70 65 6e 43 6f 75  name);.  OpenCou
3b40: 6e 74 65 72 28 2b 31 29 3b 0a 20 20 72 65 74 75  nter(+1);.  retu
3b50: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65  rn SQLITE_OK;.#e
3b60: 6e 64 69 66 0a 23 69 66 20 4f 53 5f 57 49 4e 0a  ndif.#if OS_WIN.
3b70: 20 20 48 41 4e 44 4c 45 20 68 20 3d 20 43 72 65    HANDLE h = Cre
3b80: 61 74 65 46 69 6c 65 28 7a 46 69 6c 65 6e 61 6d  ateFile(zFilenam
3b90: 65 2c 0a 20 20 20 20 20 47 45 4e 45 52 49 43 5f  e,.     GENERIC_
3ba0: 52 45 41 44 2c 0a 20 20 20 20 20 30 2c 0a 20 20  READ,.     0,.  
3bb0: 20 20 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 4f 50     NULL,.     OP
3bc0: 45 4e 5f 45 58 49 53 54 49 4e 47 2c 0a 20 20 20  EN_EXISTING,.   
3bd0: 20 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45    FILE_ATTRIBUTE
3be0: 5f 4e 4f 52 4d 41 4c 20 7c 20 46 49 4c 45 5f 46  _NORMAL | FILE_F
3bf0: 4c 41 47 5f 52 41 4e 44 4f 4d 5f 41 43 43 45 53  LAG_RANDOM_ACCES
3c00: 53 2c 0a 20 20 20 20 20 4e 55 4c 4c 0a 20 20 29  S,.     NULL.  )
3c10: 3b 0a 20 20 69 66 28 20 68 3d 3d 49 4e 56 41 4c  ;.  if( h==INVAL
3c20: 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20  ID_HANDLE_VALUE 
3c30: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
3c40: 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20  LITE_CANTOPEN;. 
3c50: 20 7d 0a 20 20 69 64 2d 3e 68 20 3d 20 68 3b 0a   }.  id->h = h;.
3c60: 20 20 69 64 2d 3e 6c 6f 63 6b 65 64 20 3d 20 30    id->locked = 0
3c70: 3b 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28  ;.  OpenCounter(
3c80: 2b 31 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  +1);.  return SQ
3c90: 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a  LITE_OK;.#endif.
3ca0: 23 69 66 20 4f 53 5f 4d 41 43 0a 20 20 46 53 53  #if OS_MAC.  FSS
3cb0: 70 65 63 20 66 73 53 70 65 63 3b 0a 23 20 69 66  pec fsSpec;.# if
3cc0: 64 65 66 20 5f 4c 41 52 47 45 5f 46 49 4c 45 0a  def _LARGE_FILE.
3cd0: 20 20 48 46 53 55 6e 69 53 74 72 32 35 35 20 64    HFSUniStr255 d
3ce0: 66 4e 61 6d 65 3b 0a 20 20 46 53 52 65 66 20 66  fName;.  FSRef f
3cf0: 73 52 65 66 3b 0a 20 20 69 66 28 20 5f 5f 70 61  sRef;.  if( __pa
3d00: 74 68 32 66 73 73 28 7a 46 69 6c 65 6e 61 6d 65  th2fss(zFilename
3d10: 2c 20 26 66 73 53 70 65 63 29 20 21 3d 20 6e 6f  , &fsSpec) != no
3d20: 45 72 72 20 29 0a 20 20 20 20 72 65 74 75 72 6e  Err ).    return
3d30: 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
3d40: 3b 0a 20 20 69 66 28 20 46 53 70 4d 61 6b 65 46  ;.  if( FSpMakeF
3d50: 53 52 65 66 28 26 66 73 53 70 65 63 2c 20 26 66  SRef(&fsSpec, &f
3d60: 73 52 65 66 29 20 21 3d 20 6e 6f 45 72 72 20 29  sRef) != noErr )
3d70: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
3d80: 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 46  TE_CANTOPEN;.  F
3d90: 53 47 65 74 44 61 74 61 46 6f 72 6b 4e 61 6d 65  SGetDataForkName
3da0: 28 26 64 66 4e 61 6d 65 29 3b 0a 20 20 69 66 28  (&dfName);.  if(
3db0: 20 46 53 4f 70 65 6e 46 6f 72 6b 28 26 66 73 52   FSOpenFork(&fsR
3dc0: 65 66 2c 20 64 66 4e 61 6d 65 2e 6c 65 6e 67 74  ef, dfName.lengt
3dd0: 68 2c 20 64 66 4e 61 6d 65 2e 75 6e 69 63 6f 64  h, dfName.unicod
3de0: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
3df0: 20 20 20 20 66 73 52 64 50 65 72 6d 2c 20 26 28      fsRdPerm, &(
3e00: 69 64 2d 3e 72 65 66 4e 75 6d 29 29 20 21 3d 20  id->refNum)) != 
3e10: 6e 6f 45 72 72 20 29 0a 20 20 20 20 72 65 74 75  noErr ).    retu
3e20: 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  rn SQLITE_CANTOP
3e30: 45 4e 3b 0a 23 20 65 6c 73 65 0a 20 20 5f 5f 70  EN;.# else.  __p
3e40: 61 74 68 32 66 73 73 28 7a 46 69 6c 65 6e 61 6d  ath2fss(zFilenam
3e50: 65 2c 20 26 66 73 53 70 65 63 29 3b 0a 20 20 69  e, &fsSpec);.  i
3e60: 66 28 20 48 4f 70 65 6e 44 46 28 66 73 53 70 65  f( HOpenDF(fsSpe
3e70: 63 2e 76 52 65 66 4e 75 6d 2c 20 66 73 53 70 65  c.vRefNum, fsSpe
3e80: 63 2e 70 61 72 49 44 2c 20 66 73 53 70 65 63 2e  c.parID, fsSpec.
3e90: 6e 61 6d 65 2c 20 66 73 52 64 50 65 72 6d 2c 20  name, fsRdPerm, 
3ea0: 26 28 69 64 2d 3e 72 65 66 4e 75 6d 29 29 20 21  &(id->refNum)) !
3eb0: 3d 20 6e 6f 45 72 72 20 29 0a 20 20 20 20 72 65  = noErr ).    re
3ec0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54  turn SQLITE_CANT
3ed0: 4f 50 45 4e 3b 0a 23 20 65 6e 64 69 66 0a 20 20  OPEN;.# endif.  
3ee0: 69 66 28 20 48 4f 70 65 6e 52 46 28 66 73 53 70  if( HOpenRF(fsSp
3ef0: 65 63 2e 76 52 65 66 4e 75 6d 2c 20 66 73 53 70  ec.vRefNum, fsSp
3f00: 65 63 2e 70 61 72 49 44 2c 20 66 73 53 70 65 63  ec.parID, fsSpec
3f10: 2e 6e 61 6d 65 2c 20 66 73 52 64 57 72 53 68 50  .name, fsRdWrShP
3f20: 65 72 6d 2c 20 26 28 69 64 2d 3e 72 65 66 4e 75  erm, &(id->refNu
3f30: 6d 52 46 29 29 20 21 3d 20 6e 6f 45 72 72 29 7b  mRF)) != noErr){
3f40: 0a 20 20 20 20 69 64 2d 3e 72 65 66 4e 75 6d 52  .    id->refNumR
3f50: 46 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 69 64  F = -1;.  }.  id
3f60: 2d 3e 6c 6f 63 6b 65 64 20 3d 20 30 3b 0a 20 20  ->locked = 0;.  
3f70: 69 64 2d 3e 64 65 6c 4f 6e 43 6c 6f 73 65 20 3d  id->delOnClose =
3f80: 20 30 3b 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65   0;.  OpenCounte
3f90: 72 28 2b 31 29 3b 0a 20 20 72 65 74 75 72 6e 20  r(+1);.  return 
3fa0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69  SQLITE_OK;.#endi
3fb0: 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  f.}../*.** Creat
3fc0: 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  e a temporary fi
3fd0: 6c 65 20 6e 61 6d 65 20 69 6e 20 7a 42 75 66 2e  le name in zBuf.
3fe0: 20 20 7a 42 75 66 20 6d 75 73 74 20 62 65 20 62    zBuf must be b
3ff0: 69 67 20 65 6e 6f 75 67 68 20 74 6f 0a 2a 2a 20  ig enough to.** 
4000: 68 6f 6c 64 20 61 74 20 6c 65 61 73 74 20 53 51  hold at least SQ
4010: 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49  LITE_TEMPNAME_SI
4020: 5a 45 20 63 68 61 72 61 63 74 65 72 73 2e 0a 2a  ZE characters..*
4030: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 4f 73 54 65  /.int sqliteOsTe
4040: 6d 70 46 69 6c 65 4e 61 6d 65 28 63 68 61 72 20  mpFileName(char 
4050: 2a 7a 42 75 66 29 7b 0a 23 69 66 20 4f 53 5f 55  *zBuf){.#if OS_U
4060: 4e 49 58 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  NIX.  static con
4070: 73 74 20 63 68 61 72 20 2a 61 7a 44 69 72 73 5b  st char *azDirs[
4080: 5d 20 3d 20 7b 0a 20 20 20 20 20 22 2f 76 61 72  ] = {.     "/var
4090: 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22 2f 75 73  /tmp",.     "/us
40a0: 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22 2f 74  r/tmp",.     "/t
40b0: 6d 70 22 2c 0a 20 20 20 20 20 22 2e 22 2c 0a 20  mp",.     ".",. 
40c0: 20 7d 3b 0a 20 20 73 74 61 74 69 63 20 63 68 61   };.  static cha
40d0: 72 20 7a 43 68 61 72 73 5b 5d 20 3d 0a 20 20 20  r zChars[] =.   
40e0: 20 22 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e   "abcdefghijklmn
40f0: 6f 70 71 72 73 74 75 76 77 78 79 7a 22 0a 20 20  opqrstuvwxyz".  
4100: 20 20 22 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d    "ABCDEFGHIJKLM
4110: 4e 4f 50 51 52 53 54 55 56 57 58 59 5a 22 0a 20  NOPQRSTUVWXYZ". 
4120: 20 20 20 22 30 31 32 33 34 35 36 37 38 39 22 3b     "0123456789";
4130: 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 73  .  int i, j;.  s
4140: 74 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a  truct stat buf;.
4150: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
4160: 69 72 20 3d 20 22 2e 22 3b 0a 20 20 66 6f 72 28  ir = ".";.  for(
4170: 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 7a  i=0; i<sizeof(az
4180: 44 69 72 73 29 2f 73 69 7a 65 6f 66 28 61 7a 44  Dirs)/sizeof(azD
4190: 69 72 73 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20  irs[0]); i++){. 
41a0: 20 20 20 69 66 28 20 73 74 61 74 28 61 7a 44 69     if( stat(azDi
41b0: 72 73 5b 69 5d 2c 20 26 62 75 66 29 20 29 20 63  rs[i], &buf) ) c
41c0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
41d0: 20 21 53 5f 49 53 44 49 52 28 62 75 66 2e 73 74   !S_ISDIR(buf.st
41e0: 5f 6d 6f 64 65 29 20 29 20 63 6f 6e 74 69 6e 75  _mode) ) continu
41f0: 65 3b 0a 20 20 20 20 69 66 28 20 61 63 63 65 73  e;.    if( acces
4200: 73 28 61 7a 44 69 72 73 5b 69 5d 2c 20 30 37 29  s(azDirs[i], 07)
4210: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
4220: 20 7a 44 69 72 20 3d 20 61 7a 44 69 72 73 5b 69   zDir = azDirs[i
4230: 5d 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ];.    break;.  
4240: 7d 0a 20 20 64 6f 7b 0a 20 20 20 20 73 70 72 69  }.  do{.    spri
4250: 6e 74 66 28 7a 42 75 66 2c 20 22 25 73 2f 22 54  ntf(zBuf, "%s/"T
4260: 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49 58 2c  EMP_FILE_PREFIX,
4270: 20 7a 44 69 72 29 3b 0a 20 20 20 20 6a 20 3d 20   zDir);.    j = 
4280: 73 74 72 6c 65 6e 28 7a 42 75 66 29 3b 0a 20 20  strlen(zBuf);.  
4290: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31 35 3b    for(i=0; i<15;
42a0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74   i++){.      int
42b0: 20 6e 20 3d 20 73 71 6c 69 74 65 52 61 6e 64 6f   n = sqliteRando
42c0: 6d 42 79 74 65 28 29 20 25 20 28 73 69 7a 65 6f  mByte() % (sizeo
42d0: 66 28 7a 43 68 61 72 73 29 2d 31 29 3b 0a 20 20  f(zChars)-1);.  
42e0: 20 20 20 20 7a 42 75 66 5b 6a 2b 2b 5d 20 3d 20      zBuf[j++] = 
42f0: 7a 43 68 61 72 73 5b 6e 5d 3b 0a 20 20 20 20 7d  zChars[n];.    }
4300: 0a 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 30  .    zBuf[j] = 0
4310: 3b 0a 20 20 7d 77 68 69 6c 65 28 20 61 63 63 65  ;.  }while( acce
4320: 73 73 28 7a 42 75 66 2c 30 29 3d 3d 30 20 29 3b  ss(zBuf,0)==0 );
4330: 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f 53 5f 57  .#endif.#if OS_W
4340: 49 4e 0a 20 20 73 74 61 74 69 63 20 63 68 61 72  IN.  static char
4350: 20 7a 43 68 61 72 73 5b 5d 20 3d 0a 20 20 20 20   zChars[] =.    
4360: 22 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f  "abcdefghijklmno
4370: 70 71 72 73 74 75 76 77 78 79 7a 22 0a 20 20 20  pqrstuvwxyz".   
4380: 20 22 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e   "ABCDEFGHIJKLMN
4390: 4f 50 51 52 53 54 55 56 57 58 59 5a 22 0a 20 20  OPQRSTUVWXYZ".  
43a0: 20 20 22 30 31 32 33 34 35 36 37 38 39 22 3b 0a    "0123456789";.
43b0: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 63 68    int i, j;.  ch
43c0: 61 72 20 7a 54 65 6d 70 50 61 74 68 5b 53 51 4c  ar zTempPath[SQL
43d0: 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a  ITE_TEMPNAME_SIZ
43e0: 45 5d 3b 0a 20 20 47 65 74 54 65 6d 70 50 61 74  E];.  GetTempPat
43f0: 68 28 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d  h(SQLITE_TEMPNAM
4400: 45 5f 53 49 5a 45 2d 33 30 2c 20 7a 54 65 6d 70  E_SIZE-30, zTemp
4410: 50 61 74 68 29 3b 0a 20 20 66 6f 72 28 69 3d 73  Path);.  for(i=s
4420: 74 72 6c 65 6e 28 7a 54 65 6d 70 50 61 74 68 29  trlen(zTempPath)
4430: 3b 20 69 3e 30 20 26 26 20 7a 54 65 6d 70 50 61  ; i>0 && zTempPa
4440: 74 68 5b 69 2d 31 5d 3d 3d 27 5c 5c 27 3b 20 69  th[i-1]=='\\'; i
4450: 2d 2d 29 7b 7d 0a 20 20 7a 54 65 6d 70 50 61 74  --){}.  zTempPat
4460: 68 5b 69 5d 20 3d 20 30 3b 0a 20 20 66 6f 72 28  h[i] = 0;.  for(
4470: 3b 3b 29 7b 0a 20 20 20 20 73 70 72 69 6e 74 66  ;;){.    sprintf
4480: 28 7a 42 75 66 2c 20 22 25 73 5c 5c 22 54 45 4d  (zBuf, "%s\\"TEM
4490: 50 5f 46 49 4c 45 5f 50 52 45 46 49 58 2c 20 7a  P_FILE_PREFIX, z
44a0: 54 65 6d 70 50 61 74 68 29 3b 0a 20 20 20 20 6a  TempPath);.    j
44b0: 20 3d 20 73 74 72 6c 65 6e 28 7a 42 75 66 29 3b   = strlen(zBuf);
44c0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
44d0: 31 35 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  15; i++){.      
44e0: 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 52 61  int n = sqliteRa
44f0: 6e 64 6f 6d 42 79 74 65 28 29 20 25 20 73 69 7a  ndomByte() % siz
4500: 65 6f 66 28 7a 43 68 61 72 73 29 3b 0a 20 20 20  eof(zChars);.   
4510: 20 20 20 7a 42 75 66 5b 6a 2b 2b 5d 20 3d 20 7a     zBuf[j++] = z
4520: 43 68 61 72 73 5b 6e 5d 3b 0a 20 20 20 20 7d 0a  Chars[n];.    }.
4530: 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 30 3b      zBuf[j] = 0;
4540: 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65  .    if( !sqlite
4550: 4f 73 46 69 6c 65 45 78 69 73 74 73 28 7a 42 75  OsFileExists(zBu
4560: 66 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  f) ) break;.  }.
4570: 23 65 6e 64 69 66 0a 23 69 66 20 4f 53 5f 4d 41  #endif.#if OS_MA
4580: 43 0a 20 20 73 74 61 74 69 63 20 63 68 61 72 20  C.  static char 
4590: 7a 43 68 61 72 73 5b 5d 20 3d 0a 20 20 20 20 22  zChars[] =.    "
45a0: 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70  abcdefghijklmnop
45b0: 71 72 73 74 75 76 77 78 79 7a 22 0a 20 20 20 20  qrstuvwxyz".    
45c0: 22 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f  "ABCDEFGHIJKLMNO
45d0: 50 51 52 53 54 55 56 57 58 59 5a 22 0a 20 20 20  PQRSTUVWXYZ".   
45e0: 20 22 30 31 32 33 34 35 36 37 38 39 22 3b 0a 20   "0123456789";. 
45f0: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 63 68 61   int i, j;.  cha
4600: 72 20 7a 54 65 6d 70 50 61 74 68 5b 53 51 4c 49  r zTempPath[SQLI
4610: 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45  TE_TEMPNAME_SIZE
4620: 5d 3b 0a 20 20 63 68 61 72 20 7a 64 69 72 4e 61  ];.  char zdirNa
4630: 6d 65 5b 33 32 5d 3b 0a 20 20 43 49 6e 66 6f 50  me[32];.  CInfoP
4640: 42 52 65 63 20 69 6e 66 6f 52 65 63 3b 0a 20 20  BRec infoRec;.  
4650: 53 74 72 33 31 20 64 69 72 4e 61 6d 65 3b 0a 20  Str31 dirName;. 
4660: 20 6d 65 6d 73 65 74 28 26 69 6e 66 6f 52 65 63   memset(&infoRec
4670: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f  , 0, sizeof(info
4680: 52 65 63 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28  Rec));.  memset(
4690: 7a 54 65 6d 70 50 61 74 68 2c 20 30 2c 20 53 51  zTempPath, 0, SQ
46a0: 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49  LITE_TEMPNAME_SI
46b0: 5a 45 29 3b 0a 20 20 69 66 28 20 46 69 6e 64 46  ZE);.  if( FindF
46c0: 6f 6c 64 65 72 28 6b 4f 6e 53 79 73 74 65 6d 44  older(kOnSystemD
46d0: 69 73 6b 2c 20 6b 54 65 6d 70 6f 72 61 72 79 46  isk, kTemporaryF
46e0: 6f 6c 64 65 72 54 79 70 65 2c 20 20 6b 43 72 65  olderType,  kCre
46f0: 61 74 65 46 6f 6c 64 65 72 2c 0a 20 20 20 20 20  ateFolder,.     
4700: 20 20 26 28 69 6e 66 6f 52 65 63 2e 64 69 72 49    &(infoRec.dirI
4710: 6e 66 6f 2e 69 6f 56 52 65 66 4e 75 6d 29 2c 20  nfo.ioVRefNum), 
4720: 26 28 69 6e 66 6f 52 65 63 2e 64 69 72 49 6e 66  &(infoRec.dirInf
4730: 6f 2e 69 6f 44 72 50 61 72 49 44 29 29 20 3d 3d  o.ioDrParID)) ==
4740: 20 6e 6f 45 72 72 20 29 7b 0a 20 20 20 20 69 6e   noErr ){.    in
4750: 66 6f 52 65 63 2e 64 69 72 49 6e 66 6f 2e 69 6f  foRec.dirInfo.io
4760: 4e 61 6d 65 50 74 72 20 3d 20 64 69 72 4e 61 6d  NamePtr = dirNam
4770: 65 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20  e;.    do{.     
4780: 20 69 6e 66 6f 52 65 63 2e 64 69 72 49 6e 66 6f   infoRec.dirInfo
4790: 2e 69 6f 46 44 69 72 49 6e 64 65 78 20 3d 20 2d  .ioFDirIndex = -
47a0: 31 3b 0a 20 20 20 20 20 20 69 6e 66 6f 52 65 63  1;.      infoRec
47b0: 2e 64 69 72 49 6e 66 6f 2e 69 6f 44 72 44 69 72  .dirInfo.ioDrDir
47c0: 49 44 20 3d 20 69 6e 66 6f 52 65 63 2e 64 69 72  ID = infoRec.dir
47d0: 49 6e 66 6f 2e 69 6f 44 72 50 61 72 49 44 3b 0a  Info.ioDrParID;.
47e0: 20 20 20 20 20 20 69 66 28 20 50 42 47 65 74 43        if( PBGetC
47f0: 61 74 49 6e 66 6f 53 79 6e 63 28 26 69 6e 66 6f  atInfoSync(&info
4800: 52 65 63 29 20 3d 3d 20 6e 6f 45 72 72 20 29 7b  Rec) == noErr ){
4810: 0a 20 20 20 20 20 20 20 20 43 6f 70 79 50 61 73  .        CopyPas
4820: 63 61 6c 53 74 72 69 6e 67 54 6f 43 28 64 69 72  calStringToC(dir
4830: 4e 61 6d 65 2c 20 7a 64 69 72 4e 61 6d 65 29 3b  Name, zdirName);
4840: 0a 20 20 20 20 20 20 20 20 69 20 3d 20 73 74 72  .        i = str
4850: 6c 65 6e 28 7a 64 69 72 4e 61 6d 65 29 3b 0a 20  len(zdirName);. 
4860: 20 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28 26         memmove(&
4870: 28 7a 54 65 6d 70 50 61 74 68 5b 69 2b 31 5d 29  (zTempPath[i+1])
4880: 2c 20 7a 54 65 6d 70 50 61 74 68 2c 20 73 74 72  , zTempPath, str
4890: 6c 65 6e 28 7a 54 65 6d 70 50 61 74 68 29 29 3b  len(zTempPath));
48a0: 0a 20 20 20 20 20 20 20 20 73 74 72 63 70 79 28  .        strcpy(
48b0: 7a 54 65 6d 70 50 61 74 68 2c 20 7a 64 69 72 4e  zTempPath, zdirN
48c0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 7a 54  ame);.        zT
48d0: 65 6d 70 50 61 74 68 5b 69 5d 20 3d 20 27 3a 27  empPath[i] = ':'
48e0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
48f0: 20 20 20 20 20 20 20 2a 7a 54 65 6d 70 50 61 74         *zTempPat
4900: 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 62  h = 0;.        b
4910: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
4920: 20 20 7d 20 77 68 69 6c 65 28 20 69 6e 66 6f 52    } while( infoR
4930: 65 63 2e 64 69 72 49 6e 66 6f 2e 69 6f 44 72 44  ec.dirInfo.ioDrD
4940: 69 72 49 44 20 21 3d 20 66 73 52 74 44 69 72 49  irID != fsRtDirI
4950: 44 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 2a  D );.  }.  if( *
4960: 7a 54 65 6d 70 50 61 74 68 20 3d 3d 20 30 20 29  zTempPath == 0 )
4970: 0a 20 20 20 20 67 65 74 63 77 64 28 7a 54 65 6d  .    getcwd(zTem
4980: 70 50 61 74 68 2c 20 53 51 4c 49 54 45 5f 54 45  pPath, SQLITE_TE
4990: 4d 50 4e 41 4d 45 5f 53 49 5a 45 2d 32 34 29 3b  MPNAME_SIZE-24);
49a0: 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20  .  for(;;){.    
49b0: 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 25  sprintf(zBuf, "%
49c0: 73 22 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46  s"TEMP_FILE_PREF
49d0: 49 58 2c 20 7a 54 65 6d 70 50 61 74 68 29 3b 0a  IX, zTempPath);.
49e0: 20 20 20 20 6a 20 3d 20 73 74 72 6c 65 6e 28 7a      j = strlen(z
49f0: 42 75 66 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  Buf);.    for(i=
4a00: 30 3b 20 69 3c 31 35 3b 20 69 2b 2b 29 7b 0a 20  0; i<15; i++){. 
4a10: 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c       int n = sql
4a20: 69 74 65 52 61 6e 64 6f 6d 42 79 74 65 28 29 20  iteRandomByte() 
4a30: 25 20 73 69 7a 65 6f 66 28 7a 43 68 61 72 73 29  % sizeof(zChars)
4a40: 3b 0a 20 20 20 20 20 20 7a 42 75 66 5b 6a 2b 2b  ;.      zBuf[j++
4a50: 5d 20 3d 20 7a 43 68 61 72 73 5b 6e 5d 3b 0a 20  ] = zChars[n];. 
4a60: 20 20 20 7d 0a 20 20 20 20 7a 42 75 66 5b 6a 5d     }.    zBuf[j]
4a70: 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 21 73   = 0;.    if( !s
4a80: 71 6c 69 74 65 4f 73 46 69 6c 65 45 78 69 73 74  qliteOsFileExist
4a90: 73 28 7a 42 75 66 29 20 29 20 62 72 65 61 6b 3b  s(zBuf) ) break;
4aa0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
4ab0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  turn SQLITE_OK; 
4ac0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
4ad0: 61 20 66 69 6c 65 0a 2a 2f 0a 69 6e 74 20 73 71  a file.*/.int sq
4ae0: 6c 69 74 65 4f 73 43 6c 6f 73 65 28 4f 73 46 69  liteOsClose(OsFi
4af0: 6c 65 20 2a 69 64 29 7b 0a 23 69 66 20 4f 53 5f  le *id){.#if OS_
4b00: 55 4e 49 58 0a 20 20 63 6c 6f 73 65 28 69 64 2d  UNIX.  close(id-
4b10: 3e 66 64 29 3b 0a 20 20 73 71 6c 69 74 65 4f 73  >fd);.  sqliteOs
4b20: 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
4b30: 72 65 6c 65 61 73 65 4c 6f 63 6b 49 6e 66 6f 28  releaseLockInfo(
4b40: 69 64 2d 3e 70 4c 6f 63 6b 29 3b 0a 20 20 73 71  id->pLock);.  sq
4b50: 6c 69 74 65 4f 73 4c 65 61 76 65 4d 75 74 65 78  liteOsLeaveMutex
4b60: 28 29 3b 0a 20 20 54 52 41 43 45 32 28 22 43 4c  ();.  TRACE2("CL
4b70: 4f 53 45 20 20 20 25 2d 33 64 5c 6e 22 2c 20 69  OSE   %-3d\n", i
4b80: 64 2d 3e 66 64 29 3b 0a 20 20 4f 70 65 6e 43 6f  d->fd);.  OpenCo
4b90: 75 6e 74 65 72 28 2d 31 29 3b 0a 20 20 72 65 74  unter(-1);.  ret
4ba0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23  urn SQLITE_OK;.#
4bb0: 65 6e 64 69 66 0a 23 69 66 20 4f 53 5f 57 49 4e  endif.#if OS_WIN
4bc0: 0a 20 20 43 6c 6f 73 65 48 61 6e 64 6c 65 28 69  .  CloseHandle(i
4bd0: 64 2d 3e 68 29 3b 0a 20 20 4f 70 65 6e 43 6f 75  d->h);.  OpenCou
4be0: 6e 74 65 72 28 2d 31 29 3b 0a 20 20 72 65 74 75  nter(-1);.  retu
4bf0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65  rn SQLITE_OK;.#e
4c00: 6e 64 69 66 0a 23 69 66 20 4f 53 5f 4d 41 43 0a  ndif.#if OS_MAC.
4c10: 20 20 69 66 28 20 69 64 2d 3e 72 65 66 4e 75 6d    if( id->refNum
4c20: 52 46 21 3d 2d 31 20 29 0a 20 20 20 20 46 53 43  RF!=-1 ).    FSC
4c30: 6c 6f 73 65 28 69 64 2d 3e 72 65 66 4e 75 6d 52  lose(id->refNumR
4c40: 46 29 3b 0a 23 20 69 66 64 65 66 20 5f 4c 41 52  F);.# ifdef _LAR
4c50: 47 45 5f 46 49 4c 45 0a 20 20 46 53 43 6c 6f 73  GE_FILE.  FSClos
4c60: 65 46 6f 72 6b 28 69 64 2d 3e 72 65 66 4e 75 6d  eFork(id->refNum
4c70: 29 3b 0a 23 20 65 6c 73 65 0a 20 20 46 53 43 6c  );.# else.  FSCl
4c80: 6f 73 65 28 69 64 2d 3e 72 65 66 4e 75 6d 29 3b  ose(id->refNum);
4c90: 0a 23 20 65 6e 64 69 66 0a 20 20 69 66 28 20 69  .# endif.  if( i
4ca0: 64 2d 3e 64 65 6c 4f 6e 43 6c 6f 73 65 20 29 7b  d->delOnClose ){
4cb0: 0a 20 20 20 20 75 6e 6c 69 6e 6b 28 69 64 2d 3e  .    unlink(id->
4cc0: 70 61 74 68 54 6f 44 65 6c 29 3b 0a 20 20 20 20  pathToDel);.    
4cd0: 73 71 6c 69 74 65 46 72 65 65 28 69 64 2d 3e 70  sqliteFree(id->p
4ce0: 61 74 68 54 6f 44 65 6c 29 3b 0a 20 20 7d 0a 20  athToDel);.  }. 
4cf0: 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2d 31 29   OpenCounter(-1)
4d00: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
4d10: 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  E_OK;.#endif.}..
4d20: 2f 2a 0a 2a 2a 20 52 65 61 64 20 64 61 74 61 20  /*.** Read data 
4d30: 66 72 6f 6d 20 61 20 66 69 6c 65 20 69 6e 74 6f  from a file into
4d40: 20 61 20 62 75 66 66 65 72 2e 20 20 52 65 74 75   a buffer.  Retu
4d50: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  rn SQLITE_OK if 
4d60: 61 6c 6c 0a 2a 2a 20 62 79 74 65 73 20 77 65 72  all.** bytes wer
4d70: 65 20 72 65 61 64 20 73 75 63 63 65 73 73 66 75  e read successfu
4d80: 6c 6c 79 20 61 6e 64 20 53 51 4c 49 54 45 5f 49  lly and SQLITE_I
4d90: 4f 45 52 52 20 69 66 20 61 6e 79 74 68 69 6e 67  OERR if anything
4da0: 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 0a   goes.** wrong..
4db0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 4f 73 52  */.int sqliteOsR
4dc0: 65 61 64 28 4f 73 46 69 6c 65 20 2a 69 64 2c 20  ead(OsFile *id, 
4dd0: 76 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e 74 20  void *pBuf, int 
4de0: 61 6d 74 29 7b 0a 23 69 66 20 4f 53 5f 55 4e 49  amt){.#if OS_UNI
4df0: 58 0a 20 20 69 6e 74 20 67 6f 74 3b 0a 20 20 53  X.  int got;.  S
4e00: 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 53  imulateIOError(S
4e10: 51 4c 49 54 45 5f 49 4f 45 52 52 29 3b 0a 20 20  QLITE_IOERR);.  
4e20: 54 49 4d 45 52 5f 53 54 41 52 54 3b 0a 20 20 67  TIMER_START;.  g
4e30: 6f 74 20 3d 20 72 65 61 64 28 69 64 2d 3e 66 64  ot = read(id->fd
4e40: 2c 20 70 42 75 66 2c 20 61 6d 74 29 3b 0a 20 20  , pBuf, amt);.  
4e50: 54 49 4d 45 52 5f 45 4e 44 3b 0a 20 20 54 52 41  TIMER_END;.  TRA
4e60: 43 45 34 28 22 52 45 41 44 20 20 20 20 25 2d 33  CE4("READ    %-3
4e70: 64 20 25 37 64 20 25 64 5c 6e 22 2c 20 69 64 2d  d %7d %d\n", id-
4e80: 3e 66 64 2c 20 6c 61 73 74 5f 70 61 67 65 2c 20  >fd, last_page, 
4e90: 65 6c 61 70 73 65 29 3b 0a 20 20 53 45 45 4b 28  elapse);.  SEEK(
4ea0: 30 29 3b 0a 20 20 2f 2a 20 69 66 28 20 67 6f 74  0);.  /* if( got
4eb0: 3c 30 20 29 20 67 6f 74 20 3d 20 30 3b 20 2a 2f  <0 ) got = 0; */
4ec0: 0a 20 20 69 66 28 20 67 6f 74 3d 3d 61 6d 74 20  .  if( got==amt 
4ed0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
4ee0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
4ef0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
4f00: 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 7d 0a 23  ITE_IOERR;.  }.#
4f10: 65 6e 64 69 66 0a 23 69 66 20 4f 53 5f 57 49 4e  endif.#if OS_WIN
4f20: 0a 20 20 44 57 4f 52 44 20 67 6f 74 3b 0a 20 20  .  DWORD got;.  
4f30: 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
4f40: 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 3b 0a 20  SQLITE_IOERR);. 
4f50: 20 54 52 41 43 45 32 28 22 52 45 41 44 20 25 64   TRACE2("READ %d
4f60: 5c 6e 22 2c 20 6c 61 73 74 5f 70 61 67 65 29 3b  \n", last_page);
4f70: 0a 20 20 69 66 28 20 21 52 65 61 64 46 69 6c 65  .  if( !ReadFile
4f80: 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 61 6d  (id->h, pBuf, am
4f90: 74 2c 20 26 67 6f 74 2c 20 30 29 20 29 7b 0a 20  t, &got, 0) ){. 
4fa0: 20 20 20 67 6f 74 20 3d 20 30 3b 0a 20 20 7d 0a     got = 0;.  }.
4fb0: 20 20 69 66 28 20 67 6f 74 3d 3d 28 44 57 4f 52    if( got==(DWOR
4fc0: 44 29 61 6d 74 20 29 7b 0a 20 20 20 20 72 65 74  D)amt ){.    ret
4fd0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
4fe0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
4ff0: 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b  rn SQLITE_IOERR;
5000: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20  .  }.#endif.#if 
5010: 4f 53 5f 4d 41 43 0a 20 20 69 6e 74 20 67 6f 74  OS_MAC.  int got
5020: 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
5030: 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
5040: 29 3b 0a 20 20 54 52 41 43 45 32 28 22 52 45 41  );.  TRACE2("REA
5050: 44 20 25 64 5c 6e 22 2c 20 6c 61 73 74 5f 70 61  D %d\n", last_pa
5060: 67 65 29 3b 0a 23 20 69 66 64 65 66 20 5f 4c 41  ge);.# ifdef _LA
5070: 52 47 45 5f 46 49 4c 45 0a 20 20 46 53 52 65 61  RGE_FILE.  FSRea
5080: 64 46 6f 72 6b 28 69 64 2d 3e 72 65 66 4e 75 6d  dFork(id->refNum
5090: 2c 20 66 73 41 74 4d 61 72 6b 2c 20 30 2c 20 28  , fsAtMark, 0, (
50a0: 42 79 74 65 43 6f 75 6e 74 29 61 6d 74 2c 20 70  ByteCount)amt, p
50b0: 42 75 66 2c 20 28 42 79 74 65 43 6f 75 6e 74 2a  Buf, (ByteCount*
50c0: 29 26 67 6f 74 29 3b 0a 23 20 65 6c 73 65 0a 20  )&got);.# else. 
50d0: 20 67 6f 74 20 3d 20 61 6d 74 3b 0a 20 20 46 53   got = amt;.  FS
50e0: 52 65 61 64 28 69 64 2d 3e 72 65 66 4e 75 6d 2c  Read(id->refNum,
50f0: 20 26 67 6f 74 2c 20 70 42 75 66 29 3b 0a 23 20   &got, pBuf);.# 
5100: 65 6e 64 69 66 0a 20 20 69 66 28 20 67 6f 74 3d  endif.  if( got=
5110: 3d 61 6d 74 20 29 7b 0a 20 20 20 20 72 65 74 75  =amt ){.    retu
5120: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
5130: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
5140: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a  n SQLITE_IOERR;.
5150: 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a    }.#endif.}../*
5160: 0a 2a 2a 20 57 72 69 74 65 20 64 61 74 61 20 66  .** Write data f
5170: 72 6f 6d 20 61 20 62 75 66 66 65 72 20 69 6e 74  rom a buffer int
5180: 6f 20 61 20 66 69 6c 65 2e 20 20 52 65 74 75 72  o a file.  Retur
5190: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
51a0: 75 63 63 65 73 73 0a 2a 2a 20 6f 72 20 73 6f 6d  uccess.** or som
51b0: 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f  e other error co
51c0: 64 65 20 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a  de on failure..*
51d0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 4f 73 57 72  /.int sqliteOsWr
51e0: 69 74 65 28 4f 73 46 69 6c 65 20 2a 69 64 2c 20  ite(OsFile *id, 
51f0: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 75 66  const void *pBuf
5200: 2c 20 69 6e 74 20 61 6d 74 29 7b 0a 23 69 66 20  , int amt){.#if 
5210: 4f 53 5f 55 4e 49 58 0a 20 20 69 6e 74 20 77 72  OS_UNIX.  int wr
5220: 6f 74 65 20 3d 20 30 3b 0a 20 20 53 69 6d 75 6c  ote = 0;.  Simul
5230: 61 74 65 49 4f 45 72 72 6f 72 28 53 51 4c 49 54  ateIOError(SQLIT
5240: 45 5f 49 4f 45 52 52 29 3b 0a 20 20 54 49 4d 45  E_IOERR);.  TIME
5250: 52 5f 53 54 41 52 54 3b 0a 20 20 77 68 69 6c 65  R_START;.  while
5260: 28 20 61 6d 74 3e 30 20 26 26 20 28 77 72 6f 74  ( amt>0 && (wrot
5270: 65 20 3d 20 77 72 69 74 65 28 69 64 2d 3e 66 64  e = write(id->fd
5280: 2c 20 70 42 75 66 2c 20 61 6d 74 29 29 3e 30 20  , pBuf, amt))>0 
5290: 29 7b 0a 20 20 20 20 61 6d 74 20 2d 3d 20 77 72  ){.    amt -= wr
52a0: 6f 74 65 3b 0a 20 20 20 20 70 42 75 66 20 3d 20  ote;.    pBuf = 
52b0: 26 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b 77  &((char*)pBuf)[w
52c0: 72 6f 74 65 5d 3b 0a 20 20 7d 0a 20 20 54 49 4d  rote];.  }.  TIM
52d0: 45 52 5f 45 4e 44 3b 0a 20 20 54 52 41 43 45 34  ER_END;.  TRACE4
52e0: 28 22 57 52 49 54 45 20 20 20 25 2d 33 64 20 25  ("WRITE   %-3d %
52f0: 37 64 20 25 64 5c 6e 22 2c 20 69 64 2d 3e 66 64  7d %d\n", id->fd
5300: 2c 20 6c 61 73 74 5f 70 61 67 65 2c 20 65 6c 61  , last_page, ela
5310: 70 73 65 29 3b 0a 20 20 53 45 45 4b 28 30 29 3b  pse);.  SEEK(0);
5320: 0a 20 20 69 66 28 20 61 6d 74 3e 30 20 29 7b 0a  .  if( amt>0 ){.
5330: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
5340: 45 5f 46 55 4c 4c 3b 0a 20 20 7d 0a 20 20 72 65  E_FULL;.  }.  re
5350: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
5360: 23 65 6e 64 69 66 0a 23 69 66 20 4f 53 5f 57 49  #endif.#if OS_WI
5370: 4e 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 44 57  N.  int rc;.  DW
5380: 4f 52 44 20 77 72 6f 74 65 3b 0a 20 20 53 69 6d  ORD wrote;.  Sim
5390: 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 53 51 4c  ulateIOError(SQL
53a0: 49 54 45 5f 49 4f 45 52 52 29 3b 0a 20 20 54 52  ITE_IOERR);.  TR
53b0: 41 43 45 32 28 22 57 52 49 54 45 20 25 64 5c 6e  ACE2("WRITE %d\n
53c0: 22 2c 20 6c 61 73 74 5f 70 61 67 65 29 3b 0a 20  ", last_page);. 
53d0: 20 77 68 69 6c 65 28 20 61 6d 74 3e 30 20 26 26   while( amt>0 &&
53e0: 20 28 72 63 20 3d 20 57 72 69 74 65 46 69 6c 65   (rc = WriteFile
53f0: 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 61 6d  (id->h, pBuf, am
5400: 74 2c 20 26 77 72 6f 74 65 2c 20 30 29 29 21 3d  t, &wrote, 0))!=
5410: 30 20 26 26 20 77 72 6f 74 65 3e 30 20 29 7b 0a  0 && wrote>0 ){.
5420: 20 20 20 20 61 6d 74 20 2d 3d 20 77 72 6f 74 65      amt -= wrote
5430: 3b 0a 20 20 20 20 70 42 75 66 20 3d 20 26 28 28  ;.    pBuf = &((
5440: 63 68 61 72 2a 29 70 42 75 66 29 5b 77 72 6f 74  char*)pBuf)[wrot
5450: 65 5d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 72  e];.  }.  if( !r
5460: 63 20 7c 7c 20 61 6d 74 3e 28 69 6e 74 29 77 72  c || amt>(int)wr
5470: 6f 74 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ote ){.    retur
5480: 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20  n SQLITE_FULL;. 
5490: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
54a0: 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 23 69  TE_OK;.#endif.#i
54b0: 66 20 4f 53 5f 4d 41 43 0a 20 20 4f 53 45 72 72  f OS_MAC.  OSErr
54c0: 20 6f 73 65 72 72 3b 0a 20 20 69 6e 74 20 77 72   oserr;.  int wr
54d0: 6f 74 65 20 3d 20 30 3b 0a 20 20 53 69 6d 75 6c  ote = 0;.  Simul
54e0: 61 74 65 49 4f 45 72 72 6f 72 28 53 51 4c 49 54  ateIOError(SQLIT
54f0: 45 5f 49 4f 45 52 52 29 3b 0a 20 20 54 52 41 43  E_IOERR);.  TRAC
5500: 45 32 28 22 57 52 49 54 45 20 25 64 5c 6e 22 2c  E2("WRITE %d\n",
5510: 20 6c 61 73 74 5f 70 61 67 65 29 3b 0a 20 20 77   last_page);.  w
5520: 68 69 6c 65 28 20 61 6d 74 3e 30 20 29 7b 0a 23  hile( amt>0 ){.#
5530: 20 69 66 64 65 66 20 5f 4c 41 52 47 45 5f 46 49   ifdef _LARGE_FI
5540: 4c 45 0a 20 20 20 20 6f 73 65 72 72 20 3d 20 46  LE.    oserr = F
5550: 53 57 72 69 74 65 46 6f 72 6b 28 69 64 2d 3e 72  SWriteFork(id->r
5560: 65 66 4e 75 6d 2c 20 66 73 41 74 4d 61 72 6b 2c  efNum, fsAtMark,
5570: 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
5580: 20 20 20 20 20 20 20 20 20 20 20 20 28 42 79 74              (Byt
5590: 65 43 6f 75 6e 74 29 61 6d 74 2c 20 70 42 75 66  eCount)amt, pBuf
55a0: 2c 20 28 42 79 74 65 43 6f 75 6e 74 2a 29 26 77  , (ByteCount*)&w
55b0: 72 6f 74 65 29 3b 0a 23 20 65 6c 73 65 0a 20 20  rote);.# else.  
55c0: 20 20 77 72 6f 74 65 20 3d 20 61 6d 74 3b 0a 20    wrote = amt;. 
55d0: 20 20 20 6f 73 65 72 72 20 3d 20 46 53 57 72 69     oserr = FSWri
55e0: 74 65 28 69 64 2d 3e 72 65 66 4e 75 6d 2c 20 26  te(id->refNum, &
55f0: 77 72 6f 74 65 2c 20 70 42 75 66 29 3b 0a 23 20  wrote, pBuf);.# 
5600: 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 77 72  endif.    if( wr
5610: 6f 74 65 20 3d 3d 20 30 20 7c 7c 20 6f 73 65 72  ote == 0 || oser
5620: 72 20 21 3d 20 6e 6f 45 72 72 29 0a 20 20 20 20  r != noErr).    
5630: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 61 6d 74    break;.    amt
5640: 20 2d 3d 20 77 72 6f 74 65 3b 0a 20 20 20 20 70   -= wrote;.    p
5650: 42 75 66 20 3d 20 26 28 28 63 68 61 72 2a 29 70  Buf = &((char*)p
5660: 42 75 66 29 5b 77 72 6f 74 65 5d 3b 0a 20 20 7d  Buf)[wrote];.  }
5670: 0a 20 20 69 66 28 20 6f 73 65 72 72 20 21 3d 20  .  if( oserr != 
5680: 6e 6f 45 72 72 20 7c 7c 20 61 6d 74 3e 77 72 6f  noErr || amt>wro
5690: 74 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  te ){.    return
56a0: 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20   SQLITE_FULL;.  
56b0: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
56c0: 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  E_OK;.#endif.}..
56d0: 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 72  /*.** Move the r
56e0: 65 61 64 2f 77 72 69 74 65 20 70 6f 69 6e 74 65  ead/write pointe
56f0: 72 20 69 6e 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a  r in a file..*/.
5700: 69 6e 74 20 73 71 6c 69 74 65 4f 73 53 65 65 6b  int sqliteOsSeek
5710: 28 4f 73 46 69 6c 65 20 2a 69 64 2c 20 6f 66 66  (OsFile *id, off
5720: 5f 74 20 6f 66 66 73 65 74 29 7b 0a 20 20 53 45  _t offset){.  SE
5730: 45 4b 28 6f 66 66 73 65 74 2f 31 30 32 34 20 2b  EK(offset/1024 +
5740: 20 31 29 3b 0a 23 69 66 20 4f 53 5f 55 4e 49 58   1);.#if OS_UNIX
5750: 0a 20 20 6c 73 65 65 6b 28 69 64 2d 3e 66 64 2c  .  lseek(id->fd,
5760: 20 6f 66 66 73 65 74 2c 20 53 45 45 4b 5f 53 45   offset, SEEK_SE
5770: 54 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  T);.  return SQL
5780: 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 23  ITE_OK;.#endif.#
5790: 69 66 20 4f 53 5f 57 49 4e 0a 20 20 7b 0a 20 20  if OS_WIN.  {.  
57a0: 20 20 4c 4f 4e 47 20 75 70 70 65 72 42 69 74 73    LONG upperBits
57b0: 20 3d 20 6f 66 66 73 65 74 3e 3e 33 32 3b 0a 20   = offset>>32;. 
57c0: 20 20 20 4c 4f 4e 47 20 6c 6f 77 65 72 42 69 74     LONG lowerBit
57d0: 73 20 3d 20 6f 66 66 73 65 74 20 26 20 30 78 66  s = offset & 0xf
57e0: 66 66 66 66 66 66 66 3b 0a 20 20 20 20 44 57 4f  fffffff;.    DWO
57f0: 52 44 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20  RD rc;.    rc = 
5800: 53 65 74 46 69 6c 65 50 6f 69 6e 74 65 72 28 69  SetFilePointer(i
5810: 64 2d 3e 68 2c 20 6c 6f 77 65 72 42 69 74 73 2c  d->h, lowerBits,
5820: 20 26 75 70 70 65 72 42 69 74 73 2c 20 46 49 4c   &upperBits, FIL
5830: 45 5f 42 45 47 49 4e 29 3b 0a 20 20 20 20 2f 2a  E_BEGIN);.    /*
5840: 20 54 52 41 43 45 33 28 22 53 45 45 4b 20 72 63   TRACE3("SEEK rc
5850: 3d 30 78 25 78 20 75 70 70 65 72 3d 30 78 25 78  =0x%x upper=0x%x
5860: 5c 6e 22 2c 20 72 63 2c 20 75 70 70 65 72 42 69  \n", rc, upperBi
5870: 74 73 29 3b 20 2a 2f 0a 20 20 7d 0a 20 20 72 65  ts); */.  }.  re
5880: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
5890: 23 65 6e 64 69 66 0a 23 69 66 20 4f 53 5f 4d 41  #endif.#if OS_MA
58a0: 43 0a 20 20 7b 0a 20 20 20 20 6f 66 66 5f 74 20  C.  {.    off_t 
58b0: 63 75 72 53 69 7a 65 3b 0a 20 20 20 20 69 66 28  curSize;.    if(
58c0: 20 73 71 6c 69 74 65 4f 73 46 69 6c 65 53 69 7a   sqliteOsFileSiz
58d0: 65 28 69 64 2c 20 26 63 75 72 53 69 7a 65 29 20  e(id, &curSize) 
58e0: 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  != SQLITE_OK ){.
58f0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
5900: 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 7d  ITE_IOERR;.    }
5910: 0a 20 20 20 20 69 66 28 20 6f 66 66 73 65 74 20  .    if( offset 
5920: 3e 3d 20 63 75 72 53 69 7a 65 20 29 7b 0a 20 20  >= curSize ){.  
5930: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 4f 73      if( sqliteOs
5940: 54 72 75 6e 63 61 74 65 28 69 64 2c 20 6f 66 66  Truncate(id, off
5950: 73 65 74 2b 31 29 20 21 3d 20 53 51 4c 49 54 45  set+1) != SQLITE
5960: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
5970: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
5980: 52 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  RR;.      }.    
5990: 7d 0a 23 20 69 66 64 65 66 20 5f 4c 41 52 47 45  }.# ifdef _LARGE
59a0: 5f 46 49 4c 45 0a 20 20 20 20 69 66 28 20 46 53  _FILE.    if( FS
59b0: 53 65 74 46 6f 72 6b 50 6f 73 69 74 69 6f 6e 28  SetForkPosition(
59c0: 69 64 2d 3e 72 65 66 4e 75 6d 2c 20 66 73 46 72  id->refNum, fsFr
59d0: 6f 6d 53 74 61 72 74 2c 20 6f 66 66 73 65 74 29  omStart, offset)
59e0: 20 21 3d 20 6e 6f 45 72 72 20 29 7b 0a 23 20 65   != noErr ){.# e
59f0: 6c 73 65 0a 20 20 20 20 69 66 28 20 53 65 74 46  lse.    if( SetF
5a00: 50 6f 73 28 69 64 2d 3e 72 65 66 4e 75 6d 2c 20  Pos(id->refNum, 
5a10: 66 73 46 72 6f 6d 53 74 61 72 74 2c 20 6f 66 66  fsFromStart, off
5a20: 73 65 74 29 20 21 3d 20 6e 6f 45 72 72 20 29 7b  set) != noErr ){
5a30: 0a 23 20 65 6e 64 69 66 0a 20 20 20 20 20 20 72  .# endif.      r
5a40: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
5a50: 52 52 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  RR;.    }else{. 
5a60: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
5a70: 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  TE_OK;.    }.  }
5a80: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
5a90: 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 77   Make sure all w
5aa0: 72 69 74 65 73 20 74 6f 20 61 20 70 61 72 74 69  rites to a parti
5ab0: 63 75 6c 61 72 20 66 69 6c 65 20 61 72 65 20 63  cular file are c
5ac0: 6f 6d 6d 69 74 74 65 64 20 74 6f 20 64 69 73 6b  ommitted to disk
5ad0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 4f  ..*/.int sqliteO
5ae0: 73 53 79 6e 63 28 4f 73 46 69 6c 65 20 2a 69 64  sSync(OsFile *id
5af0: 29 7b 0a 23 69 66 20 4f 53 5f 55 4e 49 58 0a 20  ){.#if OS_UNIX. 
5b00: 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
5b10: 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 3b 0a  (SQLITE_IOERR);.
5b20: 20 20 54 52 41 43 45 32 28 22 53 59 4e 43 20 20    TRACE2("SYNC  
5b30: 20 20 25 2d 33 64 5c 6e 22 2c 20 69 64 2d 3e 66    %-3d\n", id->f
5b40: 64 29 3b 0a 20 20 69 66 28 20 66 73 79 6e 63 28  d);.  if( fsync(
5b50: 69 64 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 72  id->fd) ){.    r
5b60: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
5b70: 52 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  RR;.  }else{.   
5b80: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
5b90: 4b 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69  K;.  }.#endif.#i
5ba0: 66 20 4f 53 5f 57 49 4e 0a 20 20 69 66 28 20 46  f OS_WIN.  if( F
5bb0: 6c 75 73 68 46 69 6c 65 42 75 66 66 65 72 73 28  lushFileBuffers(
5bc0: 69 64 2d 3e 68 29 20 29 7b 0a 20 20 20 20 72 65  id->h) ){.    re
5bd0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
5be0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
5bf0: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
5c00: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66  ;.  }.#endif.#if
5c10: 20 4f 53 5f 4d 41 43 0a 23 20 69 66 64 65 66 20   OS_MAC.# ifdef 
5c20: 5f 4c 41 52 47 45 5f 46 49 4c 45 0a 20 20 69 66  _LARGE_FILE.  if
5c30: 28 20 46 53 46 6c 75 73 68 46 6f 72 6b 28 69 64  ( FSFlushFork(id
5c40: 2d 3e 72 65 66 4e 75 6d 29 20 21 3d 20 6e 6f 45  ->refNum) != noE
5c50: 72 72 20 29 7b 0a 23 20 65 6c 73 65 0a 20 20 50  rr ){.# else.  P
5c60: 61 72 61 6d 42 6c 6f 63 6b 52 65 63 20 70 61 72  aramBlockRec par
5c70: 61 6d 73 3b 0a 20 20 6d 65 6d 73 65 74 28 26 70  ams;.  memset(&p
5c80: 61 72 61 6d 73 2c 20 30 2c 20 73 69 7a 65 6f 66  arams, 0, sizeof
5c90: 28 50 61 72 61 6d 42 6c 6f 63 6b 52 65 63 29 29  (ParamBlockRec))
5ca0: 3b 0a 20 20 70 61 72 61 6d 73 2e 69 6f 50 61 72  ;.  params.ioPar
5cb0: 61 6d 2e 69 6f 52 65 66 4e 75 6d 20 3d 20 69 64  am.ioRefNum = id
5cc0: 2d 3e 72 65 66 4e 75 6d 3b 0a 20 20 69 66 28 20  ->refNum;.  if( 
5cd0: 50 42 46 6c 75 73 68 46 69 6c 65 53 79 6e 63 28  PBFlushFileSync(
5ce0: 26 70 61 72 61 6d 73 29 20 21 3d 20 6e 6f 45 72  &params) != noEr
5cf0: 72 20 29 7b 0a 23 20 65 6e 64 69 66 0a 20 20 20  r ){.# endif.   
5d00: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
5d10: 4f 45 52 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  OERR;.  }else{. 
5d20: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
5d30: 5f 4f 4b 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  _OK;.  }.#endif.
5d40: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74  }../*.** Truncat
5d50: 65 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20 74  e an open file t
5d60: 6f 20 61 20 73 70 65 63 69 66 69 65 64 20 73 69  o a specified si
5d70: 7a 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  ze.*/.int sqlite
5d80: 4f 73 54 72 75 6e 63 61 74 65 28 4f 73 46 69 6c  OsTruncate(OsFil
5d90: 65 20 2a 69 64 2c 20 6f 66 66 5f 74 20 6e 42 79  e *id, off_t nBy
5da0: 74 65 29 7b 0a 20 20 53 69 6d 75 6c 61 74 65 49  te){.  SimulateI
5db0: 4f 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  OError(SQLITE_IO
5dc0: 45 52 52 29 3b 0a 23 69 66 20 4f 53 5f 55 4e 49  ERR);.#if OS_UNI
5dd0: 58 0a 20 20 72 65 74 75 72 6e 20 66 74 72 75 6e  X.  return ftrun
5de0: 63 61 74 65 28 69 64 2d 3e 66 64 2c 20 6e 42 79  cate(id->fd, nBy
5df0: 74 65 29 3d 3d 30 20 3f 20 53 51 4c 49 54 45 5f  te)==0 ? SQLITE_
5e00: 4f 4b 20 3a 20 53 51 4c 49 54 45 5f 49 4f 45 52  OK : SQLITE_IOER
5e10: 52 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f 53  R;.#endif.#if OS
5e20: 5f 57 49 4e 0a 20 20 7b 0a 20 20 20 20 4c 4f 4e  _WIN.  {.    LON
5e30: 47 20 75 70 70 65 72 42 69 74 73 20 3d 20 6e 42  G upperBits = nB
5e40: 79 74 65 3e 3e 33 32 3b 0a 20 20 20 20 53 65 74  yte>>32;.    Set
5e50: 46 69 6c 65 50 6f 69 6e 74 65 72 28 69 64 2d 3e  FilePointer(id->
5e60: 68 2c 20 6e 42 79 74 65 2c 20 26 75 70 70 65 72  h, nByte, &upper
5e70: 42 69 74 73 2c 20 46 49 4c 45 5f 42 45 47 49 4e  Bits, FILE_BEGIN
5e80: 29 3b 0a 20 20 20 20 53 65 74 45 6e 64 4f 66 46  );.    SetEndOfF
5e90: 69 6c 65 28 69 64 2d 3e 68 29 3b 0a 20 20 7d 0a  ile(id->h);.  }.
5ea0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
5eb0: 4f 4b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f  OK;.#endif.#if O
5ec0: 53 5f 4d 41 43 0a 23 20 69 66 64 65 66 20 5f 4c  S_MAC.# ifdef _L
5ed0: 41 52 47 45 5f 46 49 4c 45 0a 20 20 69 66 28 20  ARGE_FILE.  if( 
5ee0: 46 53 53 65 74 46 6f 72 6b 53 69 7a 65 28 69 64  FSSetForkSize(id
5ef0: 2d 3e 72 65 66 4e 75 6d 2c 20 66 73 46 72 6f 6d  ->refNum, fsFrom
5f00: 53 74 61 72 74 2c 20 6e 42 79 74 65 29 20 21 3d  Start, nByte) !=
5f10: 20 6e 6f 45 72 72 29 7b 0a 23 20 65 6c 73 65 0a   noErr){.# else.
5f20: 20 20 69 66 28 20 53 65 74 45 4f 46 28 69 64 2d    if( SetEOF(id-
5f30: 3e 72 65 66 4e 75 6d 2c 20 6e 42 79 74 65 29 20  >refNum, nByte) 
5f40: 21 3d 20 6e 6f 45 72 72 20 29 7b 0a 23 20 65 6e  != noErr ){.# en
5f50: 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53  dif.    return S
5f60: 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 7d  QLITE_IOERR;.  }
5f70: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
5f80: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
5f90: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
5fa0: 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 63 75  Determine the cu
5fb0: 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 61 20  rrent size of a 
5fc0: 66 69 6c 65 20 69 6e 20 62 79 74 65 73 0a 2a 2f  file in bytes.*/
5fd0: 0a 69 6e 74 20 73 71 6c 69 74 65 4f 73 46 69 6c  .int sqliteOsFil
5fe0: 65 53 69 7a 65 28 4f 73 46 69 6c 65 20 2a 69 64  eSize(OsFile *id
5ff0: 2c 20 6f 66 66 5f 74 20 2a 70 53 69 7a 65 29 7b  , off_t *pSize){
6000: 0a 23 69 66 20 4f 53 5f 55 4e 49 58 0a 20 20 73  .#if OS_UNIX.  s
6010: 74 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a  truct stat buf;.
6020: 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
6030: 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 3b  r(SQLITE_IOERR);
6040: 0a 20 20 69 66 28 20 66 73 74 61 74 28 69 64 2d  .  if( fstat(id-
6050: 3e 66 64 2c 20 26 62 75 66 29 21 3d 30 20 29 7b  >fd, &buf)!=0 ){
6060: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
6070: 54 45 5f 49 4f 45 52 52 3b 0a 20 20 7d 0a 20 20  TE_IOERR;.  }.  
6080: 2a 70 53 69 7a 65 20 3d 20 62 75 66 2e 73 74 5f  *pSize = buf.st_
6090: 73 69 7a 65 3b 0a 20 20 72 65 74 75 72 6e 20 53  size;.  return S
60a0: 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66  QLITE_OK;.#endif
60b0: 0a 23 69 66 20 4f 53 5f 57 49 4e 0a 20 20 44 57  .#if OS_WIN.  DW
60c0: 4f 52 44 20 75 70 70 65 72 42 69 74 73 2c 20 6c  ORD upperBits, l
60d0: 6f 77 65 72 42 69 74 73 3b 0a 20 20 53 69 6d 75  owerBits;.  Simu
60e0: 6c 61 74 65 49 4f 45 72 72 6f 72 28 53 51 4c 49  lateIOError(SQLI
60f0: 54 45 5f 49 4f 45 52 52 29 3b 0a 20 20 6c 6f 77  TE_IOERR);.  low
6100: 65 72 42 69 74 73 20 3d 20 47 65 74 46 69 6c 65  erBits = GetFile
6110: 53 69 7a 65 28 69 64 2d 3e 68 2c 20 26 75 70 70  Size(id->h, &upp
6120: 65 72 42 69 74 73 29 3b 0a 20 20 2a 70 53 69 7a  erBits);.  *pSiz
6130: 65 20 3d 20 28 28 28 6f 66 66 5f 74 29 75 70 70  e = (((off_t)upp
6140: 65 72 42 69 74 73 29 3c 3c 33 32 29 20 2b 20 6c  erBits)<<32) + l
6150: 6f 77 65 72 42 69 74 73 3b 0a 20 20 72 65 74 75  owerBits;.  retu
6160: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65  rn SQLITE_OK;.#e
6170: 6e 64 69 66 0a 23 69 66 20 4f 53 5f 4d 41 43 0a  ndif.#if OS_MAC.
6180: 23 20 69 66 64 65 66 20 5f 4c 41 52 47 45 5f 46  # ifdef _LARGE_F
6190: 49 4c 45 0a 20 20 69 66 28 20 46 53 47 65 74 46  ILE.  if( FSGetF
61a0: 6f 72 6b 53 69 7a 65 28 69 64 2d 3e 72 65 66 4e  orkSize(id->refN
61b0: 75 6d 2c 20 70 53 69 7a 65 29 20 21 3d 20 6e 6f  um, pSize) != no
61c0: 45 72 72 29 7b 0a 23 20 65 6c 73 65 0a 20 20 69  Err){.# else.  i
61d0: 66 28 20 47 65 74 45 4f 46 28 69 64 2d 3e 72 65  f( GetEOF(id->re
61e0: 66 4e 75 6d 2c 20 70 53 69 7a 65 29 20 21 3d 20  fNum, pSize) != 
61f0: 6e 6f 45 72 72 20 29 7b 0a 23 20 65 6e 64 69 66  noErr ){.# endif
6200: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
6210: 54 45 5f 49 4f 45 52 52 3b 0a 20 20 7d 65 6c 73  TE_IOERR;.  }els
6220: 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  e{.    return SQ
6230: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 23 65 6e  LITE_OK;.  }.#en
6240: 64 69 66 0a 7d 0a 0a 23 69 66 20 4f 53 5f 57 49  dif.}..#if OS_WI
6250: 4e 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  N./*.** Return t
6260: 72 75 65 20 28 6e 6f 6e 2d 7a 65 72 6f 29 20 69  rue (non-zero) i
6270: 66 20 77 65 20 61 72 65 20 72 75 6e 6e 69 6e 67  f we are running
6280: 20 75 6e 64 65 72 20 57 69 6e 4e 54 2c 20 57 69   under WinNT, Wi
6290: 6e 32 4b 20 6f 72 20 57 69 6e 58 50 2e 0a 2a 2a  n2K or WinXP..**
62a0: 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20 28 7a   Return false (z
62b0: 65 72 6f 29 20 66 6f 72 20 57 69 6e 39 35 2c 20  ero) for Win95, 
62c0: 57 69 6e 39 38 2c 20 6f 72 20 57 69 6e 4d 45 2e  Win98, or WinME.
62d0: 0a 2a 2f 0a 69 6e 74 20 69 73 4e 54 28 76 6f 69  .*/.int isNT(voi
62e0: 64 29 7b 0a 20 20 73 74 61 74 69 63 20 6f 73 54  d){.  static osT
62f0: 79 70 65 20 3d 20 30 3b 20 20 20 2f 2a 20 30 3d  ype = 0;   /* 0=
6300: 75 6e 6b 6e 6f 77 6e 20 31 3d 77 69 6e 39 35 20  unknown 1=win95 
6310: 32 3d 77 69 6e 4e 54 20 2a 2f 0a 20 20 69 66 28  2=winNT */.  if(
6320: 20 6f 73 54 79 70 65 3d 3d 30 20 29 7b 0a 20 20   osType==0 ){.  
6330: 20 20 4f 53 56 45 52 53 49 4f 4e 49 4e 46 4f 20    OSVERSIONINFO 
6340: 73 49 6e 66 6f 3b 0a 20 20 20 20 73 49 6e 66 6f  sInfo;.    sInfo
6350: 2e 64 77 4f 53 56 65 72 73 69 6f 6e 49 6e 66 6f  .dwOSVersionInfo
6360: 53 69 7a 65 20 3d 20 73 69 7a 65 6f 66 28 73 49  Size = sizeof(sI
6370: 6e 66 6f 29 3b 0a 20 20 20 20 47 65 74 56 65 72  nfo);.    GetVer
6380: 73 69 6f 6e 45 78 28 26 73 49 6e 66 6f 29 3b 0a  sionEx(&sInfo);.
6390: 20 20 20 20 6f 73 54 79 70 65 20 3d 20 73 49 6e      osType = sIn
63a0: 66 6f 2e 64 77 50 6c 61 74 66 6f 72 6d 49 64 3d  fo.dwPlatformId=
63b0: 3d 56 45 52 5f 50 4c 41 54 46 4f 52 4d 5f 57 49  =VER_PLATFORM_WI
63c0: 4e 33 32 5f 4e 54 20 3f 20 32 20 3a 20 31 3b 0a  N32_NT ? 2 : 1;.
63d0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6f 73 54    }.  return osT
63e0: 79 70 65 3d 3d 32 3b 0a 7d 0a 23 65 6e 64 69 66  ype==2;.}.#endif
63f0: 0a 0a 2f 2a 0a 2a 2a 20 57 69 6e 64 6f 77 73 20  ../*.** Windows 
6400: 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 6e 6f 74  file locking not
6410: 65 73 3a 20 20 5b 74 68 65 20 73 61 6d 65 2f 65  es:  [the same/e
6420: 71 75 69 76 61 6c 65 6e 74 20 61 70 70 6c 69 65  quivalent applie
6430: 73 20 74 6f 20 4d 61 63 4f 53 5d 0a 2a 2a 0a 2a  s to MacOS].**.*
6440: 2a 20 57 65 20 63 61 6e 6e 6f 74 20 75 73 65 20  * We cannot use 
6450: 4c 6f 63 6b 46 69 6c 65 45 78 28 29 20 6f 72 20  LockFileEx() or 
6460: 55 6e 6c 6f 63 6b 46 69 6c 65 45 78 28 29 20 62  UnlockFileEx() b
6470: 65 63 61 75 73 65 20 74 68 6f 73 65 20 66 75 6e  ecause those fun
6480: 63 74 69 6f 6e 73 0a 2a 2a 20 61 72 65 20 6e 6f  ctions.** are no
6490: 74 20 61 76 61 69 6c 61 62 6c 65 20 75 6e 64 65  t available unde
64a0: 72 20 57 69 6e 39 35 2f 39 38 2f 4d 45 2e 20 20  r Win95/98/ME.  
64b0: 53 6f 20 77 65 20 75 73 65 20 6f 6e 6c 79 20 4c  So we use only L
64c0: 6f 63 6b 46 69 6c 65 28 29 20 61 6e 64 0a 2a 2a  ockFile() and.**
64d0: 20 55 6e 6c 6f 63 6b 46 69 6c 65 28 29 2e 0a 2a   UnlockFile()..*
64e0: 2a 0a 2a 2a 20 4c 6f 63 6b 46 69 6c 65 28 29 20  *.** LockFile() 
64f0: 70 72 65 76 65 6e 74 73 20 6e 6f 74 20 6a 75 73  prevents not jus
6500: 74 20 77 72 69 74 69 6e 67 20 62 75 74 20 61 6c  t writing but al
6510: 73 6f 20 72 65 61 64 69 6e 67 20 62 79 20 6f 74  so reading by ot
6520: 68 65 72 20 70 72 6f 63 65 73 73 65 73 2e 0a 2a  her processes..*
6530: 2a 20 28 54 68 69 73 20 69 73 20 61 20 64 65 73  * (This is a des
6540: 69 67 6e 20 65 72 72 6f 72 20 6f 6e 20 74 68 65  ign error on the
6550: 20 70 61 72 74 20 6f 66 20 57 69 6e 64 6f 77 73   part of Windows
6560: 2c 20 62 75 74 20 74 68 65 72 65 20 69 73 20 6e  , but there is n
6570: 6f 74 68 69 6e 67 0a 2a 2a 20 77 65 20 63 61 6e  othing.** we can
6580: 20 64 6f 20 61 62 6f 75 74 20 74 68 61 74 2e 29   do about that.)
6590: 20 20 53 6f 20 74 68 65 20 72 65 67 69 6f 6e 20    So the region 
65a0: 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67  used for locking
65b0: 20 69 73 20 61 74 20 74 68 65 0a 2a 2a 20 65 6e   is at the.** en
65c0: 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 77 68  d of the file wh
65d0: 65 72 65 20 69 74 20 69 73 20 75 6e 6c 69 6b 65  ere it is unlike
65e0: 6c 79 20 74 6f 20 65 76 65 72 20 69 6e 74 65 72  ly to ever inter
65f0: 66 65 72 65 20 77 69 74 68 20 61 6e 0a 2a 2a 20  fere with an.** 
6600: 61 63 74 75 61 6c 20 72 65 61 64 20 61 74 74 65  actual read atte
6610: 6d 70 74 2e 0a 2a 2a 0a 2a 2a 20 41 20 64 61 74  mpt..**.** A dat
6620: 61 62 61 73 65 20 72 65 61 64 20 6c 6f 63 6b 20  abase read lock 
6630: 69 73 20 6f 62 74 61 69 6e 65 64 20 62 79 20 6c  is obtained by l
6640: 6f 63 6b 69 6e 67 20 61 20 73 69 6e 67 6c 65 20  ocking a single 
6650: 72 61 6e 64 6f 6d 6c 79 2d 63 68 6f 73 65 6e 20  randomly-chosen 
6660: 0a 2a 2a 20 62 79 74 65 20 6f 75 74 20 6f 66 20  .** byte out of 
6670: 61 20 73 70 65 63 69 66 69 63 20 72 61 6e 67 65  a specific range
6680: 20 6f 66 20 62 79 74 65 73 2e 20 54 68 65 20 6c   of bytes. The l
6690: 6f 63 6b 20 62 79 74 65 20 69 73 20 6f 62 74 61  ock byte is obta
66a0: 69 6e 65 64 20 61 74 20 0a 2a 2a 20 72 61 6e 64  ined at .** rand
66b0: 6f 6d 20 73 6f 20 74 77 6f 20 73 65 70 61 72 61  om so two separa
66c0: 74 65 20 72 65 61 64 65 72 73 20 63 61 6e 20 70  te readers can p
66d0: 72 6f 62 61 62 6c 79 20 61 63 63 65 73 73 20 74  robably access t
66e0: 68 65 20 66 69 6c 65 20 61 74 20 74 68 65 20 0a  he file at the .
66f0: 2a 2a 20 73 61 6d 65 20 74 69 6d 65 2c 20 75 6e  ** same time, un
6700: 6c 65 73 73 20 74 68 65 79 20 61 72 65 20 75 6e  less they are un
6710: 6c 75 63 6b 79 20 61 6e 64 20 63 68 6f 6f 73 65  lucky and choose
6720: 20 74 68 65 20 73 61 6d 65 20 6c 6f 63 6b 20 62   the same lock b
6730: 79 74 65 2e 0a 2a 2a 20 41 20 64 61 74 61 62 61  yte..** A databa
6740: 73 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 69 73  se write lock is
6750: 20 6f 62 74 61 69 6e 65 64 20 62 79 20 6c 6f 63   obtained by loc
6760: 6b 69 6e 67 20 61 6c 6c 20 62 79 74 65 73 20 69  king all bytes i
6770: 6e 20 74 68 65 20 72 61 6e 67 65 2e 0a 2a 2a 20  n the range..** 
6780: 54 68 65 72 65 20 63 61 6e 20 6f 6e 6c 79 20 62  There can only b
6790: 65 20 6f 6e 65 20 77 72 69 74 65 72 2e 0a 2a 2a  e one writer..**
67a0: 0a 2a 2a 20 41 20 6c 6f 63 6b 20 69 73 20 6f 62  .** A lock is ob
67b0: 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 66 69  tained on the fi
67c0: 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20  rst byte of the 
67d0: 6c 6f 63 6b 20 72 61 6e 67 65 20 62 65 66 6f 72  lock range befor
67e0: 65 20 61 63 71 75 69 72 69 6e 67 0a 2a 2a 20 65  e acquiring.** e
67f0: 69 74 68 65 72 20 61 20 72 65 61 64 20 6c 6f 63  ither a read loc
6800: 6b 20 6f 72 20 61 20 77 72 69 74 65 20 6c 6f 63  k or a write loc
6810: 6b 2e 20 20 54 68 69 73 20 70 72 65 76 65 6e 74  k.  This prevent
6820: 73 20 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20  s two processes 
6830: 66 72 6f 6d 0a 2a 2a 20 61 74 74 65 6d 70 74 69  from.** attempti
6840: 6e 67 20 74 6f 20 67 65 74 20 61 20 6c 6f 63 6b  ng to get a lock
6850: 20 61 74 20 61 20 73 61 6d 65 20 74 69 6d 65 2e   at a same time.
6860: 20 20 54 68 65 20 73 65 6d 61 6e 74 69 63 73 20    The semantics 
6870: 6f 66 20 0a 2a 2a 20 73 71 6c 69 74 65 4f 73 52  of .** sqliteOsR
6880: 65 61 64 4c 6f 63 6b 28 29 20 72 65 71 75 69 72  eadLock() requir
6890: 65 20 74 68 61 74 20 69 66 20 74 68 65 72 65 20  e that if there 
68a0: 69 73 20 61 6c 72 65 61 64 79 20 61 20 77 72 69  is already a wri
68b0: 74 65 20 6c 6f 63 6b 2c 20 74 68 61 74 0a 2a 2a  te lock, that.**
68c0: 20 6c 6f 63 6b 20 69 73 20 63 6f 6e 76 65 72 74   lock is convert
68d0: 65 64 20 69 6e 74 6f 20 61 20 72 65 61 64 20 6c  ed into a read l
68e0: 6f 63 6b 20 61 74 6f 6d 69 63 61 6c 6c 79 2e 20  ock atomically. 
68f0: 20 54 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65   The lock on the
6900: 20 66 69 72 73 74 0a 2a 2a 20 62 79 74 65 20 61   first.** byte a
6910: 6c 6c 6f 77 73 20 75 73 20 74 6f 20 64 72 6f 70  llows us to drop
6920: 20 74 68 65 20 6f 6c 64 20 77 72 69 74 65 20 6c   the old write l
6930: 6f 63 6b 20 61 6e 64 20 67 65 74 20 74 68 65 20  ock and get the 
6940: 72 65 61 64 20 6c 6f 63 6b 20 77 69 74 68 6f 75  read lock withou
6950: 74 0a 2a 2a 20 61 6e 6f 74 68 65 72 20 70 72 6f  t.** another pro
6960: 63 65 73 73 20 6a 75 6d 70 69 6e 67 20 69 6e 74  cess jumping int
6970: 6f 20 74 68 65 20 6d 69 64 64 6c 65 20 61 6e 64  o the middle and
6980: 20 6d 65 73 73 69 6e 67 20 75 73 20 75 70 2e 20   messing us up. 
6990: 20 54 68 65 20 73 61 6d 65 0a 2a 2a 20 61 72 67   The same.** arg
69a0: 75 6d 65 6e 74 20 61 70 70 6c 69 65 73 20 74 6f  ument applies to
69b0: 20 73 71 6c 69 74 65 4f 73 57 72 69 74 65 4c 6f   sqliteOsWriteLo
69c0: 63 6b 28 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  ck()..**.** Note
69d0: 3a 20 4f 6e 20 4d 61 63 4f 53 20 77 65 20 75 73  : On MacOS we us
69e0: 65 20 74 68 65 20 72 65 73 6f 75 72 63 65 20 66  e the resource f
69f0: 6f 72 6b 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 2e  ork for locking.
6a00: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  .**.** The follo
6a10: 77 69 6e 67 20 23 64 65 66 69 6e 65 73 20 73 70  wing #defines sp
6a20: 65 63 69 66 79 20 74 68 65 20 72 61 6e 67 65 20  ecify the range 
6a30: 6f 66 20 62 79 74 65 73 20 75 73 65 64 20 66 6f  of bytes used fo
6a40: 72 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2a 20 4e 5f  r locking..** N_
6a50: 4c 4f 43 4b 42 59 54 45 20 69 73 20 74 68 65 20  LOCKBYTE is the 
6a60: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
6a70: 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 64 6f  available for do
6a80: 69 6e 67 20 74 68 65 20 6c 6f 63 6b 69 6e 67 2e  ing the locking.
6a90: 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 62 79  .** The first by
6aa0: 74 65 20 75 73 65 64 20 74 6f 20 68 6f 6c 64 20  te used to hold 
6ab0: 74 68 65 20 6c 6f 63 6b 20 77 68 69 6c 65 20 74  the lock while t
6ac0: 68 65 20 6c 6f 63 6b 20 69 73 20 63 68 61 6e 67  he lock is chang
6ad0: 69 6e 67 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20  ing does.** not 
6ae0: 63 6f 75 6e 74 20 74 6f 77 61 72 64 20 74 68 69  count toward thi
6af0: 73 20 6e 75 6d 62 65 72 2e 20 20 46 49 52 53 54  s number.  FIRST
6b00: 5f 4c 4f 43 4b 42 59 54 45 20 69 73 20 74 68 65  _LOCKBYTE is the
6b10: 20 61 64 64 72 65 73 73 20 6f 66 0a 2a 2a 20 74   address of.** t
6b20: 68 65 20 66 69 72 73 74 20 62 79 74 65 20 69 6e  he first byte in
6b30: 20 74 68 65 20 72 61 6e 67 65 20 6f 66 20 62 79   the range of by
6b40: 74 65 73 20 75 73 65 64 20 66 6f 72 20 6c 6f 63  tes used for loc
6b50: 6b 69 6e 67 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  king..*/.#define
6b60: 20 4e 5f 4c 4f 43 4b 42 59 54 45 20 20 20 20 20   N_LOCKBYTE     
6b70: 20 20 31 30 32 33 39 0a 23 69 66 20 4f 53 5f 4d    10239.#if OS_M
6b80: 41 43 0a 23 20 64 65 66 69 6e 65 20 46 49 52 53  AC.# define FIRS
6b90: 54 5f 4c 4f 43 4b 42 59 54 45 20 20 20 28 30 78  T_LOCKBYTE   (0x
6ba0: 30 30 30 66 66 66 66 66 20 2d 20 4e 5f 4c 4f 43  000fffff - N_LOC
6bb0: 4b 42 59 54 45 29 0a 23 65 6c 73 65 0a 23 20 64  KBYTE).#else.# d
6bc0: 65 66 69 6e 65 20 46 49 52 53 54 5f 4c 4f 43 4b  efine FIRST_LOCK
6bd0: 42 59 54 45 20 20 20 28 30 78 66 66 66 66 66 66  BYTE   (0xffffff
6be0: 66 66 20 2d 20 4e 5f 4c 4f 43 4b 42 59 54 45 29  ff - N_LOCKBYTE)
6bf0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43  .#endif../*.** C
6c00: 68 61 6e 67 65 20 74 68 65 20 73 74 61 74 75 73  hange the status
6c10: 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20   of the lock on 
6c20: 74 68 65 20 66 69 6c 65 20 22 69 64 22 20 74 6f  the file "id" to
6c30: 20 62 65 20 61 20 72 65 61 64 6c 6f 63 6b 2e 0a   be a readlock..
6c40: 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 77  ** If the file w
6c50: 61 73 20 77 72 69 74 65 20 6c 6f 63 6b 65 64 2c  as write locked,
6c60: 20 74 68 65 6e 20 74 68 69 73 20 72 65 64 75 63   then this reduc
6c70: 65 73 20 74 68 65 20 6c 6f 63 6b 20 74 6f 20 61  es the lock to a
6c80: 20 72 65 61 64 2e 0a 2a 2a 20 49 66 20 74 68 65   read..** If the
6c90: 20 66 69 6c 65 20 77 61 73 20 72 65 61 64 20 6c   file was read l
6ca0: 6f 63 6b 65 64 2c 20 74 68 65 6e 20 74 68 69 73  ocked, then this
6cb0: 20 61 63 71 75 69 72 65 73 20 61 20 6e 65 77 20   acquires a new 
6cc0: 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a  read lock..**.**
6cd0: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
6ce0: 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 61 6e 64  K on success and
6cf0: 20 53 51 4c 49 54 45 5f 42 55 53 59 20 6f 6e 20   SQLITE_BUSY on 
6d00: 66 61 69 6c 75 72 65 2e 20 20 49 66 20 74 68 69  failure.  If thi
6d10: 73 0a 2a 2a 20 6c 69 62 72 61 72 79 20 77 61 73  s.** library was
6d20: 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 6c   compiled with l
6d30: 61 72 67 65 20 66 69 6c 65 20 73 75 70 70 6f 72  arge file suppor
6d40: 74 20 28 4c 46 53 29 20 62 75 74 20 4c 46 53 20  t (LFS) but LFS 
6d50: 69 73 20 6e 6f 74 0a 2a 2a 20 61 76 61 69 6c 61  is not.** availa
6d60: 62 6c 65 20 6f 6e 20 74 68 65 20 68 6f 73 74 2c  ble on the host,
6d70: 20 74 68 65 6e 20 61 6e 20 53 51 4c 49 54 45 5f   then an SQLITE_
6d80: 4e 4f 4c 46 53 20 69 73 20 72 65 74 75 72 6e 65  NOLFS is returne
6d90: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
6da0: 4f 73 52 65 61 64 4c 6f 63 6b 28 4f 73 46 69 6c  OsReadLock(OsFil
6db0: 65 20 2a 69 64 29 7b 0a 23 69 66 20 4f 53 5f 55  e *id){.#if OS_U
6dc0: 4e 49 58 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  NIX.  int rc;.  
6dd0: 73 71 6c 69 74 65 4f 73 45 6e 74 65 72 4d 75 74  sqliteOsEnterMut
6de0: 65 78 28 29 3b 0a 20 20 69 66 28 20 69 64 2d 3e  ex();.  if( id->
6df0: 70 4c 6f 63 6b 2d 3e 63 6e 74 3e 30 20 29 7b 0a  pLock->cnt>0 ){.
6e00: 20 20 20 20 69 66 28 20 21 69 64 2d 3e 6c 6f 63      if( !id->loc
6e10: 6b 65 64 20 29 7b 0a 20 20 20 20 20 20 69 64 2d  ked ){.      id-
6e20: 3e 70 4c 6f 63 6b 2d 3e 63 6e 74 2b 2b 3b 0a 20  >pLock->cnt++;. 
6e30: 20 20 20 20 20 69 64 2d 3e 6c 6f 63 6b 65 64 20       id->locked 
6e40: 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  = 1;.    }.    r
6e50: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
6e60: 20 7d 65 6c 73 65 20 69 66 28 20 69 64 2d 3e 6c   }else if( id->l
6e70: 6f 63 6b 65 64 20 7c 7c 20 69 64 2d 3e 70 4c 6f  ocked || id->pLo
6e80: 63 6b 2d 3e 63 6e 74 3d 3d 30 20 29 7b 0a 20 20  ck->cnt==0 ){.  
6e90: 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c    struct flock l
6ea0: 6f 63 6b 3b 0a 20 20 20 20 69 6e 74 20 73 3b 0a  ock;.    int s;.
6eb0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20      lock.l_type 
6ec0: 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 20 20 6c  = F_RDLCK;.    l
6ed0: 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53  ock.l_whence = S
6ee0: 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 6c 6f 63  EEK_SET;.    loc
6ef0: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 6c 6f 63 6b  k.l_start = lock
6f00: 2e 6c 5f 6c 65 6e 20 3d 20 30 4c 3b 0a 20 20 20  .l_len = 0L;.   
6f10: 20 73 20 3d 20 66 63 6e 74 6c 28 69 64 2d 3e 66   s = fcntl(id->f
6f20: 64 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63  d, F_SETLK, &loc
6f30: 6b 29 3b 0a 20 20 20 20 69 66 28 20 73 21 3d 30  k);.    if( s!=0
6f40: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 28   ){.      rc = (
6f50: 73 3d 3d 45 49 4e 56 41 4c 29 20 3f 20 53 51 4c  s==EINVAL) ? SQL
6f60: 49 54 45 5f 4e 4f 4c 46 53 20 3a 20 53 51 4c 49  ITE_NOLFS : SQLI
6f70: 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 65 6c  TE_BUSY;.    }el
6f80: 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
6f90: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
6fa0: 69 64 2d 3e 70 4c 6f 63 6b 2d 3e 63 6e 74 20 3d  id->pLock->cnt =
6fb0: 20 31 3b 0a 20 20 20 20 20 20 69 64 2d 3e 6c 6f   1;.      id->lo
6fc0: 63 6b 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  cked = 1;.    }.
6fd0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
6fe0: 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
6ff0: 20 7d 0a 20 20 73 71 6c 69 74 65 4f 73 4c 65 61   }.  sqliteOsLea
7000: 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74  veMutex();.  ret
7010: 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 23  urn rc;.#endif.#
7020: 69 66 20 4f 53 5f 57 49 4e 0a 20 20 69 6e 74 20  if OS_WIN.  int 
7030: 72 63 3b 0a 20 20 69 66 28 20 69 64 2d 3e 6c 6f  rc;.  if( id->lo
7040: 63 6b 65 64 3e 30 20 29 7b 0a 20 20 20 20 72 63  cked>0 ){.    rc
7050: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
7060: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6c  }else{.    int l
7070: 6b 20 3d 20 28 73 71 6c 69 74 65 52 61 6e 64 6f  k = (sqliteRando
7080: 6d 49 6e 74 65 67 65 72 28 29 20 26 20 30 78 37  mInteger() & 0x7
7090: 66 66 66 66 66 66 29 25 4e 5f 4c 4f 43 4b 42 59  ffffff)%N_LOCKBY
70a0: 54 45 2b 31 3b 0a 20 20 20 20 69 6e 74 20 72 65  TE+1;.    int re
70b0: 73 3b 0a 20 20 20 20 69 6e 74 20 63 6e 74 20 3d  s;.    int cnt =
70c0: 20 31 30 30 3b 0a 20 20 20 20 69 6e 74 20 70 61   100;.    int pa
70d0: 67 65 20 3d 20 69 73 4e 54 28 29 20 3f 20 30 78  ge = isNT() ? 0x
70e0: 66 66 66 66 66 66 66 66 20 3a 20 30 3b 0a 20 20  ffffffff : 0;.  
70f0: 20 20 77 68 69 6c 65 28 20 63 6e 74 2d 2d 3e 30    while( cnt-->0
7100: 20 26 26 20 28 72 65 73 20 3d 20 4c 6f 63 6b 46   && (res = LockF
7110: 69 6c 65 28 69 64 2d 3e 68 2c 20 46 49 52 53 54  ile(id->h, FIRST
7120: 5f 4c 4f 43 4b 42 59 54 45 2c 20 70 61 67 65 2c  _LOCKBYTE, page,
7130: 20 31 2c 20 30 29 29 3d 3d 30 20 29 7b 0a 20 20   1, 0))==0 ){.  
7140: 20 20 20 20 53 6c 65 65 70 28 31 29 3b 0a 20 20      Sleep(1);.  
7150: 20 20 7d 0a 20 20 20 20 69 66 28 20 72 65 73 20    }.    if( res 
7160: 29 7b 0a 20 20 20 20 20 20 55 6e 6c 6f 63 6b 46  ){.      UnlockF
7170: 69 6c 65 28 69 64 2d 3e 68 2c 20 46 49 52 53 54  ile(id->h, FIRST
7180: 5f 4c 4f 43 4b 42 59 54 45 2b 31 2c 20 70 61 67  _LOCKBYTE+1, pag
7190: 65 2c 20 4e 5f 4c 4f 43 4b 42 59 54 45 2c 20 30  e, N_LOCKBYTE, 0
71a0: 29 3b 0a 20 20 20 20 20 20 72 65 73 20 3d 20 4c  );.      res = L
71b0: 6f 63 6b 46 69 6c 65 28 69 64 2d 3e 68 2c 20 46  ockFile(id->h, F
71c0: 49 52 53 54 5f 4c 4f 43 4b 42 59 54 45 2b 6c 6b  IRST_LOCKBYTE+lk
71d0: 2c 20 70 61 67 65 2c 20 31 2c 20 30 29 3b 0a 20  , page, 1, 0);. 
71e0: 20 20 20 20 20 55 6e 6c 6f 63 6b 46 69 6c 65 28       UnlockFile(
71f0: 69 64 2d 3e 68 2c 20 46 49 52 53 54 5f 4c 4f 43  id->h, FIRST_LOC
7200: 4b 42 59 54 45 2c 20 70 61 67 65 2c 20 31 2c 20  KBYTE, page, 1, 
7210: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  0);.    }.    if
7220: 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20 69  ( res ){.      i
7230: 64 2d 3e 6c 6f 63 6b 65 64 20 3d 20 6c 6b 3b 0a  d->locked = lk;.
7240: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
7250: 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  E_OK;.    }else{
7260: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
7270: 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20  TE_BUSY;.    }. 
7280: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
7290: 23 65 6e 64 69 66 0a 23 69 66 20 4f 53 5f 4d 41  #endif.#if OS_MA
72a0: 43 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66  C.  int rc;.  if
72b0: 28 20 69 64 2d 3e 6c 6f 63 6b 65 64 3e 30 20 7c  ( id->locked>0 |
72c0: 7c 20 69 64 2d 3e 72 65 66 4e 75 6d 52 46 20 3d  | id->refNumRF =
72d0: 3d 20 2d 31 20 29 7b 0a 20 20 20 20 72 63 20 3d  = -1 ){.    rc =
72e0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
72f0: 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6c 6b 20  lse{.    int lk 
7300: 3d 20 28 73 71 6c 69 74 65 52 61 6e 64 6f 6d 49  = (sqliteRandomI
7310: 6e 74 65 67 65 72 28 29 20 26 20 30 78 37 66 66  nteger() & 0x7ff
7320: 66 66 66 66 29 25 4e 5f 4c 4f 43 4b 42 59 54 45  ffff)%N_LOCKBYTE
7330: 2b 31 3b 0a 20 20 20 20 4f 53 45 72 72 20 72 65  +1;.    OSErr re
7340: 73 3b 0a 20 20 20 20 69 6e 74 20 63 6e 74 20 3d  s;.    int cnt =
7350: 20 35 3b 0a 20 20 20 20 50 61 72 61 6d 42 6c 6f   5;.    ParamBlo
7360: 63 6b 52 65 63 20 70 61 72 61 6d 73 3b 0a 20 20  ckRec params;.  
7370: 20 20 6d 65 6d 73 65 74 28 26 70 61 72 61 6d 73    memset(&params
7380: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 61 72 61  , 0, sizeof(para
7390: 6d 73 29 29 3b 0a 20 20 20 20 70 61 72 61 6d 73  ms));.    params
73a0: 2e 69 6f 50 61 72 61 6d 2e 69 6f 52 65 66 4e 75  .ioParam.ioRefNu
73b0: 6d 20 3d 20 69 64 2d 3e 72 65 66 4e 75 6d 52 46  m = id->refNumRF
73c0: 3b 0a 20 20 20 20 70 61 72 61 6d 73 2e 69 6f 50  ;.    params.ioP
73d0: 61 72 61 6d 2e 69 6f 50 6f 73 4d 6f 64 65 20 3d  aram.ioPosMode =
73e0: 20 66 73 46 72 6f 6d 53 74 61 72 74 3b 0a 20 20   fsFromStart;.  
73f0: 20 20 70 61 72 61 6d 73 2e 69 6f 50 61 72 61 6d    params.ioParam
7400: 2e 69 6f 50 6f 73 4f 66 66 73 65 74 20 3d 20 46  .ioPosOffset = F
7410: 49 52 53 54 5f 4c 4f 43 4b 42 59 54 45 3b 0a 20  IRST_LOCKBYTE;. 
7420: 20 20 20 70 61 72 61 6d 73 2e 69 6f 50 61 72 61     params.ioPara
7430: 6d 2e 69 6f 52 65 71 43 6f 75 6e 74 20 3d 20 31  m.ioReqCount = 1
7440: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 63 6e 74  ;.    while( cnt
7450: 2d 2d 3e 30 20 26 26 20 28 72 65 73 20 3d 20 50  -->0 && (res = P
7460: 42 4c 6f 63 6b 52 61 6e 67 65 53 79 6e 63 28 26  BLockRangeSync(&
7470: 70 61 72 61 6d 73 29 29 21 3d 6e 6f 45 72 72 20  params))!=noErr 
7480: 29 7b 0a 20 20 20 20 20 20 55 49 6e 74 33 32 20  ){.      UInt32 
7490: 66 69 6e 61 6c 54 69 63 6b 73 3b 0a 20 20 20 20  finalTicks;.    
74a0: 20 20 44 65 6c 61 79 28 31 2c 20 26 66 69 6e 61    Delay(1, &fina
74b0: 6c 54 69 63 6b 73 29 3b 20 2f 2a 20 31 2f 36 30  lTicks); /* 1/60
74c0: 20 73 65 63 20 2a 2f 0a 20 20 20 20 7d 0a 20 20   sec */.    }.  
74d0: 20 20 69 66 28 20 72 65 73 20 3d 3d 20 6e 6f 45    if( res == noE
74e0: 72 72 20 29 7b 0a 20 20 20 20 20 20 70 61 72 61  rr ){.      para
74f0: 6d 73 2e 69 6f 50 61 72 61 6d 2e 69 6f 50 6f 73  ms.ioParam.ioPos
7500: 4f 66 66 73 65 74 20 3d 20 46 49 52 53 54 5f 4c  Offset = FIRST_L
7510: 4f 43 4b 42 59 54 45 2b 31 3b 0a 20 20 20 20 20  OCKBYTE+1;.     
7520: 20 70 61 72 61 6d 73 2e 69 6f 50 61 72 61 6d 2e   params.ioParam.
7530: 69 6f 52 65 71 43 6f 75 6e 74 20 3d 20 4e 5f 4c  ioReqCount = N_L
7540: 4f 43 4b 42 59 54 45 3b 0a 20 20 20 20 20 20 50  OCKBYTE;.      P
7550: 42 55 6e 6c 6f 63 6b 52 61 6e 67 65 53 79 6e 63  BUnlockRangeSync
7560: 28 26 70 61 72 61 6d 73 29 3b 0a 20 20 20 20 20  (&params);.     
7570: 20 70 61 72 61 6d 73 2e 69 6f 50 61 72 61 6d 2e   params.ioParam.
7580: 69 6f 50 6f 73 4f 66 66 73 65 74 20 3d 20 46 49  ioPosOffset = FI
7590: 52 53 54 5f 4c 4f 43 4b 42 59 54 45 2b 6c 6b 3b  RST_LOCKBYTE+lk;
75a0: 0a 20 20 20 20 20 20 70 61 72 61 6d 73 2e 69 6f  .      params.io
75b0: 50 61 72 61 6d 2e 69 6f 52 65 71 43 6f 75 6e 74  Param.ioReqCount
75c0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 65 73 20   = 1;.      res 
75d0: 3d 20 50 42 4c 6f 63 6b 52 61 6e 67 65 53 79 6e  = PBLockRangeSyn
75e0: 63 28 26 70 61 72 61 6d 73 29 3b 0a 20 20 20 20  c(&params);.    
75f0: 20 20 70 61 72 61 6d 73 2e 69 6f 50 61 72 61 6d    params.ioParam
7600: 2e 69 6f 50 6f 73 4f 66 66 73 65 74 20 3d 20 46  .ioPosOffset = F
7610: 49 52 53 54 5f 4c 4f 43 4b 42 59 54 45 3b 0a 20  IRST_LOCKBYTE;. 
7620: 20 20 20 20 20 70 61 72 61 6d 73 2e 69 6f 50 61       params.ioPa
7630: 72 61 6d 2e 69 6f 52 65 71 43 6f 75 6e 74 20 3d  ram.ioReqCount =
7640: 20 31 3b 0a 20 20 20 20 20 20 50 42 55 6e 6c 6f   1;.      PBUnlo
7650: 63 6b 52 61 6e 67 65 53 79 6e 63 28 26 70 61 72  ckRangeSync(&par
7660: 61 6d 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ams);.    }.    
7670: 69 66 28 20 72 65 73 20 3d 3d 20 6e 6f 45 72 72  if( res == noErr
7680: 20 29 7b 0a 20 20 20 20 20 20 69 64 2d 3e 6c 6f   ){.      id->lo
7690: 63 6b 65 64 20 3d 20 6c 6b 3b 0a 20 20 20 20 20  cked = lk;.     
76a0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
76b0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
76c0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
76d0: 53 59 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  SY;.    }.  }.  
76e0: 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69  return rc;.#endi
76f0: 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  f.}../*.** Chang
7700: 65 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 75  e the lock statu
7710: 73 20 74 6f 20 62 65 20 61 6e 20 65 78 63 6c 75  s to be an exclu
7720: 73 69 76 65 20 6f 72 20 77 72 69 74 65 20 6c 6f  sive or write lo
7730: 63 6b 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 53  ck.  Return.** S
7740: 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
7750: 65 73 73 20 61 6e 64 20 53 51 4c 49 54 45 5f 42  ess and SQLITE_B
7760: 55 53 59 20 6f 6e 20 61 20 66 61 69 6c 75 72 65  USY on a failure
7770: 2e 20 20 49 66 20 74 68 69 73 0a 2a 2a 20 6c 69  .  If this.** li
7780: 62 72 61 72 79 20 77 61 73 20 63 6f 6d 70 69 6c  brary was compil
7790: 65 64 20 77 69 74 68 20 6c 61 72 67 65 20 66 69  ed with large fi
77a0: 6c 65 20 73 75 70 70 6f 72 74 20 28 4c 46 53 29  le support (LFS)
77b0: 20 62 75 74 20 4c 46 53 20 69 73 20 6e 6f 74 0a   but LFS is not.
77c0: 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20  ** available on 
77d0: 74 68 65 20 68 6f 73 74 2c 20 74 68 65 6e 20 61  the host, then a
77e0: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 20 69  n SQLITE_NOLFS i
77f0: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69  s returned..*/.i
7800: 6e 74 20 73 71 6c 69 74 65 4f 73 57 72 69 74 65  nt sqliteOsWrite
7810: 4c 6f 63 6b 28 4f 73 46 69 6c 65 20 2a 69 64 29  Lock(OsFile *id)
7820: 7b 0a 23 69 66 20 4f 53 5f 55 4e 49 58 0a 20 20  {.#if OS_UNIX.  
7830: 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
7840: 4f 73 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  OsEnterMutex();.
7850: 20 20 69 66 28 20 69 64 2d 3e 70 4c 6f 63 6b 2d    if( id->pLock-
7860: 3e 63 6e 74 3d 3d 30 20 7c 7c 20 28 69 64 2d 3e  >cnt==0 || (id->
7870: 70 4c 6f 63 6b 2d 3e 63 6e 74 3d 3d 31 20 26 26  pLock->cnt==1 &&
7880: 20 69 64 2d 3e 6c 6f 63 6b 65 64 3d 3d 31 29 20   id->locked==1) 
7890: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 66 6c  ){.    struct fl
78a0: 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 20 20 69 6e  ock lock;.    in
78b0: 74 20 73 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  t s;.    lock.l_
78c0: 74 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a  type = F_WRLCK;.
78d0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63      lock.l_whenc
78e0: 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
78f0: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
7900: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 30 4c   lock.l_len = 0L
7910: 3b 0a 20 20 20 20 73 20 3d 20 66 63 6e 74 6c 28  ;.    s = fcntl(
7920: 69 64 2d 3e 66 64 2c 20 46 5f 53 45 54 4c 4b 2c  id->fd, F_SETLK,
7930: 20 26 6c 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28   &lock);.    if(
7940: 20 73 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72   s!=0 ){.      r
7950: 63 20 3d 20 28 73 3d 3d 45 49 4e 56 41 4c 29 20  c = (s==EINVAL) 
7960: 3f 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 20 3a  ? SQLITE_NOLFS :
7970: 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
7980: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
7990: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
79a0: 20 20 20 20 20 69 64 2d 3e 70 4c 6f 63 6b 2d 3e       id->pLock->
79b0: 63 6e 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  cnt = -1;.      
79c0: 69 64 2d 3e 6c 6f 63 6b 65 64 20 3d 20 31 3b 0a  id->locked = 1;.
79d0: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
79e0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
79f0: 55 53 59 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  USY;.  }.  sqlit
7a00: 65 4f 73 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  eOsLeaveMutex();
7a10: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65  .  return rc;.#e
7a20: 6e 64 69 66 0a 23 69 66 20 4f 53 5f 57 49 4e 0a  ndif.#if OS_WIN.
7a30: 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20    int rc;.  if( 
7a40: 69 64 2d 3e 6c 6f 63 6b 65 64 3c 30 20 29 7b 0a  id->locked<0 ){.
7a50: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
7a60: 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OK;.  }else{.   
7a70: 20 69 6e 74 20 72 65 73 3b 0a 20 20 20 20 69 6e   int res;.    in
7a80: 74 20 63 6e 74 20 3d 20 31 30 30 3b 0a 20 20 20  t cnt = 100;.   
7a90: 20 69 6e 74 20 70 61 67 65 20 3d 20 69 73 4e 54   int page = isNT
7aa0: 28 29 20 3f 20 30 78 66 66 66 66 66 66 66 66 20  () ? 0xffffffff 
7ab0: 3a 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  : 0;.    while( 
7ac0: 63 6e 74 2d 2d 3e 30 20 26 26 20 28 72 65 73 20  cnt-->0 && (res 
7ad0: 3d 20 4c 6f 63 6b 46 69 6c 65 28 69 64 2d 3e 68  = LockFile(id->h
7ae0: 2c 20 46 49 52 53 54 5f 4c 4f 43 4b 42 59 54 45  , FIRST_LOCKBYTE
7af0: 2c 20 70 61 67 65 2c 20 31 2c 20 30 29 29 3d 3d  , page, 1, 0))==
7b00: 30 20 29 7b 0a 20 20 20 20 20 20 53 6c 65 65 70  0 ){.      Sleep
7b10: 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  (1);.    }.    i
7b20: 66 28 20 72 65 73 20 29 7b 0a 20 20 20 20 20 20  f( res ){.      
7b30: 69 66 28 20 69 64 2d 3e 6c 6f 63 6b 65 64 3d 3d  if( id->locked==
7b40: 30 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  0 .            |
7b50: 7c 20 55 6e 6c 6f 63 6b 46 69 6c 65 28 69 64 2d  | UnlockFile(id-
7b60: 3e 68 2c 20 46 49 52 53 54 5f 4c 4f 43 4b 42 59  >h, FIRST_LOCKBY
7b70: 54 45 20 2b 20 69 64 2d 3e 6c 6f 63 6b 65 64 2c  TE + id->locked,
7b80: 20 70 61 67 65 2c 20 31 2c 20 30 29 20 29 7b 0a   page, 1, 0) ){.
7b90: 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 4c 6f          res = Lo
7ba0: 63 6b 46 69 6c 65 28 69 64 2d 3e 68 2c 20 46 49  ckFile(id->h, FI
7bb0: 52 53 54 5f 4c 4f 43 4b 42 59 54 45 2b 31 2c 20  RST_LOCKBYTE+1, 
7bc0: 70 61 67 65 2c 20 4e 5f 4c 4f 43 4b 42 59 54 45  page, N_LOCKBYTE
7bd0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  , 0);.      }els
7be0: 65 7b 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d  e{.        res =
7bf0: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
7c00: 20 20 55 6e 6c 6f 63 6b 46 69 6c 65 28 69 64 2d    UnlockFile(id-
7c10: 3e 68 2c 20 46 49 52 53 54 5f 4c 4f 43 4b 42 59  >h, FIRST_LOCKBY
7c20: 54 45 2c 20 70 61 67 65 2c 20 31 2c 20 30 29 3b  TE, page, 1, 0);
7c30: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
7c40: 65 73 20 29 7b 0a 20 20 20 20 20 20 69 64 2d 3e  es ){.      id->
7c50: 6c 6f 63 6b 65 64 20 3d 20 2d 31 3b 0a 20 20 20  locked = -1;.   
7c60: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
7c70: 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  K;.    }else{.  
7c80: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
7c90: 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  BUSY;.    }.  }.
7ca0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e    return rc;.#en
7cb0: 64 69 66 0a 23 69 66 20 4f 53 5f 4d 41 43 0a 20  dif.#if OS_MAC. 
7cc0: 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 69   int rc;.  if( i
7cd0: 64 2d 3e 6c 6f 63 6b 65 64 3c 30 20 7c 7c 20 69  d->locked<0 || i
7ce0: 64 2d 3e 72 65 66 4e 75 6d 52 46 20 3d 3d 20 2d  d->refNumRF == -
7cf0: 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  1 ){.    rc = SQ
7d00: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
7d10: 7b 0a 20 20 20 20 4f 53 45 72 72 20 72 65 73 3b  {.    OSErr res;
7d20: 0a 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 35  .    int cnt = 5
7d30: 3b 0a 20 20 20 20 50 61 72 61 6d 42 6c 6f 63 6b  ;.    ParamBlock
7d40: 52 65 63 20 70 61 72 61 6d 73 3b 0a 20 20 20 20  Rec params;.    
7d50: 6d 65 6d 73 65 74 28 26 70 61 72 61 6d 73 2c 20  memset(&params, 
7d60: 30 2c 20 73 69 7a 65 6f 66 28 70 61 72 61 6d 73  0, sizeof(params
7d70: 29 29 3b 0a 20 20 20 20 70 61 72 61 6d 73 2e 69  ));.    params.i
7d80: 6f 50 61 72 61 6d 2e 69 6f 52 65 66 4e 75 6d 20  oParam.ioRefNum 
7d90: 3d 20 69 64 2d 3e 72 65 66 4e 75 6d 52 46 3b 0a  = id->refNumRF;.
7da0: 20 20 20 20 70 61 72 61 6d 73 2e 69 6f 50 61 72      params.ioPar
7db0: 61 6d 2e 69 6f 50 6f 73 4d 6f 64 65 20 3d 20 66  am.ioPosMode = f
7dc0: 73 46 72 6f 6d 53 74 61 72 74 3b 0a 20 20 20 20  sFromStart;.    
7dd0: 70 61 72 61 6d 73 2e 69 6f 50 61 72 61 6d 2e 69  params.ioParam.i
7de0: 6f 50 6f 73 4f 66 66 73 65 74 20 3d 20 46 49 52  oPosOffset = FIR
7df0: 53 54 5f 4c 4f 43 4b 42 59 54 45 3b 0a 20 20 20  ST_LOCKBYTE;.   
7e00: 20 70 61 72 61 6d 73 2e 69 6f 50 61 72 61 6d 2e   params.ioParam.
7e10: 69 6f 52 65 71 43 6f 75 6e 74 20 3d 20 31 3b 0a  ioReqCount = 1;.
7e20: 20 20 20 20 77 68 69 6c 65 28 20 63 6e 74 2d 2d      while( cnt--
7e30: 3e 30 20 26 26 20 28 72 65 73 20 3d 20 50 42 4c  >0 && (res = PBL
7e40: 6f 63 6b 52 61 6e 67 65 53 79 6e 63 28 26 70 61  ockRangeSync(&pa
7e50: 72 61 6d 73 29 29 21 3d 6e 6f 45 72 72 20 29 7b  rams))!=noErr ){
7e60: 0a 20 20 20 20 20 20 55 49 6e 74 33 32 20 66 69  .      UInt32 fi
7e70: 6e 61 6c 54 69 63 6b 73 3b 0a 20 20 20 20 20 20  nalTicks;.      
7e80: 44 65 6c 61 79 28 31 2c 20 26 66 69 6e 61 6c 54  Delay(1, &finalT
7e90: 69 63 6b 73 29 3b 20 2f 2a 20 31 2f 36 30 20 73  icks); /* 1/60 s
7ea0: 65 63 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20  ec */.    }.    
7eb0: 69 66 28 20 72 65 73 20 3d 3d 20 6e 6f 45 72 72  if( res == noErr
7ec0: 20 29 7b 0a 20 20 20 20 20 20 70 61 72 61 6d 73   ){.      params
7ed0: 2e 69 6f 50 61 72 61 6d 2e 69 6f 50 6f 73 4f 66  .ioParam.ioPosOf
7ee0: 66 73 65 74 20 3d 20 46 49 52 53 54 5f 4c 4f 43  fset = FIRST_LOC
7ef0: 4b 42 59 54 45 20 2b 20 69 64 2d 3e 6c 6f 63 6b  KBYTE + id->lock
7f00: 65 64 3b 0a 20 20 20 20 20 20 70 61 72 61 6d 73  ed;.      params
7f10: 2e 69 6f 50 61 72 61 6d 2e 69 6f 52 65 71 43 6f  .ioParam.ioReqCo
7f20: 75 6e 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 69  unt = 1;.      i
7f30: 66 28 20 69 64 2d 3e 6c 6f 63 6b 65 64 3d 3d 30  f( id->locked==0
7f40: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c   .            ||
7f50: 20 50 42 55 6e 6c 6f 63 6b 52 61 6e 67 65 53 79   PBUnlockRangeSy
7f60: 6e 63 28 26 70 61 72 61 6d 73 29 3d 3d 6e 6f 45  nc(&params)==noE
7f70: 72 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61  rr ){.        pa
7f80: 72 61 6d 73 2e 69 6f 50 61 72 61 6d 2e 69 6f 50  rams.ioParam.ioP
7f90: 6f 73 4f 66 66 73 65 74 20 3d 20 46 49 52 53 54  osOffset = FIRST
7fa0: 5f 4c 4f 43 4b 42 59 54 45 2b 31 3b 0a 20 20 20  _LOCKBYTE+1;.   
7fb0: 20 20 20 20 20 70 61 72 61 6d 73 2e 69 6f 50 61       params.ioPa
7fc0: 72 61 6d 2e 69 6f 52 65 71 43 6f 75 6e 74 20 3d  ram.ioReqCount =
7fd0: 20 4e 5f 4c 4f 43 4b 42 59 54 45 3b 0a 20 20 20   N_LOCKBYTE;.   
7fe0: 20 20 20 20 20 72 65 73 20 3d 20 50 42 4c 6f 63       res = PBLoc
7ff0: 6b 52 61 6e 67 65 53 79 6e 63 28 26 70 61 72 61  kRangeSync(&para
8000: 6d 73 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ms);.      }else
8010: 7b 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d 20  {.        res = 
8020: 61 66 70 52 61 6e 67 65 4e 6f 74 4c 6f 63 6b 65  afpRangeNotLocke
8030: 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  d;.      }.     
8040: 20 70 61 72 61 6d 73 2e 69 6f 50 61 72 61 6d 2e   params.ioParam.
8050: 69 6f 50 6f 73 4f 66 66 73 65 74 20 3d 20 46 49  ioPosOffset = FI
8060: 52 53 54 5f 4c 4f 43 4b 42 59 54 45 3b 0a 20 20  RST_LOCKBYTE;.  
8070: 20 20 20 20 70 61 72 61 6d 73 2e 69 6f 50 61 72      params.ioPar
8080: 61 6d 2e 69 6f 52 65 71 43 6f 75 6e 74 20 3d 20  am.ioReqCount = 
8090: 31 3b 0a 20 20 20 20 20 20 50 42 55 6e 6c 6f 63  1;.      PBUnloc
80a0: 6b 52 61 6e 67 65 53 79 6e 63 28 26 70 61 72 61  kRangeSync(&para
80b0: 6d 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ms);.    }.    i
80c0: 66 28 20 72 65 73 20 3d 3d 20 6e 6f 45 72 72 20  f( res == noErr 
80d0: 29 7b 0a 20 20 20 20 20 20 69 64 2d 3e 6c 6f 63  ){.      id->loc
80e0: 6b 65 64 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  ked = -1;.      
80f0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
8100: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8110: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
8120: 59 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  Y;.    }.  }.  r
8130: 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66  eturn rc;.#endif
8140: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b  .}../*.** Unlock
8150: 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20   the given file 
8160: 64 65 73 63 72 69 70 74 6f 72 2e 20 20 49 66 20  descriptor.  If 
8170: 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
8180: 74 6f 72 20 77 61 73 0a 2a 2a 20 6e 6f 74 20 70  tor was.** not p
8190: 72 65 76 69 6f 75 73 6c 79 20 6c 6f 63 6b 65 64  reviously locked
81a0: 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  , then this rout
81b0: 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20  ine is a no-op. 
81c0: 20 49 66 20 74 68 69 73 0a 2a 2a 20 6c 69 62 72   If this.** libr
81d0: 61 72 79 20 77 61 73 20 63 6f 6d 70 69 6c 65 64  ary was compiled
81e0: 20 77 69 74 68 20 6c 61 72 67 65 20 66 69 6c 65   with large file
81f0: 20 73 75 70 70 6f 72 74 20 28 4c 46 53 29 20 62   support (LFS) b
8200: 75 74 20 4c 46 53 20 69 73 20 6e 6f 74 0a 2a 2a  ut LFS is not.**
8210: 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 74 68   available on th
8220: 65 20 68 6f 73 74 2c 20 74 68 65 6e 20 61 6e 20  e host, then an 
8230: 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 20 69 73 20  SQLITE_NOLFS is 
8240: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74  returned..*/.int
8250: 20 73 71 6c 69 74 65 4f 73 55 6e 6c 6f 63 6b 28   sqliteOsUnlock(
8260: 4f 73 46 69 6c 65 20 2a 69 64 29 7b 0a 23 69 66  OsFile *id){.#if
8270: 20 4f 53 5f 55 4e 49 58 0a 20 20 69 6e 74 20 72   OS_UNIX.  int r
8280: 63 3b 0a 20 20 69 66 28 20 21 69 64 2d 3e 6c 6f  c;.  if( !id->lo
8290: 63 6b 65 64 20 29 20 72 65 74 75 72 6e 20 53 51  cked ) return SQ
82a0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74  LITE_OK;.  sqlit
82b0: 65 4f 73 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  eOsEnterMutex();
82c0: 0a 20 20 61 73 73 65 72 74 28 20 69 64 2d 3e 70  .  assert( id->p
82d0: 4c 6f 63 6b 2d 3e 63 6e 74 21 3d 30 20 29 3b 0a  Lock->cnt!=0 );.
82e0: 20 20 69 66 28 20 69 64 2d 3e 70 4c 6f 63 6b 2d    if( id->pLock-
82f0: 3e 63 6e 74 3e 31 20 29 7b 0a 20 20 20 20 69 64  >cnt>1 ){.    id
8300: 2d 3e 70 4c 6f 63 6b 2d 3e 63 6e 74 2d 2d 3b 0a  ->pLock->cnt--;.
8310: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
8320: 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OK;.  }else{.   
8330: 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f   struct flock lo
8340: 63 6b 3b 0a 20 20 20 20 69 6e 74 20 73 3b 0a 20  ck;.    int s;. 
8350: 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d     lock.l_type =
8360: 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 6c 6f   F_UNLCK;.    lo
8370: 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45  ck.l_whence = SE
8380: 45 4b 5f 53 45 54 3b 0a 20 20 20 20 6c 6f 63 6b  EK_SET;.    lock
8390: 2e 6c 5f 73 74 61 72 74 20 3d 20 6c 6f 63 6b 2e  .l_start = lock.
83a0: 6c 5f 6c 65 6e 20 3d 20 30 4c 3b 0a 20 20 20 20  l_len = 0L;.    
83b0: 73 20 3d 20 66 63 6e 74 6c 28 69 64 2d 3e 66 64  s = fcntl(id->fd
83c0: 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b  , F_SETLK, &lock
83d0: 29 3b 0a 20 20 20 20 69 66 28 20 73 21 3d 30 20  );.    if( s!=0 
83e0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 28 73  ){.      rc = (s
83f0: 3d 3d 45 49 4e 56 41 4c 29 20 3f 20 53 51 4c 49  ==EINVAL) ? SQLI
8400: 54 45 5f 4e 4f 4c 46 53 20 3a 20 53 51 4c 49 54  TE_NOLFS : SQLIT
8410: 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 65 6c 73  E_BUSY;.    }els
8420: 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  e{.      rc = SQ
8430: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69  LITE_OK;.      i
8440: 64 2d 3e 70 4c 6f 63 6b 2d 3e 63 6e 74 20 3d 20  d->pLock->cnt = 
8450: 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  0;.    }.  }.  s
8460: 71 6c 69 74 65 4f 73 4c 65 61 76 65 4d 75 74 65  qliteOsLeaveMute
8470: 78 28 29 3b 0a 20 20 69 64 2d 3e 6c 6f 63 6b 65  x();.  id->locke
8480: 64 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  d = 0;.  return 
8490: 72 63 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f  rc;.#endif.#if O
84a0: 53 5f 57 49 4e 0a 20 20 69 6e 74 20 72 63 3b 0a  S_WIN.  int rc;.
84b0: 20 20 69 6e 74 20 70 61 67 65 20 3d 20 69 73 4e    int page = isN
84c0: 54 28 29 20 3f 20 30 78 66 66 66 66 66 66 66 66  T() ? 0xffffffff
84d0: 20 3a 20 30 3b 0a 20 20 69 66 28 20 69 64 2d 3e   : 0;.  if( id->
84e0: 6c 6f 63 6b 65 64 3d 3d 30 20 29 7b 0a 20 20 20  locked==0 ){.   
84f0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
8500: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69 64 2d  .  }else if( id-
8510: 3e 6c 6f 63 6b 65 64 3c 30 20 29 7b 0a 20 20 20  >locked<0 ){.   
8520: 20 55 6e 6c 6f 63 6b 46 69 6c 65 28 69 64 2d 3e   UnlockFile(id->
8530: 68 2c 20 46 49 52 53 54 5f 4c 4f 43 4b 42 59 54  h, FIRST_LOCKBYT
8540: 45 2b 31 2c 20 70 61 67 65 2c 20 4e 5f 4c 4f 43  E+1, page, N_LOC
8550: 4b 42 59 54 45 2c 20 30 29 3b 0a 20 20 20 20 72  KBYTE, 0);.    r
8560: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
8570: 20 20 20 69 64 2d 3e 6c 6f 63 6b 65 64 20 3d 20     id->locked = 
8580: 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
8590: 55 6e 6c 6f 63 6b 46 69 6c 65 28 69 64 2d 3e 68  UnlockFile(id->h
85a0: 2c 20 46 49 52 53 54 5f 4c 4f 43 4b 42 59 54 45  , FIRST_LOCKBYTE
85b0: 2b 69 64 2d 3e 6c 6f 63 6b 65 64 2c 20 70 61 67  +id->locked, pag
85c0: 65 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 72 63  e, 1, 0);.    rc
85d0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
85e0: 20 20 69 64 2d 3e 6c 6f 63 6b 65 64 20 3d 20 30    id->locked = 0
85f0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
8600: 63 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f 53  c;.#endif.#if OS
8610: 5f 4d 41 43 0a 20 20 69 6e 74 20 72 63 3b 0a 20  _MAC.  int rc;. 
8620: 20 50 61 72 61 6d 42 6c 6f 63 6b 52 65 63 20 70   ParamBlockRec p
8630: 61 72 61 6d 73 3b 0a 20 20 6d 65 6d 73 65 74 28  arams;.  memset(
8640: 26 70 61 72 61 6d 73 2c 20 30 2c 20 73 69 7a 65  &params, 0, size
8650: 6f 66 28 70 61 72 61 6d 73 29 29 3b 0a 20 20 70  of(params));.  p
8660: 61 72 61 6d 73 2e 69 6f 50 61 72 61 6d 2e 69 6f  arams.ioParam.io
8670: 52 65 66 4e 75 6d 20 3d 20 69 64 2d 3e 72 65 66  RefNum = id->ref
8680: 4e 75 6d 52 46 3b 0a 20 20 70 61 72 61 6d 73 2e  NumRF;.  params.
8690: 69 6f 50 61 72 61 6d 2e 69 6f 50 6f 73 4d 6f 64  ioParam.ioPosMod
86a0: 65 20 3d 20 66 73 46 72 6f 6d 53 74 61 72 74 3b  e = fsFromStart;
86b0: 0a 20 20 69 66 28 20 69 64 2d 3e 6c 6f 63 6b 65  .  if( id->locke
86c0: 64 3d 3d 30 20 7c 7c 20 69 64 2d 3e 72 65 66 4e  d==0 || id->refN
86d0: 75 6d 52 46 20 3d 3d 20 2d 31 20 29 7b 0a 20 20  umRF == -1 ){.  
86e0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
86f0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69 64  ;.  }else if( id
8700: 2d 3e 6c 6f 63 6b 65 64 3c 30 20 29 7b 0a 20 20  ->locked<0 ){.  
8710: 20 20 70 61 72 61 6d 73 2e 69 6f 50 61 72 61 6d    params.ioParam
8720: 2e 69 6f 50 6f 73 4f 66 66 73 65 74 20 3d 20 46  .ioPosOffset = F
8730: 49 52 53 54 5f 4c 4f 43 4b 42 59 54 45 2b 31 3b  IRST_LOCKBYTE+1;
8740: 0a 20 20 20 20 70 61 72 61 6d 73 2e 69 6f 50 61  .    params.ioPa
8750: 72 61 6d 2e 69 6f 52 65 71 43 6f 75 6e 74 20 3d  ram.ioReqCount =
8760: 20 4e 5f 4c 4f 43 4b 42 59 54 45 3b 0a 20 20 20   N_LOCKBYTE;.   
8770: 20 50 42 55 6e 6c 6f 63 6b 52 61 6e 67 65 53 79   PBUnlockRangeSy
8780: 6e 63 28 26 70 61 72 61 6d 73 29 3b 0a 20 20 20  nc(&params);.   
8790: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
87a0: 0a 20 20 20 20 69 64 2d 3e 6c 6f 63 6b 65 64 20  .    id->locked 
87b0: 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
87c0: 20 20 70 61 72 61 6d 73 2e 69 6f 50 61 72 61 6d    params.ioParam
87d0: 2e 69 6f 50 6f 73 4f 66 66 73 65 74 20 3d 20 46  .ioPosOffset = F
87e0: 49 52 53 54 5f 4c 4f 43 4b 42 59 54 45 2b 69 64  IRST_LOCKBYTE+id
87f0: 2d 3e 6c 6f 63 6b 65 64 3b 0a 20 20 20 20 70 61  ->locked;.    pa
8800: 72 61 6d 73 2e 69 6f 50 61 72 61 6d 2e 69 6f 52  rams.ioParam.ioR
8810: 65 71 43 6f 75 6e 74 20 3d 20 31 3b 0a 20 20 20  eqCount = 1;.   
8820: 20 50 42 55 6e 6c 6f 63 6b 52 61 6e 67 65 53 79   PBUnlockRangeSy
8830: 6e 63 28 26 70 61 72 61 6d 73 29 3b 0a 20 20 20  nc(&params);.   
8840: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
8850: 0a 20 20 20 20 69 64 2d 3e 6c 6f 63 6b 65 64 20  .    id->locked 
8860: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
8870: 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  n rc;.#endif.}..
8880: 2f 2a 0a 2a 2a 20 47 65 74 20 69 6e 66 6f 72 6d  /*.** Get inform
8890: 61 74 69 6f 6e 20 74 6f 20 73 65 65 64 20 74 68  ation to seed th
88a0: 65 20 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20  e random number 
88b0: 67 65 6e 65 72 61 74 6f 72 2e 20 20 54 68 65 20  generator.  The 
88c0: 73 65 65 64 0a 2a 2a 20 69 73 20 77 72 69 74 74  seed.** is writt
88d0: 65 6e 20 69 6e 74 6f 20 74 68 65 20 62 75 66 66  en into the buff
88e0: 65 72 20 7a 42 75 66 5b 32 35 36 5d 2e 20 20 54  er zBuf[256].  T
88f0: 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74  he calling funct
8900: 69 6f 6e 20 6d 75 73 74 0a 2a 2a 20 73 75 70 70  ion must.** supp
8910: 6c 79 20 61 20 73 75 66 66 69 63 69 65 6e 74 6c  ly a sufficientl
8920: 79 20 6c 61 72 67 65 20 62 75 66 66 65 72 2e 0a  y large buffer..
8930: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 4f 73 52  */.int sqliteOsR
8940: 61 6e 64 6f 6d 53 65 65 64 28 63 68 61 72 20 2a  andomSeed(char *
8950: 7a 42 75 66 29 7b 0a 23 69 66 64 65 66 20 53 51  zBuf){.#ifdef SQ
8960: 4c 49 54 45 5f 54 45 53 54 0a 20 20 2f 2a 20 57  LITE_TEST.  /* W
8970: 68 65 6e 20 74 65 73 74 69 6e 67 2c 20 61 6c 77  hen testing, alw
8980: 61 79 73 20 75 73 65 20 74 68 65 20 73 61 6d 65  ays use the same
8990: 20 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 73   random number s
89a0: 65 71 75 65 6e 63 65 2e 0a 20 20 2a 2a 20 54 68  equence..  ** Th
89b0: 69 73 20 6d 61 6b 65 73 20 74 68 65 20 74 65 73  is makes the tes
89c0: 74 73 20 72 65 70 65 61 74 61 62 6c 65 2e 0a 20  ts repeatable.. 
89d0: 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 7a 42 75   */.  memset(zBu
89e0: 66 2c 20 30 2c 20 32 35 36 29 3b 0a 23 65 6e 64  f, 0, 256);.#end
89f0: 69 66 0a 23 69 66 20 4f 53 5f 55 4e 49 58 20 26  if.#if OS_UNIX &
8a00: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
8a10: 45 5f 54 45 53 54 29 0a 20 20 69 6e 74 20 70 69  E_TEST).  int pi
8a20: 64 3b 0a 20 20 74 69 6d 65 28 28 74 69 6d 65 5f  d;.  time((time_
8a30: 74 2a 29 7a 42 75 66 29 3b 0a 20 20 70 69 64 20  t*)zBuf);.  pid 
8a40: 3d 20 67 65 74 70 69 64 28 29 3b 0a 20 20 6d 65  = getpid();.  me
8a50: 6d 63 70 79 28 26 7a 42 75 66 5b 73 69 7a 65 6f  mcpy(&zBuf[sizeo
8a60: 66 28 74 69 6d 65 5f 74 29 5d 2c 20 26 70 69 64  f(time_t)], &pid
8a70: 2c 20 73 69 7a 65 6f 66 28 70 69 64 29 29 3b 0a  , sizeof(pid));.
8a80: 23 65 6e 64 69 66 0a 23 69 66 20 4f 53 5f 57 49  #endif.#if OS_WI
8a90: 4e 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  N && !defined(SQ
8aa0: 4c 49 54 45 5f 54 45 53 54 29 0a 20 20 47 65 74  LITE_TEST).  Get
8ab0: 53 79 73 74 65 6d 54 69 6d 65 28 28 4c 50 53 59  SystemTime((LPSY
8ac0: 53 54 45 4d 54 49 4d 45 29 7a 42 75 66 29 3b 0a  STEMTIME)zBuf);.
8ad0: 23 65 6e 64 69 66 0a 23 69 66 20 4f 53 5f 4d 41  #endif.#if OS_MA
8ae0: 43 0a 20 20 69 6e 74 20 70 69 64 3b 0a 20 20 4d  C.  int pid;.  M
8af0: 69 63 72 6f 73 65 63 6f 6e 64 73 28 28 55 6e 73  icroseconds((Uns
8b00: 69 67 6e 65 64 57 69 64 65 2a 29 7a 42 75 66 29  ignedWide*)zBuf)
8b10: 3b 0a 20 20 70 69 64 20 3d 20 67 65 74 70 69 64  ;.  pid = getpid
8b20: 28 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 7a 42  ();.  memcpy(&zB
8b30: 75 66 5b 73 69 7a 65 6f 66 28 55 6e 73 69 67 6e  uf[sizeof(Unsign
8b40: 65 64 57 69 64 65 29 5d 2c 20 26 70 69 64 2c 20  edWide)], &pid, 
8b50: 73 69 7a 65 6f 66 28 70 69 64 29 29 3b 0a 23 65  sizeof(pid));.#e
8b60: 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51  ndif.  return SQ
8b70: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
8b80: 2a 20 53 6c 65 65 70 20 66 6f 72 20 61 20 6c 69  * Sleep for a li
8b90: 74 74 6c 65 20 77 68 69 6c 65 2e 20 20 52 65 74  ttle while.  Ret
8ba0: 75 72 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f  urn the amount o
8bb0: 66 20 74 69 6d 65 20 73 6c 65 70 74 2e 0a 2a 2f  f time slept..*/
8bc0: 0a 69 6e 74 20 73 71 6c 69 74 65 4f 73 53 6c 65  .int sqliteOsSle
8bd0: 65 70 28 69 6e 74 20 6d 73 29 7b 0a 23 69 66 20  ep(int ms){.#if 
8be0: 4f 53 5f 55 4e 49 58 0a 23 69 66 20 64 65 66 69  OS_UNIX.#if defi
8bf0: 6e 65 64 28 48 41 56 45 5f 55 53 4c 45 45 50 29  ned(HAVE_USLEEP)
8c00: 20 26 26 20 48 41 56 45 5f 55 53 4c 45 45 50 0a   && HAVE_USLEEP.
8c10: 20 20 75 73 6c 65 65 70 28 6d 73 2a 31 30 30 30    usleep(ms*1000
8c20: 29 3b 0a 20 20 72 65 74 75 72 6e 20 6d 73 3b 0a  );.  return ms;.
8c30: 23 65 6c 73 65 0a 20 20 73 6c 65 65 70 28 28 6d  #else.  sleep((m
8c40: 73 2b 39 39 39 29 2f 31 30 30 30 29 3b 0a 20 20  s+999)/1000);.  
8c50: 72 65 74 75 72 6e 20 31 30 30 30 2a 28 28 6d 73  return 1000*((ms
8c60: 2b 39 39 39 29 2f 31 30 30 30 29 3b 0a 23 65 6e  +999)/1000);.#en
8c70: 64 69 66 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f  dif.#endif.#if O
8c80: 53 5f 57 49 4e 0a 20 20 53 6c 65 65 70 28 6d 73  S_WIN.  Sleep(ms
8c90: 29 3b 0a 20 20 72 65 74 75 72 6e 20 6d 73 3b 0a  );.  return ms;.
8ca0: 23 65 6e 64 69 66 0a 23 69 66 20 4f 53 5f 4d 41  #endif.#if OS_MA
8cb0: 43 0a 20 20 55 49 6e 74 33 32 20 66 69 6e 61 6c  C.  UInt32 final
8cc0: 54 69 63 6b 73 3b 0a 20 20 55 49 6e 74 33 32 20  Ticks;.  UInt32 
8cd0: 74 69 63 6b 73 20 3d 20 28 28 28 55 49 6e 74 33  ticks = (((UInt3
8ce0: 32 29 6d 73 2b 31 36 29 2a 33 29 2f 35 30 3b 20  2)ms+16)*3)/50; 
8cf0: 20 2f 2a 20 31 2f 36 30 20 73 65 63 20 70 65 72   /* 1/60 sec per
8d00: 20 74 69 63 6b 20 2a 2f 0a 20 20 44 65 6c 61 79   tick */.  Delay
8d10: 28 74 69 63 6b 73 2c 20 26 66 69 6e 61 6c 54 69  (ticks, &finalTi
8d20: 63 6b 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  cks);.  return (
8d30: 69 6e 74 29 28 28 74 69 63 6b 73 2a 35 30 29 2f  int)((ticks*50)/
8d40: 33 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a  3);.#endif.}../*
8d50: 0a 2a 2a 20 4d 61 63 72 6f 73 20 75 73 65 64 20  .** Macros used 
8d60: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65  to determine whe
8d70: 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 6f 20 75  ther or not to u
8d80: 73 65 20 74 68 72 65 61 64 73 2e 20 20 54 68 65  se threads.  The
8d90: 0a 2a 2a 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f  .** SQLITE_UNIX_
8da0: 54 48 52 45 41 44 53 20 6d 61 63 72 6f 20 69 73  THREADS macro is
8db0: 20 64 65 66 69 6e 65 64 20 69 66 20 77 65 20 61   defined if we a
8dc0: 72 65 20 73 79 6e 63 68 72 6f 6e 69 7a 69 6e 67  re synchronizing
8dd0: 20 66 6f 72 0a 2a 2a 20 50 6f 73 69 78 20 74 68   for.** Posix th
8de0: 72 65 61 64 73 20 61 6e 64 20 53 51 4c 49 54 45  reads and SQLITE
8df0: 5f 57 33 32 5f 54 48 52 45 41 44 53 20 69 73 20  _W32_THREADS is 
8e00: 64 65 66 69 6e 65 64 20 69 66 20 77 65 20 61 72  defined if we ar
8e10: 65 0a 2a 2a 20 73 79 6e 63 68 72 6f 6e 69 7a 69  e.** synchronizi
8e20: 6e 67 20 75 73 69 6e 67 20 57 69 6e 33 32 20 74  ng using Win32 t
8e30: 68 72 65 61 64 73 2e 0a 2a 2f 0a 23 69 66 20 4f  hreads..*/.#if O
8e40: 53 5f 55 4e 49 58 20 26 26 20 64 65 66 69 6e 65  S_UNIX && define
8e50: 64 28 54 48 52 45 41 44 53 41 46 45 29 20 26 26  d(THREADSAFE) &&
8e60: 20 54 48 52 45 41 44 53 41 46 45 0a 23 20 69 6e   THREADSAFE.# in
8e70: 63 6c 75 64 65 20 3c 70 74 68 72 65 61 64 2e 68  clude <pthread.h
8e80: 3e 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54  >.# define SQLIT
8e90: 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 20 31  E_UNIX_THREADS 1
8ea0: 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f 53 5f 57  .#endif.#if OS_W
8eb0: 49 4e 20 26 26 20 64 65 66 69 6e 65 64 28 54 48  IN && defined(TH
8ec0: 52 45 41 44 53 41 46 45 29 20 26 26 20 54 48 52  READSAFE) && THR
8ed0: 45 41 44 53 41 46 45 0a 23 20 64 65 66 69 6e 65  EADSAFE.# define
8ee0: 20 53 51 4c 49 54 45 5f 57 33 32 5f 54 48 52 45   SQLITE_W32_THRE
8ef0: 41 44 53 20 31 0a 23 65 6e 64 69 66 0a 23 69 66  ADS 1.#endif.#if
8f00: 20 4f 53 5f 4d 41 43 20 26 26 20 64 65 66 69 6e   OS_MAC && defin
8f10: 65 64 28 54 48 52 45 41 44 53 41 46 45 29 20 26  ed(THREADSAFE) &
8f20: 26 20 54 48 52 45 41 44 53 41 46 45 0a 23 20 69  & THREADSAFE.# i
8f30: 6e 63 6c 75 64 65 20 3c 4d 75 6c 74 69 70 72 6f  nclude <Multipro
8f40: 63 65 73 73 69 6e 67 2e 68 3e 0a 23 20 64 65 66  cessing.h>.# def
8f50: 69 6e 65 20 53 51 4c 49 54 45 5f 4d 41 43 4f 53  ine SQLITE_MACOS
8f60: 5f 4d 55 4c 54 49 54 41 53 4b 49 4e 47 20 31 0a  _MULTITASKING 1.
8f70: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 74  #endif../*.** St
8f80: 61 74 69 63 20 76 61 72 69 61 62 6c 65 73 20 75  atic variables u
8f90: 73 65 64 20 66 6f 72 20 74 68 72 65 61 64 20 73  sed for thread s
8fa0: 79 6e 63 68 72 6f 6e 69 7a 61 74 69 6f 6e 0a 2a  ynchronization.*
8fb0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e 4d  /.static int inM
8fc0: 75 74 65 78 20 3d 20 30 3b 0a 23 69 66 64 65 66  utex = 0;.#ifdef
8fd0: 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f 54 48 52   SQLITE_UNIX_THR
8fe0: 45 41 44 53 0a 20 20 73 74 61 74 69 63 20 70 74  EADS.  static pt
8ff0: 68 72 65 61 64 5f 6d 75 74 65 78 5f 74 20 6d 75  hread_mutex_t mu
9000: 74 65 78 20 3d 20 50 54 48 52 45 41 44 5f 4d 55  tex = PTHREAD_MU
9010: 54 45 58 5f 49 4e 49 54 49 41 4c 49 5a 45 52 3b  TEX_INITIALIZER;
9020: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
9030: 51 4c 49 54 45 5f 57 33 32 5f 54 48 52 45 41 44  QLITE_W32_THREAD
9040: 53 0a 20 20 73 74 61 74 69 63 20 43 52 49 54 49  S.  static CRITI
9050: 43 41 4c 5f 53 45 43 54 49 4f 4e 20 63 73 3b 0a  CAL_SECTION cs;.
9060: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51  #endif.#ifdef SQ
9070: 4c 49 54 45 5f 4d 41 43 4f 53 5f 4d 55 4c 54 49  LITE_MACOS_MULTI
9080: 54 41 53 4b 49 4e 47 0a 20 20 73 74 61 74 69 63  TASKING.  static
9090: 20 4d 50 43 72 69 74 69 63 61 6c 52 65 67 69 6f   MPCriticalRegio
90a0: 6e 49 44 20 63 72 69 74 69 63 61 6c 52 65 67 69  nID criticalRegi
90b0: 6f 6e 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  on;.#endif../*.*
90c0: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
90d0: 70 61 69 72 20 6f 66 20 72 6f 75 74 69 6e 65 20  pair of routine 
90e0: 69 6d 70 6c 65 6d 65 6e 74 20 6d 75 74 75 61 6c  implement mutual
90f0: 20 65 78 63 6c 75 73 69 6f 6e 20 66 6f 72 0a 2a   exclusion for.*
9100: 2a 20 6d 75 6c 74 69 2d 74 68 72 65 61 64 65 64  * multi-threaded
9110: 20 70 72 6f 63 65 73 73 65 73 2e 20 20 4f 6e 6c   processes.  Onl
9120: 79 20 61 20 73 69 6e 67 6c 65 20 74 68 72 65 61  y a single threa
9130: 64 20 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f 0a  d is allowed to.
9140: 2a 2a 20 65 78 65 63 75 74 65 64 20 63 6f 64 65  ** executed code
9150: 20 74 68 61 74 20 69 73 20 73 75 72 72 6f 75 6e   that is surroun
9160: 64 65 64 20 62 79 20 45 6e 74 65 72 4d 75 74 65  ded by EnterMute
9170: 78 28 29 20 61 6e 64 20 4c 65 61 76 65 4d 75 74  x() and LeaveMut
9180: 65 78 28 29 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69  ex()..**.** SQLi
9190: 74 65 20 75 73 65 73 20 6f 6e 6c 79 20 61 20 73  te uses only a s
91a0: 69 6e 67 6c 65 20 4d 75 74 65 78 2e 20 20 54 68  ingle Mutex.  Th
91b0: 65 72 65 20 69 73 20 6e 6f 74 20 6d 75 63 68 20  ere is not much 
91c0: 63 72 69 74 69 63 61 6c 0a 2a 2a 20 63 6f 64 65  critical.** code
91d0: 20 61 6e 64 20 77 68 61 74 20 6c 69 74 74 6c 65   and what little
91e0: 20 74 68 65 72 65 20 69 73 20 65 78 65 63 75 74   there is execut
91f0: 65 73 20 71 75 69 63 6b 6c 79 20 61 6e 64 20 77  es quickly and w
9200: 69 74 68 6f 75 74 20 62 6c 6f 63 6b 69 6e 67 2e  ithout blocking.
9210: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 4f  .*/.void sqliteO
9220: 73 45 6e 74 65 72 4d 75 74 65 78 28 29 7b 0a 23  sEnterMutex(){.#
9230: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 55 4e 49  ifdef SQLITE_UNI
9240: 58 5f 54 48 52 45 41 44 53 0a 20 20 70 74 68 72  X_THREADS.  pthr
9250: 65 61 64 5f 6d 75 74 65 78 5f 6c 6f 63 6b 28 26  ead_mutex_lock(&
9260: 6d 75 74 65 78 29 3b 0a 23 65 6e 64 69 66 0a 23  mutex);.#endif.#
9270: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 57 33 32  ifdef SQLITE_W32
9280: 5f 54 48 52 45 41 44 53 0a 20 20 73 74 61 74 69  _THREADS.  stati
9290: 63 20 69 6e 74 20 69 73 49 6e 69 74 20 3d 20 30  c int isInit = 0
92a0: 3b 0a 20 20 77 68 69 6c 65 28 20 21 69 73 49 6e  ;.  while( !isIn
92b0: 69 74 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63  it ){.    static
92c0: 20 6c 6f 6e 67 20 6c 6f 63 6b 20 3d 20 30 3b 0a   long lock = 0;.
92d0: 20 20 20 20 69 66 28 20 49 6e 74 65 72 6c 6f 63      if( Interloc
92e0: 6b 65 64 49 6e 63 72 65 6d 65 6e 74 28 26 6c 6f  kedIncrement(&lo
92f0: 63 6b 29 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  ck)==1 ){.      
9300: 49 6e 69 74 69 61 6c 69 7a 65 43 72 69 74 69 63  InitializeCritic
9310: 61 6c 53 65 63 74 69 6f 6e 28 26 63 73 29 3b 0a  alSection(&cs);.
9320: 20 20 20 20 20 20 69 73 49 6e 69 74 20 3d 20 31        isInit = 1
9330: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
9340: 20 20 20 53 6c 65 65 70 28 31 29 3b 0a 20 20 20     Sleep(1);.   
9350: 20 7d 0a 20 20 7d 0a 20 20 45 6e 74 65 72 43 72   }.  }.  EnterCr
9360: 69 74 69 63 61 6c 53 65 63 74 69 6f 6e 28 26 63  iticalSection(&c
9370: 73 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  s);.#endif.#ifde
9380: 66 20 53 51 4c 49 54 45 5f 4d 41 43 4f 53 5f 4d  f SQLITE_MACOS_M
9390: 55 4c 54 49 54 41 53 4b 49 4e 47 0a 20 20 73 74  ULTITASKING.  st
93a0: 61 74 69 63 20 76 6f 6c 61 74 69 6c 65 20 69 6e  atic volatile in
93b0: 74 20 6e 6f 74 49 6e 69 74 20 3d 20 31 3b 0a 20  t notInit = 1;. 
93c0: 20 69 66 28 20 6e 6f 74 49 6e 69 74 20 29 7b 0a   if( notInit ){.
93d0: 20 20 20 20 69 66 28 20 6e 6f 74 49 6e 69 74 20      if( notInit 
93e0: 3d 3d 20 32 20 29 20 2f 2a 20 61 73 20 63 6c 6f  == 2 ) /* as clo
93f0: 73 65 20 61 73 20 79 6f 75 20 63 61 6e 20 67 65  se as you can ge
9400: 74 20 74 6f 20 74 68 72 65 61 64 20 73 61 66 65  t to thread safe
9410: 20 69 6e 69 74 20 2a 2f 0a 20 20 20 20 20 20 4d   init */.      M
9420: 50 59 69 65 6c 64 28 29 3b 0a 20 20 20 20 65 6c  PYield();.    el
9430: 73 65 7b 0a 20 20 20 20 20 20 6e 6f 74 49 6e 69  se{.      notIni
9440: 74 20 3d 20 32 3b 0a 20 20 20 20 20 20 4d 50 43  t = 2;.      MPC
9450: 72 65 61 74 65 43 72 69 74 69 63 61 6c 52 65 67  reateCriticalReg
9460: 69 6f 6e 28 26 63 72 69 74 69 63 61 6c 52 65 67  ion(&criticalReg
9470: 69 6f 6e 29 3b 0a 20 20 20 20 20 20 6e 6f 74 49  ion);.      notI
9480: 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  nit = 0;.    }. 
9490: 20 7d 0a 20 20 4d 50 45 6e 74 65 72 43 72 69 74   }.  MPEnterCrit
94a0: 69 63 61 6c 52 65 67 69 6f 6e 28 63 72 69 74 69  icalRegion(criti
94b0: 63 61 6c 52 65 67 69 6f 6e 2c 20 6b 44 75 72 61  calRegion, kDura
94c0: 74 69 6f 6e 46 6f 72 65 76 65 72 29 3b 0a 23 65  tionForever);.#e
94d0: 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 21  ndif.  assert( !
94e0: 69 6e 4d 75 74 65 78 20 29 3b 0a 20 20 69 6e 4d  inMutex );.  inM
94f0: 75 74 65 78 20 3d 20 31 3b 0a 7d 0a 76 6f 69 64  utex = 1;.}.void
9500: 20 73 71 6c 69 74 65 4f 73 4c 65 61 76 65 4d 75   sqliteOsLeaveMu
9510: 74 65 78 28 29 7b 0a 20 20 61 73 73 65 72 74 28  tex(){.  assert(
9520: 20 69 6e 4d 75 74 65 78 20 29 3b 0a 20 20 69 6e   inMutex );.  in
9530: 4d 75 74 65 78 20 3d 20 30 3b 0a 23 69 66 64 65  Mutex = 0;.#ifde
9540: 66 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f 54 48  f SQLITE_UNIX_TH
9550: 52 45 41 44 53 0a 20 20 70 74 68 72 65 61 64 5f  READS.  pthread_
9560: 6d 75 74 65 78 5f 75 6e 6c 6f 63 6b 28 26 6d 75  mutex_unlock(&mu
9570: 74 65 78 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  tex);.#endif.#if
9580: 64 65 66 20 53 51 4c 49 54 45 5f 57 33 32 5f 54  def SQLITE_W32_T
9590: 48 52 45 41 44 53 0a 20 20 4c 65 61 76 65 43 72  HREADS.  LeaveCr
95a0: 69 74 69 63 61 6c 53 65 63 74 69 6f 6e 28 26 63  iticalSection(&c
95b0: 73 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  s);.#endif.#ifde
95c0: 66 20 53 51 4c 49 54 45 5f 4d 41 43 4f 53 5f 4d  f SQLITE_MACOS_M
95d0: 55 4c 54 49 54 41 53 4b 49 4e 47 0a 20 20 4d 50  ULTITASKING.  MP
95e0: 45 78 69 74 43 72 69 74 69 63 61 6c 52 65 67 69  ExitCriticalRegi
95f0: 6f 6e 28 63 72 69 74 69 63 61 6c 52 65 67 69 6f  on(criticalRegio
9600: 6e 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a  n);.#endif.}../*
9610: 0a 2a 2a 20 54 75 72 6e 20 61 20 72 65 6c 61 74  .** Turn a relat
9620: 69 76 65 20 70 61 74 68 6e 61 6d 65 20 69 6e 74  ive pathname int
9630: 6f 20 61 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d  o a full pathnam
9640: 65 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69  e.  Return a poi
9650: 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 66  nter.** to the f
9660: 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 73 74 6f  ull pathname sto
9670: 72 65 64 20 69 6e 20 73 70 61 63 65 20 6f 62 74  red in space obt
9680: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
9690: 65 4d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 54 68  eMalloc()..** Th
96a0: 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
96b0: 6f 6e 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  on is responsibl
96c0: 65 20 66 6f 72 20 66 72 65 65 69 6e 67 20 74 68  e for freeing th
96d0: 69 73 20 73 70 61 63 65 20 6f 6e 63 65 20 69 74  is space once it
96e0: 0a 2a 2a 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72  .** is no longer
96f0: 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 63 68 61 72   needed..*/.char
9700: 20 2a 73 71 6c 69 74 65 4f 73 46 75 6c 6c 50 61   *sqliteOsFullPa
9710: 74 68 6e 61 6d 65 28 63 6f 6e 73 74 20 63 68 61  thname(const cha
9720: 72 20 2a 7a 52 65 6c 61 74 69 76 65 29 7b 0a 23  r *zRelative){.#
9730: 69 66 20 4f 53 5f 55 4e 49 58 0a 20 20 63 68 61  if OS_UNIX.  cha
9740: 72 20 2a 7a 46 75 6c 6c 20 3d 20 30 3b 0a 20 20  r *zFull = 0;.  
9750: 69 66 28 20 7a 52 65 6c 61 74 69 76 65 5b 30 5d  if( zRelative[0]
9760: 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 73 71 6c  =='/' ){.    sql
9770: 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 7a 46  iteSetString(&zF
9780: 75 6c 6c 2c 20 7a 52 65 6c 61 74 69 76 65 2c 20  ull, zRelative, 
9790: 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  0);.  }else{.   
97a0: 20 63 68 61 72 20 7a 42 75 66 5b 35 30 30 30 5d   char zBuf[5000]
97b0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 53 65 74 53  ;.    sqliteSetS
97c0: 74 72 69 6e 67 28 26 7a 46 75 6c 6c 2c 20 67 65  tring(&zFull, ge
97d0: 74 63 77 64 28 7a 42 75 66 2c 20 73 69 7a 65 6f  tcwd(zBuf, sizeo
97e0: 66 28 7a 42 75 66 29 29 2c 20 22 2f 22 2c 20 7a  f(zBuf)), "/", z
97f0: 52 65 6c 61 74 69 76 65 2c 20 30 29 3b 0a 20 20  Relative, 0);.  
9800: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 46 75 6c 6c  }.  return zFull
9810: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f 53 5f  ;.#endif.#if OS_
9820: 57 49 4e 0a 20 20 63 68 61 72 20 2a 7a 4e 6f 74  WIN.  char *zNot
9830: 55 73 65 64 3b 0a 20 20 63 68 61 72 20 2a 7a 46  Used;.  char *zF
9840: 75 6c 6c 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65  ull;.  int nByte
9850: 3b 0a 20 20 6e 42 79 74 65 20 3d 20 47 65 74 46  ;.  nByte = GetF
9860: 75 6c 6c 50 61 74 68 4e 61 6d 65 28 7a 52 65 6c  ullPathName(zRel
9870: 61 74 69 76 65 2c 20 30 2c 20 30 2c 20 26 7a 4e  ative, 0, 0, &zN
9880: 6f 74 55 73 65 64 29 20 2b 20 31 3b 0a 20 20 7a  otUsed) + 1;.  z
9890: 46 75 6c 6c 20 3d 20 73 71 6c 69 74 65 4d 61 6c  Full = sqliteMal
98a0: 6c 6f 63 28 20 6e 42 79 74 65 20 29 3b 0a 20 20  loc( nByte );.  
98b0: 69 66 28 20 7a 46 75 6c 6c 3d 3d 30 20 29 20 72  if( zFull==0 ) r
98c0: 65 74 75 72 6e 20 30 3b 0a 20 20 47 65 74 46 75  eturn 0;.  GetFu
98d0: 6c 6c 50 61 74 68 4e 61 6d 65 28 7a 52 65 6c 61  llPathName(zRela
98e0: 74 69 76 65 2c 20 6e 42 79 74 65 2c 20 7a 46 75  tive, nByte, zFu
98f0: 6c 6c 2c 20 26 7a 4e 6f 74 55 73 65 64 29 3b 0a  ll, &zNotUsed);.
9900: 20 20 72 65 74 75 72 6e 20 7a 46 75 6c 6c 3b 0a    return zFull;.
9910: 23 65 6e 64 69 66 0a 23 69 66 20 4f 53 5f 4d 41  #endif.#if OS_MA
9920: 43 0a 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 20  C.  char *zFull 
9930: 3d 20 30 3b 0a 20 20 69 66 28 20 7a 52 65 6c 61  = 0;.  if( zRela
9940: 74 69 76 65 5b 30 5d 3d 3d 27 3a 27 20 29 7b 0a  tive[0]==':' ){.
9950: 20 20 20 20 63 68 61 72 20 7a 42 75 66 5b 5f 4d      char zBuf[_M
9960: 41 58 5f 50 41 54 48 2b 31 5d 3b 0a 20 20 20 20  AX_PATH+1];.    
9970: 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28  sqliteSetString(
9980: 26 7a 46 75 6c 6c 2c 20 67 65 74 63 77 64 28 7a  &zFull, getcwd(z
9990: 42 75 66 2c 20 73 69 7a 65 6f 66 28 7a 42 75 66  Buf, sizeof(zBuf
99a0: 29 29 2c 20 26 28 7a 52 65 6c 61 74 69 76 65 5b  )), &(zRelative[
99b0: 31 5d 29 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65  1]), 0);.  }else
99c0: 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 68 72  {.    if( strchr
99d0: 28 7a 52 65 6c 61 74 69 76 65 2c 20 27 3a 27 29  (zRelative, ':')
99e0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
99f0: 53 65 74 53 74 72 69 6e 67 28 26 7a 46 75 6c 6c  SetString(&zFull
9a00: 2c 20 7a 52 65 6c 61 74 69 76 65 2c 20 30 29 3b  , zRelative, 0);
9a10: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
9a20: 63 68 61 72 20 7a 42 75 66 5b 5f 4d 41 58 5f 50  char zBuf[_MAX_P
9a30: 41 54 48 2b 31 5d 3b 0a 20 20 20 20 20 20 73 71  ATH+1];.      sq
9a40: 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 7a  liteSetString(&z
9a50: 46 75 6c 6c 2c 20 67 65 74 63 77 64 28 7a 42 75  Full, getcwd(zBu
9a60: 66 2c 20 73 69 7a 65 6f 66 28 7a 42 75 66 29 29  f, sizeof(zBuf))
9a70: 2c 20 7a 52 65 6c 61 74 69 76 65 2c 20 30 29 3b  , zRelative, 0);
9a80: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
9a90: 75 72 6e 20 7a 46 75 6c 6c 3b 0a 23 65 6e 64 69  urn zFull;.#endi
9aa0: 66 0a 7d 0a                                      f.}.