/ Hex Artifact Content
Login

Artifact 2ce97909b926a598823f97338027dbec1dcf4165:


0000: 2f 2a 0a 2a 2a 20 32 30 30 36 20 46 65 62 20 31  /*.** 2006 Feb 1
0010: 34 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  4.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
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 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63   file contains c
0190: 6f 64 65 20 74 68 61 74 20 69 73 20 73 70 65 63  ode that is spec
01a0: 69 66 69 63 20 74 6f 20 4f 53 2f 32 2e 0a 2a 2f  ific to OS/2..*/
01b0: 0a 0a 23 69 66 20 28 5f 5f 47 4e 55 43 5f 5f 20  ..#if (__GNUC__ 
01c0: 3e 20 33 20 7c 7c 20 5f 5f 47 4e 55 43 5f 5f 20  > 3 || __GNUC__ 
01d0: 3d 3d 20 33 20 26 26 20 5f 5f 47 4e 55 43 5f 4d  == 3 && __GNUC_M
01e0: 49 4e 4f 52 5f 5f 20 3e 3d 20 33 29 20 26 26 20  INOR__ >= 3) && 
01f0: 64 65 66 69 6e 65 64 28 4f 53 32 5f 48 49 47 48  defined(OS2_HIGH
0200: 5f 4d 45 4d 4f 52 59 29 0a 2f 2a 20 6f 73 32 73  _MEMORY)./* os2s
0210: 61 66 65 2e 68 20 68 61 73 20 74 6f 20 62 65 20  afe.h has to be 
0220: 69 6e 63 6c 75 64 65 64 20 62 65 66 6f 72 65 20  included before 
0230: 6f 73 32 2e 68 2c 20 6e 65 65 64 65 64 20 66 6f  os2.h, needed fo
0240: 72 20 68 69 67 68 20 6d 65 6d 20 2a 2f 0a 23 69  r high mem */.#i
0250: 6e 63 6c 75 64 65 20 3c 6f 73 32 73 61 66 65 2e  nclude <os2safe.
0260: 68 3e 0a 23 65 6e 64 69 66 0a 0a 23 69 6e 63 6c  h>.#endif..#incl
0270: 75 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68  ude "sqliteInt.h
0280: 22 0a 23 69 6e 63 6c 75 64 65 20 22 6f 73 2e 68  ".#include "os.h
0290: 22 0a 0a 23 69 66 20 4f 53 5f 4f 53 32 0a 0a 2f  "..#if OS_OS2../
02a0: 2a 0a 2a 2a 20 4d 61 63 72 6f 73 20 75 73 65 64  *.** Macros used
02b0: 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68   to determine wh
02c0: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 6f 20  ether or not to 
02d0: 75 73 65 20 74 68 72 65 61 64 73 2e 0a 2a 2f 0a  use threads..*/.
02e0: 23 69 66 20 64 65 66 69 6e 65 64 28 54 48 52 45  #if defined(THRE
02f0: 41 44 53 41 46 45 29 20 26 26 20 54 48 52 45 41  ADSAFE) && THREA
0300: 44 53 41 46 45 0a 23 20 64 65 66 69 6e 65 20 53  DSAFE.# define S
0310: 51 4c 49 54 45 5f 4f 53 32 5f 54 48 52 45 41 44  QLITE_OS2_THREAD
0320: 53 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  S 1.#endif../*.*
0330: 2a 20 49 6e 63 6c 75 64 65 20 63 6f 64 65 20 74  * Include code t
0340: 68 61 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f  hat is common to
0350: 20 61 6c 6c 20 6f 73 5f 2a 2e 63 20 66 69 6c 65   all os_*.c file
0360: 73 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 6f  s.*/.#include "o
0370: 73 5f 63 6f 6d 6d 6f 6e 2e 68 22 0a 0a 2f 2a 0a  s_common.h"../*.
0380: 2a 2a 20 54 68 65 20 6f 73 32 46 69 6c 65 20 73  ** The os2File s
0390: 74 72 75 63 74 75 72 65 20 69 73 20 73 75 62 63  tructure is subc
03a0: 6c 61 73 73 20 6f 66 20 4f 73 46 69 6c 65 20 73  lass of OsFile s
03b0: 70 65 63 69 66 69 63 20 66 6f 72 20 74 68 65 20  pecific for the 
03c0: 4f 53 2f 32 0a 2a 2a 20 70 72 6f 74 61 62 69 6c  OS/2.** protabil
03d0: 69 74 79 20 6c 61 79 65 72 2e 0a 2a 2f 0a 74 79  ity layer..*/.ty
03e0: 70 65 64 65 66 20 73 74 72 75 63 74 20 6f 73 32  pedef struct os2
03f0: 46 69 6c 65 20 6f 73 32 46 69 6c 65 3b 0a 73 74  File os2File;.st
0400: 72 75 63 74 20 6f 73 32 46 69 6c 65 20 7b 0a 20  ruct os2File {. 
0410: 20 49 6f 4d 65 74 68 6f 64 20 63 6f 6e 73 74 20   IoMethod const 
0420: 2a 70 4d 65 74 68 6f 64 3b 20 20 2f 2a 20 41 6c  *pMethod;  /* Al
0430: 77 61 79 73 20 74 68 65 20 66 69 72 73 74 20 65  ways the first e
0440: 6e 74 72 79 20 2a 2f 0a 20 20 48 46 49 4c 45 20  ntry */.  HFILE 
0450: 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h;              
0460: 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 66 6f      /* Handle fo
0470: 72 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20  r accessing the 
0480: 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 64 65  file */.  int de
0490: 6c 4f 6e 43 6c 6f 73 65 3b 20 20 20 20 20 20 20  lOnClose;       
04a0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 66      /* True if f
04b0: 69 6c 65 20 69 73 20 74 6f 20 62 65 20 64 65 6c  ile is to be del
04c0: 65 74 65 64 20 6f 6e 20 63 6c 6f 73 65 20 2a 2f  eted on close */
04d0: 0a 20 20 63 68 61 72 2a 20 70 61 74 68 54 6f 44  .  char* pathToD
04e0: 65 6c 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  el;          /* 
04f0: 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f 20  Name of file to 
0500: 64 65 6c 65 74 65 20 6f 6e 20 63 6c 6f 73 65 20  delete on close 
0510: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
0520: 61 72 20 6c 6f 63 6b 74 79 70 65 3b 20 20 20 2f  ar locktype;   /
0530: 2a 20 54 79 70 65 20 6f 66 20 6c 6f 63 6b 20 63  * Type of lock c
0540: 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 6f 6e  urrently held on
0550: 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 7d 3b   this file */.};
0560: 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 6e 6f 74 20 69  ../*.** Do not i
0570: 6e 63 6c 75 64 65 20 61 6e 79 20 6f 66 20 74 68  nclude any of th
0580: 65 20 46 69 6c 65 20 49 2f 4f 20 69 6e 74 65 72  e File I/O inter
0590: 66 61 63 65 20 70 72 6f 63 65 64 75 72 65 73 20  face procedures 
05a0: 69 66 20 74 68 65 0a 2a 2a 20 53 51 4c 49 54 45  if the.** SQLITE
05b0: 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 20 6d 61 63  _OMIT_DISKIO mac
05c0: 72 6f 20 69 73 20 64 65 66 69 6e 65 64 20 28 69  ro is defined (i
05d0: 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74 20 74  ndicating that t
05e0: 68 65 72 65 20 64 61 74 61 62 61 73 65 0a 2a 2a  here database.**
05f0: 20 77 69 6c 6c 20 62 65 20 69 6e 2d 6d 65 6d 6f   will be in-memo
0600: 72 79 20 6f 6e 6c 79 29 0a 2a 2f 0a 23 69 66 6e  ry only).*/.#ifn
0610: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
0620: 44 49 53 4b 49 4f 0a 0a 2f 2a 0a 2a 2a 20 44 65  DISKIO../*.** De
0630: 6c 65 74 65 20 74 68 65 20 6e 61 6d 65 64 20 66  lete the named f
0640: 69 6c 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ile.*/.int sqlit
0650: 65 33 4f 73 32 44 65 6c 65 74 65 28 20 63 6f 6e  e3Os2Delete( con
0660: 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
0670: 6d 65 20 29 7b 0a 20 20 41 50 49 52 45 54 20 72  me ){.  APIRET r
0680: 63 20 3d 20 4e 4f 5f 45 52 52 4f 52 3b 0a 0a 20  c = NO_ERROR;.. 
0690: 20 72 63 20 3d 20 44 6f 73 44 65 6c 65 74 65 28   rc = DosDelete(
06a0: 20 28 50 53 5a 29 7a 46 69 6c 65 6e 61 6d 65 20   (PSZ)zFilename 
06b0: 29 3b 0a 20 20 4f 53 54 52 41 43 45 32 28 20 22  );.  OSTRACE2( "
06c0: 44 45 4c 45 54 45 20 5c 22 25 73 5c 22 5c 6e 22  DELETE \"%s\"\n"
06d0: 2c 20 7a 46 69 6c 65 6e 61 6d 65 20 29 3b 0a 20  , zFilename );. 
06e0: 20 72 65 74 75 72 6e 20 72 63 20 3d 3d 20 4e 4f   return rc == NO
06f0: 5f 45 52 52 4f 52 20 3f 20 53 51 4c 49 54 45 5f  _ERROR ? SQLITE_
0700: 4f 4b 20 3a 20 53 51 4c 49 54 45 5f 49 4f 45 52  OK : SQLITE_IOER
0710: 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  R;.}../*.** Retu
0720: 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 6e  rn TRUE if the n
0730: 61 6d 65 64 20 66 69 6c 65 20 65 78 69 73 74 73  amed file exists
0740: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
0750: 4f 73 32 46 69 6c 65 45 78 69 73 74 73 28 20 63  Os2FileExists( c
0760: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
0770: 6e 61 6d 65 20 29 7b 0a 20 20 46 49 4c 45 53 54  name ){.  FILEST
0780: 41 54 55 53 33 20 66 73 74 73 33 43 6f 6e 66 69  ATUS3 fsts3Confi
0790: 67 49 6e 66 6f 3b 0a 20 20 6d 65 6d 73 65 74 28  gInfo;.  memset(
07a0: 26 66 73 74 73 33 43 6f 6e 66 69 67 49 6e 66 6f  &fsts3ConfigInfo
07b0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 66 73 74 73  , 0, sizeof(fsts
07c0: 33 43 6f 6e 66 69 67 49 6e 66 6f 29 29 3b 0a 20  3ConfigInfo));. 
07d0: 20 72 65 74 75 72 6e 20 44 6f 73 51 75 65 72 79   return DosQuery
07e0: 50 61 74 68 49 6e 66 6f 28 20 28 50 53 5a 29 7a  PathInfo( (PSZ)z
07f0: 46 69 6c 65 6e 61 6d 65 2c 20 46 49 4c 5f 53 54  Filename, FIL_ST
0800: 41 4e 44 41 52 44 2c 0a 20 20 20 20 20 20 20 20  ANDARD,.        
0810: 26 66 73 74 73 33 43 6f 6e 66 69 67 49 6e 66 6f  &fsts3ConfigInfo
0820: 2c 20 73 69 7a 65 6f 66 28 46 49 4c 45 53 54 41  , sizeof(FILESTA
0830: 54 55 53 33 29 20 29 20 3d 3d 20 4e 4f 5f 45 52  TUS3) ) == NO_ER
0840: 52 4f 52 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61  ROR;.}../* Forwa
0850: 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 2a  rd declaration *
0860: 2f 0a 69 6e 74 20 61 6c 6c 6f 63 61 74 65 4f 73  /.int allocateOs
0870: 32 46 69 6c 65 28 20 6f 73 32 46 69 6c 65 20 2a  2File( os2File *
0880: 70 49 6e 69 74 2c 20 4f 73 46 69 6c 65 20 2a 2a  pInit, OsFile **
0890: 70 6c 64 20 29 3b 0a 0a 2f 2a 0a 2a 2a 20 41 74  pld );../*.** At
08a0: 74 65 6d 70 74 20 74 6f 20 6f 70 65 6e 20 61 20  tempt to open a 
08b0: 66 69 6c 65 20 66 6f 72 20 62 6f 74 68 20 72 65  file for both re
08c0: 61 64 69 6e 67 20 61 6e 64 20 77 72 69 74 69 6e  ading and writin
08d0: 67 2e 20 20 49 66 20 74 68 61 74 0a 2a 2a 20 66  g.  If that.** f
08e0: 61 69 6c 73 2c 20 74 72 79 20 6f 70 65 6e 69 6e  ails, try openin
08f0: 67 20 69 74 20 72 65 61 64 2d 6f 6e 6c 79 2e 20  g it read-only. 
0900: 20 49 66 20 74 68 65 20 66 69 6c 65 20 64 6f 65   If the file doe
0910: 73 20 6e 6f 74 20 65 78 69 73 74 2c 0a 2a 2a 20  s not exist,.** 
0920: 74 72 79 20 74 6f 20 63 72 65 61 74 65 20 69 74  try to create it
0930: 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65  ..**.** On succe
0940: 73 73 2c 20 61 20 68 61 6e 64 6c 65 20 66 6f 72  ss, a handle for
0950: 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20 69   the open file i
0960: 73 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 69 64  s written to *id
0970: 0a 2a 2a 20 61 6e 64 20 2a 70 52 65 61 64 6f 6e  .** and *pReadon
0980: 6c 79 20 69 73 20 73 65 74 20 74 6f 20 30 20 69  ly is set to 0 i
0990: 66 20 74 68 65 20 66 69 6c 65 20 77 61 73 20 6f  f the file was o
09a0: 70 65 6e 65 64 20 66 6f 72 20 72 65 61 64 69 6e  pened for readin
09b0: 67 20 61 6e 64 0a 2a 2a 20 77 72 69 74 69 6e 67  g and.** writing
09c0: 20 6f 72 20 31 20 69 66 20 74 68 65 20 66 69 6c   or 1 if the fil
09d0: 65 20 77 61 73 20 6f 70 65 6e 65 64 20 72 65 61  e was opened rea
09e0: 64 2d 6f 6e 6c 79 2e 20 20 54 68 65 20 66 75 6e  d-only.  The fun
09f0: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 0a 2a 2a  ction returns.**
0a00: 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a   SQLITE_OK..**.*
0a10: 2a 20 4f 6e 20 66 61 69 6c 75 72 65 2c 20 74 68  * On failure, th
0a20: 65 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  e function retur
0a30: 6e 73 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  ns SQLITE_CANTOP
0a40: 45 4e 20 61 6e 64 20 6c 65 61 76 65 73 0a 2a 2a  EN and leaves.**
0a50: 20 2a 69 64 20 61 6e 64 20 2a 70 52 65 61 64 6f   *id and *pReado
0a60: 6e 6c 79 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a  nly unchanged..*
0a70: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f 73 32  /.int sqlite3Os2
0a80: 4f 70 65 6e 52 65 61 64 57 72 69 74 65 28 0a 20  OpenReadWrite(. 
0a90: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
0aa0: 6c 65 6e 61 6d 65 2c 0a 20 20 4f 73 46 69 6c 65  lename,.  OsFile
0ab0: 20 2a 2a 70 6c 64 2c 0a 20 20 69 6e 74 20 2a 70   **pld,.  int *p
0ac0: 52 65 61 64 6f 6e 6c 79 0a 29 7b 0a 20 20 6f 73  Readonly.){.  os
0ad0: 32 46 69 6c 65 20 20 66 3b 0a 20 20 48 46 49 4c  2File  f;.  HFIL
0ae0: 45 20 20 20 20 68 66 3b 0a 20 20 55 4c 4f 4e 47  E    hf;.  ULONG
0af0: 20 20 20 20 75 6c 41 63 74 69 6f 6e 3b 0a 20 20      ulAction;.  
0b00: 41 50 49 52 45 54 20 20 20 72 63 20 3d 20 4e 4f  APIRET   rc = NO
0b10: 5f 45 52 52 4f 52 3b 0a 0a 20 20 61 73 73 65 72  _ERROR;..  asser
0b20: 74 28 20 2a 70 6c 64 20 3d 3d 20 30 20 29 3b 0a  t( *pld == 0 );.
0b30: 20 20 72 63 20 3d 20 44 6f 73 4f 70 65 6e 28 20    rc = DosOpen( 
0b40: 28 50 53 5a 29 7a 46 69 6c 65 6e 61 6d 65 2c 20  (PSZ)zFilename, 
0b50: 26 68 66 2c 20 26 75 6c 41 63 74 69 6f 6e 2c 20  &hf, &ulAction, 
0b60: 30 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  0L,.            
0b70: 46 49 4c 45 5f 41 52 43 48 49 56 45 44 20 7c 20  FILE_ARCHIVED | 
0b80: 46 49 4c 45 5f 4e 4f 52 4d 41 4c 2c 0a 20 20 20  FILE_NORMAL,.   
0b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 45               OPE
0ba0: 4e 5f 41 43 54 49 4f 4e 5f 43 52 45 41 54 45 5f  N_ACTION_CREATE_
0bb0: 49 46 5f 4e 45 57 20 7c 20 4f 50 45 4e 5f 41 43  IF_NEW | OPEN_AC
0bc0: 54 49 4f 4e 5f 4f 50 45 4e 5f 49 46 5f 45 58 49  TION_OPEN_IF_EXI
0bd0: 53 54 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20  STS,.           
0be0: 20 20 20 20 20 4f 50 45 4e 5f 46 4c 41 47 53 5f       OPEN_FLAGS_
0bf0: 46 41 49 4c 5f 4f 4e 5f 45 52 52 4f 52 20 7c 20  FAIL_ON_ERROR | 
0c00: 4f 50 45 4e 5f 46 4c 41 47 53 5f 52 41 4e 44 4f  OPEN_FLAGS_RANDO
0c10: 4d 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20  M |.            
0c20: 20 20 20 20 20 20 20 20 4f 50 45 4e 5f 53 48 41          OPEN_SHA
0c30: 52 45 5f 44 45 4e 59 4e 4f 4e 45 20 7c 20 4f 50  RE_DENYNONE | OP
0c40: 45 4e 5f 41 43 43 45 53 53 5f 52 45 41 44 57 52  EN_ACCESS_READWR
0c50: 49 54 45 2c 20 28 50 45 41 4f 50 32 29 4e 55 4c  ITE, (PEAOP2)NUL
0c60: 4c 20 29 3b 0a 20 20 69 66 28 20 72 63 20 21 3d  L );.  if( rc !=
0c70: 20 4e 4f 5f 45 52 52 4f 52 20 29 7b 0a 20 20 20   NO_ERROR ){.   
0c80: 20 72 63 20 3d 20 44 6f 73 4f 70 65 6e 28 20 28   rc = DosOpen( (
0c90: 50 53 5a 29 7a 46 69 6c 65 6e 61 6d 65 2c 20 26  PSZ)zFilename, &
0ca0: 68 66 2c 20 26 75 6c 41 63 74 69 6f 6e 2c 20 30  hf, &ulAction, 0
0cb0: 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 46  L,.            F
0cc0: 49 4c 45 5f 41 52 43 48 49 56 45 44 20 7c 20 46  ILE_ARCHIVED | F
0cd0: 49 4c 45 5f 4e 4f 52 4d 41 4c 2c 0a 20 20 20 20  ILE_NORMAL,.    
0ce0: 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 45 4e              OPEN
0cf0: 5f 41 43 54 49 4f 4e 5f 43 52 45 41 54 45 5f 49  _ACTION_CREATE_I
0d00: 46 5f 4e 45 57 20 7c 20 4f 50 45 4e 5f 41 43 54  F_NEW | OPEN_ACT
0d10: 49 4f 4e 5f 4f 50 45 4e 5f 49 46 5f 45 58 49 53  ION_OPEN_IF_EXIS
0d20: 54 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  TS,.            
0d30: 20 20 20 20 4f 50 45 4e 5f 46 4c 41 47 53 5f 46      OPEN_FLAGS_F
0d40: 41 49 4c 5f 4f 4e 5f 45 52 52 4f 52 20 7c 20 4f  AIL_ON_ERROR | O
0d50: 50 45 4e 5f 46 4c 41 47 53 5f 52 41 4e 44 4f 4d  PEN_FLAGS_RANDOM
0d60: 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   |.             
0d70: 20 20 20 20 20 20 20 20 20 20 20 4f 50 45 4e 5f             OPEN_
0d80: 53 48 41 52 45 5f 44 45 4e 59 57 52 49 54 45 20  SHARE_DENYWRITE 
0d90: 7c 20 4f 50 45 4e 5f 41 43 43 45 53 53 5f 52 45  | OPEN_ACCESS_RE
0da0: 41 44 4f 4e 4c 59 2c 20 28 50 45 41 4f 50 32 29  ADONLY, (PEAOP2)
0db0: 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 69 66 28 20  NULL );.    if( 
0dc0: 72 63 20 21 3d 20 4e 4f 5f 45 52 52 4f 52 20 29  rc != NO_ERROR )
0dd0: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
0de0: 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
0df0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 52 65  ;.    }.    *pRe
0e00: 61 64 6f 6e 6c 79 20 3d 20 31 3b 0a 20 20 7d 0a  adonly = 1;.  }.
0e10: 20 20 65 6c 73 65 7b 0a 20 20 20 20 2a 70 52 65    else{.    *pRe
0e20: 61 64 6f 6e 6c 79 20 3d 20 30 3b 0a 20 20 7d 0a  adonly = 0;.  }.
0e30: 20 20 66 2e 68 20 3d 20 68 66 3b 0a 20 20 66 2e    f.h = hf;.  f.
0e40: 6c 6f 63 6b 74 79 70 65 20 3d 20 4e 4f 5f 4c 4f  locktype = NO_LO
0e50: 43 4b 3b 0a 20 20 66 2e 64 65 6c 4f 6e 43 6c 6f  CK;.  f.delOnClo
0e60: 73 65 20 3d 20 30 3b 0a 20 20 66 2e 70 61 74 68  se = 0;.  f.path
0e70: 54 6f 44 65 6c 20 3d 20 4e 55 4c 4c 3b 0a 20 20  ToDel = NULL;.  
0e80: 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2b 31 29 3b  OpenCounter(+1);
0e90: 0a 20 20 4f 53 54 52 41 43 45 33 28 20 22 4f 50  .  OSTRACE3( "OP
0ea0: 45 4e 20 52 2f 57 20 25 64 20 5c 22 25 73 5c 22  EN R/W %d \"%s\"
0eb0: 5c 6e 22 2c 20 68 66 2c 20 7a 46 69 6c 65 6e 61  \n", hf, zFilena
0ec0: 6d 65 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 61  me );.  return a
0ed0: 6c 6c 6f 63 61 74 65 4f 73 32 46 69 6c 65 28 20  llocateOs2File( 
0ee0: 26 66 2c 20 70 6c 64 20 29 3b 0a 7d 0a 0a 0a 2f  &f, pld );.}.../
0ef0: 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20  *.** Attempt to 
0f00: 6f 70 65 6e 20 61 20 6e 65 77 20 66 69 6c 65 20  open a new file 
0f10: 66 6f 72 20 65 78 63 6c 75 73 69 76 65 20 61 63  for exclusive ac
0f20: 63 65 73 73 20 62 79 20 74 68 69 73 20 70 72 6f  cess by this pro
0f30: 63 65 73 73 2e 0a 2a 2a 20 54 68 65 20 66 69 6c  cess..** The fil
0f40: 65 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e 65 64  e will be opened
0f50: 20 66 6f 72 20 62 6f 74 68 20 72 65 61 64 69 6e   for both readin
0f60: 67 20 61 6e 64 20 77 72 69 74 69 6e 67 2e 20 20  g and writing.  
0f70: 54 6f 20 61 76 6f 69 64 0a 2a 2a 20 61 20 70 6f  To avoid.** a po
0f80: 74 65 6e 74 69 61 6c 20 73 65 63 75 72 69 74 79  tential security
0f90: 20 70 72 6f 62 6c 65 6d 2c 20 77 65 20 64 6f 20   problem, we do 
0fa0: 6e 6f 74 20 61 6c 6c 6f 77 20 74 68 65 20 66 69  not allow the fi
0fb0: 6c 65 20 74 6f 20 68 61 76 65 0a 2a 2a 20 70 72  le to have.** pr
0fc0: 65 76 69 6f 75 73 6c 79 20 65 78 69 73 74 65 64  eviously existed
0fd0: 2e 20 20 4e 6f 72 20 64 6f 20 77 65 20 61 6c 6c  .  Nor do we all
0fe0: 6f 77 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62  ow the file to b
0ff0: 65 20 61 20 73 79 6d 62 6f 6c 69 63 0a 2a 2a 20  e a symbolic.** 
1000: 6c 69 6e 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64  link..**.** If d
1010: 65 6c 46 6c 61 67 20 69 73 20 74 72 75 65 2c 20  elFlag is true, 
1020: 74 68 65 6e 20 6d 61 6b 65 20 61 72 72 61 6e 67  then make arrang
1030: 65 6d 65 6e 74 73 20 74 6f 20 61 75 74 6f 6d 61  ements to automa
1040: 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 0a 2a  tically delete.*
1050: 2a 20 74 68 65 20 66 69 6c 65 20 77 68 65 6e 20  * the file when 
1060: 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a  it is closed..**
1070: 0a 2a 2a 20 4f 6e 20 73 75 63 63 65 73 73 2c 20  .** On success, 
1080: 77 72 69 74 65 20 74 68 65 20 66 69 6c 65 20 68  write the file h
1090: 61 6e 64 6c 65 20 69 6e 74 6f 20 2a 69 64 20 61  andle into *id a
10a0: 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
10b0: 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 66 61  _OK..**.** On fa
10c0: 69 6c 75 72 65 2c 20 72 65 74 75 72 6e 20 53 51  ilure, return SQ
10d0: 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 2e 0a 2a  LITE_CANTOPEN..*
10e0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f 73 32  /.int sqlite3Os2
10f0: 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 20 63  OpenExclusive( c
1100: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
1110: 6e 61 6d 65 2c 20 4f 73 46 69 6c 65 20 2a 2a 70  name, OsFile **p
1120: 6c 64 2c 20 69 6e 74 20 64 65 6c 46 6c 61 67 20  ld, int delFlag 
1130: 29 7b 0a 20 20 6f 73 32 46 69 6c 65 20 20 66 3b  ){.  os2File  f;
1140: 0a 20 20 48 46 49 4c 45 20 20 20 20 68 66 3b 0a  .  HFILE    hf;.
1150: 20 20 55 4c 4f 4e 47 20 20 20 20 75 6c 41 63 74    ULONG    ulAct
1160: 69 6f 6e 3b 0a 20 20 41 50 49 52 45 54 20 20 20  ion;.  APIRET   
1170: 72 63 20 3d 20 4e 4f 5f 45 52 52 4f 52 3b 0a 0a  rc = NO_ERROR;..
1180: 20 20 61 73 73 65 72 74 28 20 2a 70 6c 64 20 3d    assert( *pld =
1190: 3d 20 30 20 29 3b 0a 20 20 72 63 20 3d 20 44 6f  = 0 );.  rc = Do
11a0: 73 4f 70 65 6e 28 20 28 50 53 5a 29 7a 46 69 6c  sOpen( (PSZ)zFil
11b0: 65 6e 61 6d 65 2c 20 26 68 66 2c 20 26 75 6c 41  ename, &hf, &ulA
11c0: 63 74 69 6f 6e 2c 20 30 4c 2c 20 46 49 4c 45 5f  ction, 0L, FILE_
11d0: 4e 4f 52 4d 41 4c 2c 0a 20 20 20 20 20 20 20 20  NORMAL,.        
11e0: 20 20 20 20 4f 50 45 4e 5f 41 43 54 49 4f 4e 5f      OPEN_ACTION_
11f0: 43 52 45 41 54 45 5f 49 46 5f 4e 45 57 20 7c 20  CREATE_IF_NEW | 
1200: 4f 50 45 4e 5f 41 43 54 49 4f 4e 5f 52 45 50 4c  OPEN_ACTION_REPL
1210: 41 43 45 5f 49 46 5f 45 58 49 53 54 53 2c 0a 20  ACE_IF_EXISTS,. 
1220: 20 20 20 20 20 20 20 20 20 20 20 4f 50 45 4e 5f             OPEN_
1230: 46 4c 41 47 53 5f 46 41 49 4c 5f 4f 4e 5f 45 52  FLAGS_FAIL_ON_ER
1240: 52 4f 52 20 7c 20 4f 50 45 4e 5f 46 4c 41 47 53  ROR | OPEN_FLAGS
1250: 5f 52 41 4e 44 4f 4d 20 7c 0a 20 20 20 20 20 20  _RANDOM |.      
1260: 20 20 20 20 20 20 20 20 20 20 4f 50 45 4e 5f 53            OPEN_S
1270: 48 41 52 45 5f 44 45 4e 59 52 45 41 44 57 52 49  HARE_DENYREADWRI
1280: 54 45 20 7c 20 4f 50 45 4e 5f 41 43 43 45 53 53  TE | OPEN_ACCESS
1290: 5f 52 45 41 44 57 52 49 54 45 2c 20 28 50 45 41  _READWRITE, (PEA
12a0: 4f 50 32 29 4e 55 4c 4c 20 29 3b 0a 20 20 69 66  OP2)NULL );.  if
12b0: 28 20 72 63 20 21 3d 20 4e 4f 5f 45 52 52 4f 52  ( rc != NO_ERROR
12c0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
12d0: 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a  QLITE_CANTOPEN;.
12e0: 20 20 7d 0a 0a 20 20 66 2e 68 20 3d 20 68 66 3b    }..  f.h = hf;
12f0: 0a 20 20 66 2e 6c 6f 63 6b 74 79 70 65 20 3d 20  .  f.locktype = 
1300: 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 66 2e 64 65 6c  NO_LOCK;.  f.del
1310: 4f 6e 43 6c 6f 73 65 20 3d 20 64 65 6c 46 6c 61  OnClose = delFla
1320: 67 20 3f 20 31 20 3a 20 30 3b 0a 20 20 66 2e 70  g ? 1 : 0;.  f.p
1330: 61 74 68 54 6f 44 65 6c 20 3d 20 64 65 6c 46 6c  athToDel = delFl
1340: 61 67 20 3f 20 73 71 6c 69 74 65 33 4f 73 46 75  ag ? sqlite3OsFu
1350: 6c 6c 50 61 74 68 6e 61 6d 65 28 20 7a 46 69 6c  llPathname( zFil
1360: 65 6e 61 6d 65 20 29 20 3a 20 4e 55 4c 4c 3b 0a  ename ) : NULL;.
1370: 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 20 2b    OpenCounter( +
1380: 31 20 29 3b 0a 20 20 69 66 28 20 64 65 6c 46 6c  1 );.  if( delFl
1390: 61 67 20 29 20 44 6f 73 46 6f 72 63 65 44 65 6c  ag ) DosForceDel
13a0: 65 74 65 28 20 73 71 6c 69 74 65 33 4f 73 46 75  ete( sqlite3OsFu
13b0: 6c 6c 50 61 74 68 6e 61 6d 65 28 20 7a 46 69 6c  llPathname( zFil
13c0: 65 6e 61 6d 65 20 29 20 29 3b 0a 20 20 4f 53 54  ename ) );.  OST
13d0: 52 41 43 45 33 28 20 22 4f 50 45 4e 20 45 58 20  RACE3( "OPEN EX 
13e0: 25 64 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 68 66  %d \"%s\"\n", hf
13f0: 2c 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50  , sqlite3OsFullP
1400: 61 74 68 6e 61 6d 65 20 28 20 7a 46 69 6c 65 6e  athname ( zFilen
1410: 61 6d 65 20 29 20 29 3b 0a 20 20 72 65 74 75 72  ame ) );.  retur
1420: 6e 20 61 6c 6c 6f 63 61 74 65 4f 73 32 46 69 6c  n allocateOs2Fil
1430: 65 28 20 26 66 2c 20 70 6c 64 20 29 3b 0a 7d 0a  e( &f, pld );.}.
1440: 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74  ./*.** Attempt t
1450: 6f 20 6f 70 65 6e 20 61 20 6e 65 77 20 66 69 6c  o open a new fil
1460: 65 20 66 6f 72 20 72 65 61 64 2d 6f 6e 6c 79 20  e for read-only 
1470: 61 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 4f 6e  access..**.** On
1480: 20 73 75 63 63 65 73 73 2c 20 77 72 69 74 65 20   success, write 
1490: 74 68 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20  the file handle 
14a0: 69 6e 74 6f 20 2a 69 64 20 61 6e 64 20 72 65 74  into *id and ret
14b0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  urn SQLITE_OK..*
14c0: 2a 0a 2a 2a 20 4f 6e 20 66 61 69 6c 75 72 65 2c  *.** On failure,
14d0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
14e0: 41 4e 54 4f 50 45 4e 2e 0a 2a 2f 0a 69 6e 74 20  ANTOPEN..*/.int 
14f0: 73 71 6c 69 74 65 33 4f 73 32 4f 70 65 6e 52 65  sqlite3Os2OpenRe
1500: 61 64 4f 6e 6c 79 28 20 63 6f 6e 73 74 20 63 68  adOnly( const ch
1510: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 4f  ar *zFilename, O
1520: 73 46 69 6c 65 20 2a 2a 70 6c 64 20 29 7b 0a 20  sFile **pld ){. 
1530: 20 6f 73 32 46 69 6c 65 20 20 66 3b 0a 20 20 48   os2File  f;.  H
1540: 46 49 4c 45 20 20 20 20 68 66 3b 0a 20 20 55 4c  FILE    hf;.  UL
1550: 4f 4e 47 20 20 20 20 75 6c 41 63 74 69 6f 6e 3b  ONG    ulAction;
1560: 0a 20 20 41 50 49 52 45 54 20 20 20 72 63 20 3d  .  APIRET   rc =
1570: 20 4e 4f 5f 45 52 52 4f 52 3b 0a 0a 20 20 61 73   NO_ERROR;..  as
1580: 73 65 72 74 28 20 2a 70 6c 64 20 3d 3d 20 30 20  sert( *pld == 0 
1590: 29 3b 0a 20 20 72 63 20 3d 20 44 6f 73 4f 70 65  );.  rc = DosOpe
15a0: 6e 28 20 28 50 53 5a 29 7a 46 69 6c 65 6e 61 6d  n( (PSZ)zFilenam
15b0: 65 2c 20 26 68 66 2c 20 26 75 6c 41 63 74 69 6f  e, &hf, &ulActio
15c0: 6e 2c 20 30 4c 2c 0a 20 20 20 20 20 20 20 20 20  n, 0L,.         
15d0: 20 20 20 46 49 4c 45 5f 4e 4f 52 4d 41 4c 2c 20     FILE_NORMAL, 
15e0: 4f 50 45 4e 5f 41 43 54 49 4f 4e 5f 4f 50 45 4e  OPEN_ACTION_OPEN
15f0: 5f 49 46 5f 45 58 49 53 54 53 2c 0a 20 20 20 20  _IF_EXISTS,.    
1600: 20 20 20 20 20 20 20 20 4f 50 45 4e 5f 46 4c 41          OPEN_FLA
1610: 47 53 5f 46 41 49 4c 5f 4f 4e 5f 45 52 52 4f 52  GS_FAIL_ON_ERROR
1620: 20 7c 20 4f 50 45 4e 5f 46 4c 41 47 53 5f 52 41   | OPEN_FLAGS_RA
1630: 4e 44 4f 4d 20 7c 0a 20 20 20 20 20 20 20 20 20  NDOM |.         
1640: 20 20 20 20 20 20 20 4f 50 45 4e 5f 53 48 41 52         OPEN_SHAR
1650: 45 5f 44 45 4e 59 57 52 49 54 45 20 7c 20 4f 50  E_DENYWRITE | OP
1660: 45 4e 5f 41 43 43 45 53 53 5f 52 45 41 44 4f 4e  EN_ACCESS_READON
1670: 4c 59 2c 20 28 50 45 41 4f 50 32 29 4e 55 4c 4c  LY, (PEAOP2)NULL
1680: 20 29 3b 0a 20 20 69 66 28 20 72 63 20 21 3d 20   );.  if( rc != 
1690: 4e 4f 5f 45 52 52 4f 52 20 29 7b 0a 20 20 20 20  NO_ERROR ){.    
16a0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41  return SQLITE_CA
16b0: 4e 54 4f 50 45 4e 3b 0a 20 20 7d 0a 20 20 66 2e  NTOPEN;.  }.  f.
16c0: 68 20 3d 20 68 66 3b 0a 20 20 66 2e 6c 6f 63 6b  h = hf;.  f.lock
16d0: 74 79 70 65 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a  type = NO_LOCK;.
16e0: 20 20 66 2e 64 65 6c 4f 6e 43 6c 6f 73 65 20 3d    f.delOnClose =
16f0: 20 30 3b 0a 20 20 66 2e 70 61 74 68 54 6f 44 65   0;.  f.pathToDe
1700: 6c 20 3d 20 4e 55 4c 4c 3b 0a 20 20 4f 70 65 6e  l = NULL;.  Open
1710: 43 6f 75 6e 74 65 72 28 20 2b 31 20 29 3b 0a 20  Counter( +1 );. 
1720: 20 4f 53 54 52 41 43 45 33 28 20 22 4f 50 45 4e   OSTRACE3( "OPEN
1730: 20 52 4f 20 25 64 20 5c 22 25 73 5c 22 5c 6e 22   RO %d \"%s\"\n"
1740: 2c 20 68 66 2c 20 7a 46 69 6c 65 6e 61 6d 65 20  , hf, zFilename 
1750: 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 6c 6c 6f  );.  return allo
1760: 63 61 74 65 4f 73 32 46 69 6c 65 28 20 26 66 2c  cateOs2File( &f,
1770: 20 70 6c 64 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   pld );.}../*.**
1780: 20 41 74 74 65 6d 70 74 20 74 6f 20 6f 70 65 6e   Attempt to open
1790: 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74   a file descript
17a0: 6f 72 20 66 6f 72 20 74 68 65 20 64 69 72 65 63  or for the direc
17b0: 74 6f 72 79 20 74 68 61 74 20 63 6f 6e 74 61 69  tory that contai
17c0: 6e 73 20 61 0a 2a 2a 20 66 69 6c 65 2e 20 20 54  ns a.** file.  T
17d0: 68 69 73 20 66 69 6c 65 20 64 65 73 63 72 69 70  his file descrip
17e0: 74 6f 72 20 63 61 6e 20 62 65 20 75 73 65 64 20  tor can be used 
17f0: 74 6f 20 66 73 79 6e 63 28 29 20 74 68 65 20 64  to fsync() the d
1800: 69 72 65 63 74 6f 72 79 0a 2a 2a 20 69 6e 20 6f  irectory.** in o
1810: 72 64 65 72 20 74 6f 20 6d 61 6b 65 20 73 75 72  rder to make sur
1820: 65 20 74 68 65 20 63 72 65 61 74 69 6f 6e 20 6f  e the creation o
1830: 66 20 61 20 6e 65 77 20 66 69 6c 65 20 69 73 20  f a new file is 
1840: 61 63 74 75 61 6c 6c 79 20 77 72 69 74 74 65 6e  actually written
1850: 0a 2a 2a 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a  .** to disk..**.
1860: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1870: 69 73 20 6f 6e 6c 79 20 6d 65 61 6e 69 6e 67 66  is only meaningf
1880: 75 6c 20 66 6f 72 20 55 6e 69 78 2e 20 20 49 74  ul for Unix.  It
1890: 20 69 73 20 61 20 6e 6f 2d 6f 70 20 75 6e 64 65   is a no-op unde
18a0: 72 0a 2a 2a 20 4f 53 2f 32 20 73 69 6e 63 65 20  r.** OS/2 since 
18b0: 4f 53 2f 32 20 64 6f 65 73 20 6e 6f 74 20 73 75  OS/2 does not su
18c0: 70 70 6f 72 74 20 68 61 72 64 20 6c 69 6e 6b 73  pport hard links
18d0: 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 73 75 63 63 65  ..**.** On succe
18e0: 73 73 2c 20 61 20 68 61 6e 64 6c 65 20 66 6f 72  ss, a handle for
18f0: 20 61 20 70 72 65 76 69 6f 75 73 6c 79 20 6f 70   a previously op
1900: 65 6e 20 66 69 6c 65 20 69 73 20 61 74 20 2a 69  en file is at *i
1910: 64 20 69 73 0a 2a 2a 20 75 70 64 61 74 65 64 20  d is.** updated 
1920: 77 69 74 68 20 74 68 65 20 6e 65 77 20 64 69 72  with the new dir
1930: 65 63 74 6f 72 79 20 66 69 6c 65 20 64 65 73 63  ectory file desc
1940: 72 69 70 74 6f 72 20 61 6e 64 20 53 51 4c 49 54  riptor and SQLIT
1950: 45 5f 4f 4b 20 69 73 0a 2a 2a 20 72 65 74 75 72  E_OK is.** retur
1960: 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 20 66 61  ned..**.** On fa
1970: 69 6c 75 72 65 2c 20 74 68 65 20 66 75 6e 63 74  ilure, the funct
1980: 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ion returns SQLI
1990: 54 45 5f 43 41 4e 54 4f 50 45 4e 20 61 6e 64 20  TE_CANTOPEN and 
19a0: 6c 65 61 76 65 73 0a 2a 2a 20 2a 69 64 20 75 6e  leaves.** *id un
19b0: 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20  changed..*/.int 
19c0: 6f 73 32 4f 70 65 6e 44 69 72 65 63 74 6f 72 79  os2OpenDirectory
19d0: 28 0a 20 20 4f 73 46 69 6c 65 20 2a 69 64 2c 0a  (.  OsFile *id,.
19e0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
19f0: 69 72 6e 61 6d 65 0a 29 7b 0a 20 20 72 65 74 75  irname.){.  retu
1a00: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1a10: 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
1a20: 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6e  temporary file n
1a30: 61 6d 65 20 69 6e 20 7a 42 75 66 2e 20 20 7a 42  ame in zBuf.  zB
1a40: 75 66 20 6d 75 73 74 20 62 65 20 62 69 67 20 65  uf must be big e
1a50: 6e 6f 75 67 68 20 74 6f 0a 2a 2a 20 68 6f 6c 64  nough to.** hold
1a60: 20 61 74 20 6c 65 61 73 74 20 53 51 4c 49 54 45   at least SQLITE
1a70: 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 20 63  _TEMPNAME_SIZE c
1a80: 68 61 72 61 63 74 65 72 73 2e 0a 2a 2f 0a 69 6e  haracters..*/.in
1a90: 74 20 73 71 6c 69 74 65 33 4f 73 32 54 65 6d 70  t sqlite3Os2Temp
1aa0: 46 69 6c 65 4e 61 6d 65 28 20 63 68 61 72 20 2a  FileName( char *
1ab0: 7a 42 75 66 20 29 7b 0a 20 20 73 74 61 74 69 63  zBuf ){.  static
1ac0: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
1ad0: 63 68 61 72 20 7a 43 68 61 72 73 5b 5d 20 3d 0a  char zChars[] =.
1ae0: 20 20 20 20 22 61 62 63 64 65 66 67 68 69 6a 6b      "abcdefghijk
1af0: 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 22  lmnopqrstuvwxyz"
1b00: 0a 20 20 20 20 22 41 42 43 44 45 46 47 48 49 4a  .    "ABCDEFGHIJ
1b10: 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a  KLMNOPQRSTUVWXYZ
1b20: 22 0a 20 20 20 20 22 30 31 32 33 34 35 36 37 38  ".    "012345678
1b30: 39 22 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  9";.  int i, j;.
1b40: 20 20 50 53 5a 20 7a 54 65 6d 70 50 61 74 68 20    PSZ zTempPath 
1b50: 3d 20 30 3b 0a 20 20 69 66 28 20 44 6f 73 53 63  = 0;.  if( DosSc
1b60: 61 6e 45 6e 76 28 20 22 54 45 4d 50 22 2c 20 26  anEnv( "TEMP", &
1b70: 7a 54 65 6d 70 50 61 74 68 20 29 20 29 7b 0a 20  zTempPath ) ){. 
1b80: 20 20 20 69 66 28 20 44 6f 73 53 63 61 6e 45 6e     if( DosScanEn
1b90: 76 28 20 22 54 4d 50 22 2c 20 26 7a 54 65 6d 70  v( "TMP", &zTemp
1ba0: 50 61 74 68 20 29 20 29 7b 0a 20 20 20 20 20 20  Path ) ){.      
1bb0: 69 66 28 20 44 6f 73 53 63 61 6e 45 6e 76 28 20  if( DosScanEnv( 
1bc0: 22 54 4d 50 44 49 52 22 2c 20 26 7a 54 65 6d 70  "TMPDIR", &zTemp
1bd0: 50 61 74 68 20 29 20 29 7b 0a 20 20 20 20 20 20  Path ) ){.      
1be0: 20 20 20 20 20 55 4c 4f 4e 47 20 75 6c 44 72 69       ULONG ulDri
1bf0: 76 65 4e 75 6d 20 3d 20 30 2c 20 75 6c 44 72 69  veNum = 0, ulDri
1c00: 76 65 4d 61 70 20 3d 20 30 3b 0a 20 20 20 20 20  veMap = 0;.     
1c10: 20 20 20 20 20 20 44 6f 73 51 75 65 72 79 43 75        DosQueryCu
1c20: 72 72 65 6e 74 44 69 73 6b 28 20 26 75 6c 44 72  rrentDisk( &ulDr
1c30: 69 76 65 4e 75 6d 2c 20 26 75 6c 44 72 69 76 65  iveNum, &ulDrive
1c40: 4d 61 70 20 29 3b 0a 20 20 20 20 20 20 20 20 20  Map );.         
1c50: 20 20 73 70 72 69 6e 74 66 28 20 7a 54 65 6d 70    sprintf( zTemp
1c60: 50 61 74 68 2c 20 22 25 63 3a 22 2c 20 28 63 68  Path, "%c:", (ch
1c70: 61 72 29 28 20 27 41 27 20 2b 20 75 6c 44 72 69  ar)( 'A' + ulDri
1c80: 76 65 4e 75 6d 20 2d 20 31 20 29 20 29 3b 0a 20  veNum - 1 ) );. 
1c90: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1ca0: 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20  .  for(;;){.    
1cb0: 20 20 73 70 72 69 6e 74 66 28 20 7a 42 75 66 2c    sprintf( zBuf,
1cc0: 20 22 25 73 5c 5c 22 54 45 4d 50 5f 46 49 4c 45   "%s\\"TEMP_FILE
1cd0: 5f 50 52 45 46 49 58 2c 20 7a 54 65 6d 70 50 61  _PREFIX, zTempPa
1ce0: 74 68 20 29 3b 0a 20 20 20 20 20 20 6a 20 3d 20  th );.      j = 
1cf0: 73 74 72 6c 65 6e 28 20 7a 42 75 66 20 29 3b 0a  strlen( zBuf );.
1d00: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 61 6e        sqlite3Ran
1d10: 64 6f 6d 6e 65 73 73 28 20 31 35 2c 20 26 7a 42  domness( 15, &zB
1d20: 75 66 5b 6a 5d 20 29 3b 0a 20 20 20 20 20 20 66  uf[j] );.      f
1d30: 6f 72 28 20 69 20 3d 20 30 3b 20 69 20 3c 20 31  or( i = 0; i < 1
1d40: 35 3b 20 69 2b 2b 2c 20 6a 2b 2b 20 29 7b 0a 20  5; i++, j++ ){. 
1d50: 20 20 20 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d         zBuf[j] =
1d60: 20 28 63 68 61 72 29 7a 43 68 61 72 73 5b 20 28   (char)zChars[ (
1d70: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 7a  (unsigned char)z
1d80: 42 75 66 5b 6a 5d 29 25 28 73 69 7a 65 6f 66 28  Buf[j])%(sizeof(
1d90: 7a 43 68 61 72 73 29 2d 31 29 20 5d 3b 0a 20 20  zChars)-1) ];.  
1da0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 42 75 66      }.      zBuf
1db0: 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  [j] = 0;.      i
1dc0: 66 28 20 21 73 71 6c 69 74 65 33 4f 73 46 69 6c  f( !sqlite3OsFil
1dd0: 65 45 78 69 73 74 73 28 20 7a 42 75 66 20 29 20  eExists( zBuf ) 
1de0: 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 4f  ) break;.  }.  O
1df0: 53 54 52 41 43 45 32 28 20 22 54 45 4d 50 20 46  STRACE2( "TEMP F
1e00: 49 4c 45 4e 41 4d 45 3a 20 25 73 5c 6e 22 2c 20  ILENAME: %s\n", 
1e10: 7a 42 75 66 20 29 3b 0a 20 20 72 65 74 75 72 6e  zBuf );.  return
1e20: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
1e30: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c  *.** Close a fil
1e40: 65 2e 0a 2a 2f 0a 69 6e 74 20 6f 73 32 43 6c 6f  e..*/.int os2Clo
1e50: 73 65 28 20 4f 73 46 69 6c 65 20 2a 2a 70 6c 64  se( OsFile **pld
1e60: 20 29 7b 0a 20 20 6f 73 32 46 69 6c 65 20 2a 70   ){.  os2File *p
1e70: 46 69 6c 65 3b 0a 20 20 41 50 49 52 45 54 20 72  File;.  APIRET r
1e80: 63 20 3d 20 4e 4f 5f 45 52 52 4f 52 3b 0a 20 20  c = NO_ERROR;.  
1e90: 69 66 28 20 70 6c 64 20 26 26 20 28 70 46 69 6c  if( pld && (pFil
1ea0: 65 20 3d 20 28 6f 73 32 46 69 6c 65 2a 29 2a 70  e = (os2File*)*p
1eb0: 6c 64 29 20 21 3d 20 30 20 29 7b 0a 20 20 20 20  ld) != 0 ){.    
1ec0: 4f 53 54 52 41 43 45 32 28 20 22 43 4c 4f 53 45  OSTRACE2( "CLOSE
1ed0: 20 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68   %d\n", pFile->h
1ee0: 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 44 6f 73   );.    rc = Dos
1ef0: 43 6c 6f 73 65 28 20 70 46 69 6c 65 2d 3e 68 20  Close( pFile->h 
1f00: 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 6f  );.    pFile->lo
1f10: 63 6b 74 79 70 65 20 3d 20 4e 4f 5f 4c 4f 43 4b  cktype = NO_LOCK
1f20: 3b 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d  ;.    if( pFile-
1f30: 3e 64 65 6c 4f 6e 43 6c 6f 73 65 20 21 3d 20 30  >delOnClose != 0
1f40: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1f50: 20 44 6f 73 46 6f 72 63 65 44 65 6c 65 74 65 28   DosForceDelete(
1f60: 20 70 46 69 6c 65 2d 3e 70 61 74 68 54 6f 44 65   pFile->pathToDe
1f70: 6c 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a  l );.    }.    *
1f80: 70 6c 64 20 3d 20 30 3b 0a 20 20 20 20 4f 70 65  pld = 0;.    Ope
1f90: 6e 43 6f 75 6e 74 65 72 28 20 2d 31 20 29 3b 0a  nCounter( -1 );.
1fa0: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
1fb0: 20 3d 3d 20 4e 4f 5f 45 52 52 4f 52 20 3f 20 53   == NO_ERROR ? S
1fc0: 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c 49 54  QLITE_OK : SQLIT
1fd0: 45 5f 49 4f 45 52 52 3b 0a 7d 0a 0a 2f 2a 0a 2a  E_IOERR;.}../*.*
1fe0: 2a 20 52 65 61 64 20 64 61 74 61 20 66 72 6f 6d  * Read data from
1ff0: 20 61 20 66 69 6c 65 20 69 6e 74 6f 20 61 20 62   a file into a b
2000: 75 66 66 65 72 2e 20 20 52 65 74 75 72 6e 20 53  uffer.  Return S
2010: 51 4c 49 54 45 5f 4f 4b 20 69 66 20 61 6c 6c 0a  QLITE_OK if all.
2020: 2a 2a 20 62 79 74 65 73 20 77 65 72 65 20 72 65  ** bytes were re
2030: 61 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  ad successfully 
2040: 61 6e 64 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  and SQLITE_IOERR
2050: 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65   if anything goe
2060: 73 0a 2a 2a 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 69  s.** wrong..*/.i
2070: 6e 74 20 6f 73 32 52 65 61 64 28 20 4f 73 46 69  nt os2Read( OsFi
2080: 6c 65 20 2a 69 64 2c 20 76 6f 69 64 20 2a 70 42  le *id, void *pB
2090: 75 66 2c 20 69 6e 74 20 61 6d 74 20 29 7b 0a 20  uf, int amt ){. 
20a0: 20 55 4c 4f 4e 47 20 67 6f 74 3b 0a 20 20 61 73   ULONG got;.  as
20b0: 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20  sert( id!=0 );. 
20c0: 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
20d0: 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
20e0: 49 4f 45 52 52 20 29 3b 0a 20 20 4f 53 54 52 41  IOERR );.  OSTRA
20f0: 43 45 33 28 20 22 52 45 41 44 20 25 64 20 6c 6f  CE3( "READ %d lo
2100: 63 6b 3d 25 64 5c 6e 22 2c 20 28 28 6f 73 32 46  ck=%d\n", ((os2F
2110: 69 6c 65 2a 29 69 64 29 2d 3e 68 2c 20 28 28 6f  ile*)id)->h, ((o
2120: 73 32 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 6f 63  s2File*)id)->loc
2130: 6b 74 79 70 65 20 29 3b 0a 20 20 44 6f 73 52 65  ktype );.  DosRe
2140: 61 64 28 20 28 28 6f 73 32 46 69 6c 65 2a 29 69  ad( ((os2File*)i
2150: 64 29 2d 3e 68 2c 20 70 42 75 66 2c 20 61 6d 74  d)->h, pBuf, amt
2160: 2c 20 26 67 6f 74 20 29 3b 0a 20 20 69 66 20 28  , &got );.  if (
2170: 67 6f 74 20 3d 3d 20 28 55 4c 4f 4e 47 29 61 6d  got == (ULONG)am
2180: 74 29 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  t).    return SQ
2190: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 65 6c 73 65 20  LITE_OK;.  else 
21a0: 69 66 20 28 67 6f 74 20 3c 20 30 29 0a 20 20 20  if (got < 0).   
21b0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
21c0: 4f 45 52 52 5f 52 45 41 44 3b 0a 20 20 65 6c 73  OERR_READ;.  els
21d0: 65 20 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26  e {.    memset(&
21e0: 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b 67 6f  ((char*)pBuf)[go
21f0: 74 5d 2c 20 30 2c 20 61 6d 74 2d 67 6f 74 29 3b  t], 0, amt-got);
2200: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2210: 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
2220: 45 41 44 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  EAD;.  }.}../*.*
2230: 2a 20 57 72 69 74 65 20 64 61 74 61 20 66 72 6f  * Write data fro
2240: 6d 20 61 20 62 75 66 66 65 72 20 69 6e 74 6f 20  m a buffer into 
2250: 61 20 66 69 6c 65 2e 20 20 52 65 74 75 72 6e 20  a file.  Return 
2260: 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
2270: 63 65 73 73 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20  cess.** or some 
2280: 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65  other error code
2290: 20 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a   on failure..*/.
22a0: 69 6e 74 20 6f 73 32 57 72 69 74 65 28 20 4f 73  int os2Write( Os
22b0: 46 69 6c 65 20 2a 69 64 2c 20 63 6f 6e 73 74 20  File *id, const 
22c0: 76 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e 74 20  void *pBuf, int 
22d0: 61 6d 74 20 29 7b 0a 20 20 41 50 49 52 45 54 20  amt ){.  APIRET 
22e0: 72 63 20 3d 20 4e 4f 5f 45 52 52 4f 52 3b 0a 20  rc = NO_ERROR;. 
22f0: 20 55 4c 4f 4e 47 20 77 72 6f 74 65 3b 0a 20 20   ULONG wrote;.  
2300: 61 73 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b  assert( id!=0 );
2310: 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
2320: 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
2330: 45 5f 49 4f 45 52 52 20 29 3b 0a 20 20 53 69 6d  E_IOERR );.  Sim
2340: 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45 72 72  ulateDiskfullErr
2350: 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
2360: 45 5f 46 55 4c 4c 20 29 3b 0a 20 20 4f 53 54 52  E_FULL );.  OSTR
2370: 41 43 45 33 28 20 22 57 52 49 54 45 20 25 64 20  ACE3( "WRITE %d 
2380: 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 20 28 28 6f 73  lock=%d\n", ((os
2390: 32 46 69 6c 65 2a 29 69 64 29 2d 3e 68 2c 20 28  2File*)id)->h, (
23a0: 28 6f 73 32 46 69 6c 65 2a 29 69 64 29 2d 3e 6c  (os2File*)id)->l
23b0: 6f 63 6b 74 79 70 65 20 29 3b 0a 20 20 77 68 69  ocktype );.  whi
23c0: 6c 65 28 20 61 6d 74 20 3e 20 30 20 26 26 0a 20  le( amt > 0 &&. 
23d0: 20 20 20 20 20 28 72 63 20 3d 20 44 6f 73 57 72       (rc = DosWr
23e0: 69 74 65 28 20 28 28 6f 73 32 46 69 6c 65 2a 29  ite( ((os2File*)
23f0: 69 64 29 2d 3e 68 2c 20 28 50 56 4f 49 44 29 70  id)->h, (PVOID)p
2400: 42 75 66 2c 20 61 6d 74 2c 20 26 77 72 6f 74 65  Buf, amt, &wrote
2410: 20 29 29 20 26 26 20 77 72 6f 74 65 20 3e 20 30   )) && wrote > 0
2420: 20 29 7b 0a 20 20 20 20 20 20 61 6d 74 20 2d 3d   ){.      amt -=
2430: 20 77 72 6f 74 65 3b 0a 20 20 20 20 20 20 70 42   wrote;.      pB
2440: 75 66 20 3d 20 26 28 28 63 68 61 72 2a 29 70 42  uf = &((char*)pB
2450: 75 66 29 5b 77 72 6f 74 65 5d 3b 0a 20 20 7d 0a  uf)[wrote];.  }.
2460: 0a 20 20 72 65 74 75 72 6e 20 28 20 72 63 20 21  .  return ( rc !
2470: 3d 20 4e 4f 5f 45 52 52 4f 52 20 7c 7c 20 61 6d  = NO_ERROR || am
2480: 74 20 3e 20 28 69 6e 74 29 77 72 6f 74 65 20 29  t > (int)wrote )
2490: 20 3f 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 3a   ? SQLITE_FULL :
24a0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
24b0: 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 72 65  *.** Move the re
24c0: 61 64 2f 77 72 69 74 65 20 70 6f 69 6e 74 65 72  ad/write pointer
24d0: 20 69 6e 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 69   in a file..*/.i
24e0: 6e 74 20 6f 73 32 53 65 65 6b 28 20 4f 73 46 69  nt os2Seek( OsFi
24f0: 6c 65 20 2a 69 64 2c 20 69 36 34 20 6f 66 66 73  le *id, i64 offs
2500: 65 74 20 29 7b 0a 20 20 41 50 49 52 45 54 20 72  et ){.  APIRET r
2510: 63 20 3d 20 4e 4f 5f 45 52 52 4f 52 3b 0a 20 20  c = NO_ERROR;.  
2520: 55 4c 4f 4e 47 20 66 69 6c 65 50 6f 69 6e 74 65  ULONG filePointe
2530: 72 20 3d 20 30 4c 3b 0a 20 20 61 73 73 65 72 74  r = 0L;.  assert
2540: 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 72 63 20  ( id!=0 );.  rc 
2550: 3d 20 44 6f 73 53 65 74 46 69 6c 65 50 74 72 28  = DosSetFilePtr(
2560: 20 28 28 6f 73 32 46 69 6c 65 2a 29 69 64 29 2d   ((os2File*)id)-
2570: 3e 68 2c 20 6f 66 66 73 65 74 2c 20 46 49 4c 45  >h, offset, FILE
2580: 5f 42 45 47 49 4e 2c 20 26 66 69 6c 65 50 6f 69  _BEGIN, &filePoi
2590: 6e 74 65 72 20 29 3b 0a 20 20 4f 53 54 52 41 43  nter );.  OSTRAC
25a0: 45 33 28 20 22 53 45 45 4b 20 25 64 20 25 6c 6c  E3( "SEEK %d %ll
25b0: 64 5c 6e 22 2c 20 28 28 6f 73 32 46 69 6c 65 2a  d\n", ((os2File*
25c0: 29 69 64 29 2d 3e 68 2c 20 6f 66 66 73 65 74 20  )id)->h, offset 
25d0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 20 3d  );.  return rc =
25e0: 3d 20 4e 4f 5f 45 52 52 4f 52 20 3f 20 53 51 4c  = NO_ERROR ? SQL
25f0: 49 54 45 5f 4f 4b 20 3a 20 53 51 4c 49 54 45 5f  ITE_OK : SQLITE_
2600: 49 4f 45 52 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  IOERR;.}../*.** 
2610: 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 77 72  Make sure all wr
2620: 69 74 65 73 20 74 6f 20 61 20 70 61 72 74 69 63  ites to a partic
2630: 75 6c 61 72 20 66 69 6c 65 20 61 72 65 20 63 6f  ular file are co
2640: 6d 6d 69 74 74 65 64 20 74 6f 20 64 69 73 6b 2e  mmitted to disk.
2650: 0a 2a 2f 0a 69 6e 74 20 6f 73 32 53 79 6e 63 28  .*/.int os2Sync(
2660: 20 4f 73 46 69 6c 65 20 2a 69 64 2c 20 69 6e 74   OsFile *id, int
2670: 20 64 61 74 61 4f 6e 6c 79 20 29 7b 0a 20 20 61   dataOnly ){.  a
2680: 73 73 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a  ssert( id!=0 );.
2690: 20 20 4f 53 54 52 41 43 45 33 28 20 22 53 59 4e    OSTRACE3( "SYN
26a0: 43 20 25 64 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c  C %d lock=%d\n",
26b0: 20 28 28 6f 73 32 46 69 6c 65 2a 29 69 64 29 2d   ((os2File*)id)-
26c0: 3e 68 2c 20 28 28 6f 73 32 46 69 6c 65 2a 29 69  >h, ((os2File*)i
26d0: 64 29 2d 3e 6c 6f 63 6b 74 79 70 65 20 29 3b 0a  d)->locktype );.
26e0: 20 20 72 65 74 75 72 6e 20 44 6f 73 52 65 73 65    return DosRese
26f0: 74 42 75 66 66 65 72 28 20 28 28 6f 73 32 46 69  tBuffer( ((os2Fi
2700: 6c 65 2a 29 69 64 29 2d 3e 68 20 29 20 3d 3d 20  le*)id)->h ) == 
2710: 4e 4f 5f 45 52 52 4f 52 20 3f 20 53 51 4c 49 54  NO_ERROR ? SQLIT
2720: 45 5f 4f 4b 20 3a 20 53 51 4c 49 54 45 5f 49 4f  E_OK : SQLITE_IO
2730: 45 52 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79  ERR;.}../*.** Sy
2740: 6e 63 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  nc the directory
2750: 20 7a 44 69 72 6e 61 6d 65 2e 20 54 68 69 73 20   zDirname. This 
2760: 69 73 20 61 20 6e 6f 2d 6f 70 20 6f 6e 20 6f 70  is a no-op on op
2770: 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 73 20  erating systems 
2780: 6f 74 68 65 72 0a 2a 2a 20 74 68 61 6e 20 55 4e  other.** than UN
2790: 49 58 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  IX..*/.int sqlit
27a0: 65 33 4f 73 32 53 79 6e 63 44 69 72 65 63 74 6f  e3Os2SyncDirecto
27b0: 72 79 28 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ry( const char *
27c0: 7a 44 69 72 6e 61 6d 65 20 29 7b 0a 20 20 53 69  zDirname ){.  Si
27d0: 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
27e0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
27f0: 52 52 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  RR );.  return S
2800: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
2810: 2a 2a 20 54 72 75 6e 63 61 74 65 20 61 6e 20 6f  ** Truncate an o
2820: 70 65 6e 20 66 69 6c 65 20 74 6f 20 61 20 73 70  pen file to a sp
2830: 65 63 69 66 69 65 64 20 73 69 7a 65 0a 2a 2f 0a  ecified size.*/.
2840: 69 6e 74 20 6f 73 32 54 72 75 6e 63 61 74 65 28  int os2Truncate(
2850: 20 4f 73 46 69 6c 65 20 2a 69 64 2c 20 69 36 34   OsFile *id, i64
2860: 20 6e 42 79 74 65 20 29 7b 0a 20 20 41 50 49 52   nByte ){.  APIR
2870: 45 54 20 72 63 20 3d 20 4e 4f 5f 45 52 52 4f 52  ET rc = NO_ERROR
2880: 3b 0a 20 20 55 4c 4f 4e 47 20 75 70 70 65 72 42  ;.  ULONG upperB
2890: 69 74 73 20 3d 20 6e 42 79 74 65 3e 3e 33 32 3b  its = nByte>>32;
28a0: 0a 20 20 61 73 73 65 72 74 28 20 69 64 21 3d 30  .  assert( id!=0
28b0: 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 33 28 20   );.  OSTRACE3( 
28c0: 22 54 52 55 4e 43 41 54 45 20 25 64 20 25 6c 6c  "TRUNCATE %d %ll
28d0: 64 5c 6e 22 2c 20 28 28 6f 73 32 46 69 6c 65 2a  d\n", ((os2File*
28e0: 29 69 64 29 2d 3e 68 2c 20 6e 42 79 74 65 20 29  )id)->h, nByte )
28f0: 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
2900: 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
2910: 54 45 5f 49 4f 45 52 52 20 29 3b 0a 20 20 72 63  TE_IOERR );.  rc
2920: 20 3d 20 44 6f 73 53 65 74 46 69 6c 65 50 74 72   = DosSetFilePtr
2930: 28 20 28 28 6f 73 32 46 69 6c 65 2a 29 69 64 29  ( ((os2File*)id)
2940: 2d 3e 68 2c 20 6e 42 79 74 65 2c 20 46 49 4c 45  ->h, nByte, FILE
2950: 5f 42 45 47 49 4e 2c 20 26 75 70 70 65 72 42 69  _BEGIN, &upperBi
2960: 74 73 20 29 3b 0a 20 20 69 66 28 20 72 63 20 21  ts );.  if( rc !
2970: 3d 20 4e 4f 5f 45 52 52 4f 52 20 29 7b 0a 20 20  = NO_ERROR ){.  
2980: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2990: 49 4f 45 52 52 3b 0a 20 20 7d 0a 20 20 72 63 20  IOERR;.  }.  rc 
29a0: 3d 20 44 6f 73 53 65 74 46 69 6c 65 50 74 72 28  = DosSetFilePtr(
29b0: 20 28 28 6f 73 32 46 69 6c 65 2a 29 69 64 29 2d   ((os2File*)id)-
29c0: 3e 68 2c 20 30 4c 2c 20 46 49 4c 45 5f 45 4e 44  >h, 0L, FILE_END
29d0: 2c 20 26 75 70 70 65 72 42 69 74 73 20 29 3b 0a  , &upperBits );.
29e0: 20 20 72 65 74 75 72 6e 20 72 63 20 3d 3d 20 4e    return rc == N
29f0: 4f 5f 45 52 52 4f 52 20 3f 20 53 51 4c 49 54 45  O_ERROR ? SQLITE
2a00: 5f 4f 4b 20 3a 20 53 51 4c 49 54 45 5f 49 4f 45  _OK : SQLITE_IOE
2a10: 52 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74  RR;.}../*.** Det
2a20: 65 72 6d 69 6e 65 20 74 68 65 20 63 75 72 72 65  ermine the curre
2a30: 6e 74 20 73 69 7a 65 20 6f 66 20 61 20 66 69 6c  nt size of a fil
2a40: 65 20 69 6e 20 62 79 74 65 73 0a 2a 2f 0a 69 6e  e in bytes.*/.in
2a50: 74 20 6f 73 32 46 69 6c 65 53 69 7a 65 28 20 4f  t os2FileSize( O
2a60: 73 46 69 6c 65 20 2a 69 64 2c 20 69 36 34 20 2a  sFile *id, i64 *
2a70: 70 53 69 7a 65 20 29 7b 0a 20 20 41 50 49 52 45  pSize ){.  APIRE
2a80: 54 20 72 63 20 3d 20 4e 4f 5f 45 52 52 4f 52 3b  T rc = NO_ERROR;
2a90: 0a 20 20 46 49 4c 45 53 54 41 54 55 53 33 20 66  .  FILESTATUS3 f
2aa0: 73 74 73 33 46 69 6c 65 49 6e 66 6f 3b 0a 20 20  sts3FileInfo;.  
2ab0: 6d 65 6d 73 65 74 28 26 66 73 74 73 33 46 69 6c  memset(&fsts3Fil
2ac0: 65 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66  eInfo, 0, sizeof
2ad0: 28 66 73 74 73 33 46 69 6c 65 49 6e 66 6f 29 29  (fsts3FileInfo))
2ae0: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 21 3d  ;.  assert( id!=
2af0: 30 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49  0 );.  SimulateI
2b00: 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  OError( return S
2b10: 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 3b 0a 20  QLITE_IOERR );. 
2b20: 20 72 63 20 3d 20 44 6f 73 51 75 65 72 79 46 69   rc = DosQueryFi
2b30: 6c 65 49 6e 66 6f 28 20 28 28 6f 73 32 46 69 6c  leInfo( ((os2Fil
2b40: 65 2a 29 69 64 29 2d 3e 68 2c 20 46 49 4c 5f 53  e*)id)->h, FIL_S
2b50: 54 41 4e 44 41 52 44 2c 20 26 66 73 74 73 33 46  TANDARD, &fsts3F
2b60: 69 6c 65 49 6e 66 6f 2c 20 73 69 7a 65 6f 66 28  ileInfo, sizeof(
2b70: 46 49 4c 45 53 54 41 54 55 53 33 29 20 29 3b 0a  FILESTATUS3) );.
2b80: 20 20 69 66 28 20 72 63 20 3d 3d 20 4e 4f 5f 45    if( rc == NO_E
2b90: 52 52 4f 52 20 29 7b 0a 20 20 20 20 2a 70 53 69  RROR ){.    *pSi
2ba0: 7a 65 20 3d 20 66 73 74 73 33 46 69 6c 65 49 6e  ze = fsts3FileIn
2bb0: 66 6f 2e 63 62 46 69 6c 65 3b 0a 20 20 20 20 72  fo.cbFile;.    r
2bc0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2bd0: 0a 20 20 7d 0a 20 20 65 6c 73 65 7b 0a 20 20 20  .  }.  else{.   
2be0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
2bf0: 4f 45 52 52 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  OERR;.  }.}../*.
2c00: 2a 2a 20 41 63 71 75 69 72 65 20 61 20 72 65 61  ** Acquire a rea
2c10: 64 65 72 20 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61  der lock..*/.sta
2c20: 74 69 63 20 69 6e 74 20 67 65 74 52 65 61 64 4c  tic int getReadL
2c30: 6f 63 6b 28 20 6f 73 32 46 69 6c 65 20 2a 69 64  ock( os2File *id
2c40: 20 29 7b 0a 20 20 46 49 4c 45 4c 4f 43 4b 20 20   ){.  FILELOCK  
2c50: 4c 6f 63 6b 41 72 65 61 2c 0a 20 20 20 20 20 20  LockArea,.      
2c60: 20 20 20 20 20 20 55 6e 6c 6f 63 6b 41 72 65 61        UnlockArea
2c70: 3b 0a 20 20 6d 65 6d 73 65 74 28 26 4c 6f 63 6b  ;.  memset(&Lock
2c80: 41 72 65 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Area, 0, sizeof(
2c90: 4c 6f 63 6b 41 72 65 61 29 29 3b 0a 20 20 6d 65  LockArea));.  me
2ca0: 6d 73 65 74 28 26 55 6e 6c 6f 63 6b 41 72 65 61  mset(&UnlockArea
2cb0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 55 6e 6c 6f  , 0, sizeof(Unlo
2cc0: 63 6b 41 72 65 61 29 29 3b 0a 20 20 4c 6f 63 6b  ckArea));.  Lock
2cd0: 41 72 65 61 2e 6c 4f 66 66 73 65 74 20 3d 20 53  Area.lOffset = S
2ce0: 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 4c  HARED_FIRST;.  L
2cf0: 6f 63 6b 41 72 65 61 2e 6c 52 61 6e 67 65 20 3d  ockArea.lRange =
2d00: 20 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20   SHARED_SIZE;.  
2d10: 55 6e 6c 6f 63 6b 41 72 65 61 2e 6c 4f 66 66 73  UnlockArea.lOffs
2d20: 65 74 20 3d 20 30 4c 3b 0a 20 20 55 6e 6c 6f 63  et = 0L;.  Unloc
2d30: 6b 41 72 65 61 2e 6c 52 61 6e 67 65 20 3d 20 30  kArea.lRange = 0
2d40: 4c 3b 0a 20 20 72 65 74 75 72 6e 20 44 6f 73 53  L;.  return DosS
2d50: 65 74 46 69 6c 65 4c 6f 63 6b 73 28 20 69 64 2d  etFileLocks( id-
2d60: 3e 68 2c 20 26 55 6e 6c 6f 63 6b 41 72 65 61 2c  >h, &UnlockArea,
2d70: 20 26 4c 6f 63 6b 41 72 65 61 2c 20 32 30 30 30   &LockArea, 2000
2d80: 4c 2c 20 31 4c 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  L, 1L );.}../*.*
2d90: 2a 20 55 6e 64 6f 20 61 20 72 65 61 64 6c 6f 63  * Undo a readloc
2da0: 6b 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  k.*/.static int 
2db0: 75 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63 6b 28 20  unlockReadLock( 
2dc0: 6f 73 32 46 69 6c 65 20 2a 69 64 20 29 7b 0a 20  os2File *id ){. 
2dd0: 20 46 49 4c 45 4c 4f 43 4b 20 20 4c 6f 63 6b 41   FILELOCK  LockA
2de0: 72 65 61 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rea,.           
2df0: 20 55 6e 6c 6f 63 6b 41 72 65 61 3b 0a 20 20 6d   UnlockArea;.  m
2e00: 65 6d 73 65 74 28 26 4c 6f 63 6b 41 72 65 61 2c  emset(&LockArea,
2e10: 20 30 2c 20 73 69 7a 65 6f 66 28 4c 6f 63 6b 41   0, sizeof(LockA
2e20: 72 65 61 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28  rea));.  memset(
2e30: 26 55 6e 6c 6f 63 6b 41 72 65 61 2c 20 30 2c 20  &UnlockArea, 0, 
2e40: 73 69 7a 65 6f 66 28 55 6e 6c 6f 63 6b 41 72 65  sizeof(UnlockAre
2e50: 61 29 29 3b 0a 20 20 4c 6f 63 6b 41 72 65 61 2e  a));.  LockArea.
2e60: 6c 4f 66 66 73 65 74 20 3d 20 30 4c 3b 0a 20 20  lOffset = 0L;.  
2e70: 4c 6f 63 6b 41 72 65 61 2e 6c 52 61 6e 67 65 20  LockArea.lRange 
2e80: 3d 20 30 4c 3b 0a 20 20 55 6e 6c 6f 63 6b 41 72  = 0L;.  UnlockAr
2e90: 65 61 2e 6c 4f 66 66 73 65 74 20 3d 20 53 48 41  ea.lOffset = SHA
2ea0: 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 55 6e 6c  RED_FIRST;.  Unl
2eb0: 6f 63 6b 41 72 65 61 2e 6c 52 61 6e 67 65 20 3d  ockArea.lRange =
2ec0: 20 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20   SHARED_SIZE;.  
2ed0: 72 65 74 75 72 6e 20 44 6f 73 53 65 74 46 69 6c  return DosSetFil
2ee0: 65 4c 6f 63 6b 73 28 20 69 64 2d 3e 68 2c 20 26  eLocks( id->h, &
2ef0: 55 6e 6c 6f 63 6b 41 72 65 61 2c 20 26 4c 6f 63  UnlockArea, &Loc
2f00: 6b 41 72 65 61 2c 20 32 30 30 30 4c 2c 20 31 4c  kArea, 2000L, 1L
2f10: 20 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53   );.}..#ifndef S
2f20: 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52  QLITE_OMIT_PAGER
2f30: 5f 50 52 41 47 4d 41 53 0a 2f 2a 0a 2a 2a 20 43  _PRAGMAS./*.** C
2f40: 68 65 63 6b 20 74 68 61 74 20 61 20 67 69 76 65  heck that a give
2f50: 6e 20 70 61 74 68 6e 61 6d 65 20 69 73 20 61 20  n pathname is a 
2f60: 64 69 72 65 63 74 6f 72 79 20 61 6e 64 20 69 73  directory and is
2f70: 20 77 72 69 74 61 62 6c 65 0a 2a 2a 0a 2a 2f 0a   writable.**.*/.
2f80: 69 6e 74 20 73 71 6c 69 74 65 33 4f 73 32 49 73  int sqlite3Os2Is
2f90: 44 69 72 57 72 69 74 61 62 6c 65 28 20 63 68 61  DirWritable( cha
2fa0: 72 20 2a 7a 44 69 72 6e 61 6d 65 20 29 7b 0a 20  r *zDirname ){. 
2fb0: 20 46 49 4c 45 53 54 41 54 55 53 33 20 66 73 74   FILESTATUS3 fst
2fc0: 73 33 43 6f 6e 66 69 67 49 6e 66 6f 3b 0a 20 20  s3ConfigInfo;.  
2fd0: 41 50 49 52 45 54 20 72 63 20 3d 20 4e 4f 5f 45  APIRET rc = NO_E
2fe0: 52 52 4f 52 3b 0a 20 20 6d 65 6d 73 65 74 28 26  RROR;.  memset(&
2ff0: 66 73 74 73 33 43 6f 6e 66 69 67 49 6e 66 6f 2c  fsts3ConfigInfo,
3000: 20 30 2c 20 73 69 7a 65 6f 66 28 66 73 74 73 33   0, sizeof(fsts3
3010: 43 6f 6e 66 69 67 49 6e 66 6f 29 29 3b 0a 20 20  ConfigInfo));.  
3020: 69 66 28 20 7a 44 69 72 6e 61 6d 65 3d 3d 30 20  if( zDirname==0 
3030: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
3040: 28 20 73 74 72 6c 65 6e 28 7a 44 69 72 6e 61 6d  ( strlen(zDirnam
3050: 65 29 3e 43 43 48 4d 41 58 50 41 54 48 20 29 20  e)>CCHMAXPATH ) 
3060: 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 63 20 3d  return 0;.  rc =
3070: 20 44 6f 73 51 75 65 72 79 50 61 74 68 49 6e 66   DosQueryPathInf
3080: 6f 28 20 28 50 53 5a 29 7a 44 69 72 6e 61 6d 65  o( (PSZ)zDirname
3090: 2c 20 46 49 4c 5f 53 54 41 4e 44 41 52 44 2c 20  , FIL_STANDARD, 
30a0: 26 66 73 74 73 33 43 6f 6e 66 69 67 49 6e 66 6f  &fsts3ConfigInfo
30b0: 2c 20 73 69 7a 65 6f 66 28 46 49 4c 45 53 54 41  , sizeof(FILESTA
30c0: 54 55 53 33 29 20 29 3b 0a 20 20 69 66 28 20 72  TUS3) );.  if( r
30d0: 63 20 21 3d 20 4e 4f 5f 45 52 52 4f 52 20 29 20  c != NO_ERROR ) 
30e0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
30f0: 28 66 73 74 73 33 43 6f 6e 66 69 67 49 6e 66 6f  (fsts3ConfigInfo
3100: 2e 61 74 74 72 46 69 6c 65 20 26 20 46 49 4c 45  .attrFile & FILE
3110: 5f 44 49 52 45 43 54 4f 52 59 29 20 21 3d 20 46  _DIRECTORY) != F
3120: 49 4c 45 5f 44 49 52 45 43 54 4f 52 59 20 29 20  ILE_DIRECTORY ) 
3130: 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 72 65 74  return 0;..  ret
3140: 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn 1;.}.#endif 
3150: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50  /* SQLITE_OMIT_P
3160: 41 47 45 52 5f 50 52 41 47 4d 41 53 20 2a 2f 0a  AGER_PRAGMAS */.
3170: 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20  ./*.** Lock the 
3180: 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f  file with the lo
3190: 63 6b 20 73 70 65 63 69 66 69 65 64 20 62 79 20  ck specified by 
31a0: 70 61 72 61 6d 65 74 65 72 20 6c 6f 63 6b 74 79  parameter lockty
31b0: 70 65 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74  pe - one.** of t
31c0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
31d0: 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52  .**     (1) SHAR
31e0: 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  ED_LOCK.**     (
31f0: 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  2) RESERVED_LOCK
3200: 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44  .**     (3) PEND
3210: 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  ING_LOCK.**     
3220: 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  (4) EXCLUSIVE_LO
3230: 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d  CK.**.** Sometim
3240: 65 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69  es when requesti
3250: 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74  ng one lock stat
3260: 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f  e, additional lo
3270: 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65  ck states.** are
3280: 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74   inserted in bet
3290: 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69  ween.  The locki
32a0: 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e  ng might fail on
32b0: 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65   one of the late
32c0: 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73  r.** transitions
32d0: 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63   leaving the loc
32e0: 6b 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e  k state differen
32f0: 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73  t from what it s
3300: 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74  tarted but.** st
3310: 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73  ill short of its
3320: 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c   goal.  The foll
3330: 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77  owing chart show
3340: 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a  s the allowed.**
3350: 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64   transitions and
3360: 20 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e   the inserted in
3370: 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65  termediate state
3380: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f  s:.**.**    UNLO
3390: 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a  CKED -> SHARED.*
33a0: 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52  *    SHARED -> R
33b0: 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48  ESERVED.**    SH
33c0: 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47  ARED -> (PENDING
33d0: 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  ) -> EXCLUSIVE.*
33e0: 2a 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e  *    RESERVED ->
33f0: 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58   (PENDING) -> EX
3400: 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45  CLUSIVE.**    PE
3410: 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49  NDING -> EXCLUSI
3420: 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  VE.**.** This ro
3430: 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20  utine will only 
3440: 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e  increase a lock.
3450: 20 20 54 68 65 20 6f 73 32 55 6e 6c 6f 63 6b 28    The os2Unlock(
3460: 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 65 72 61  ) routine.** era
3470: 73 65 73 20 61 6c 6c 20 6c 6f 63 6b 73 20 61 74  ses all locks at
3480: 20 6f 6e 63 65 20 61 6e 64 20 72 65 74 75 72 6e   once and return
3490: 73 20 75 73 20 69 6d 6d 65 64 69 61 74 65 6c 79  s us immediately
34a0: 20 74 6f 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65   to locking leve
34b0: 6c 20 30 2e 0a 2a 2a 20 49 74 20 69 73 20 6e 6f  l 0..** It is no
34c0: 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 6c 6f  t possible to lo
34d0: 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  wer the locking 
34e0: 6c 65 76 65 6c 20 6f 6e 65 20 73 74 65 70 20 61  level one step a
34f0: 74 20 61 20 74 69 6d 65 2e 20 20 59 6f 75 0a 2a  t a time.  You.*
3500: 2a 20 6d 75 73 74 20 67 6f 20 73 74 72 61 69 67  * must go straig
3510: 68 74 20 74 6f 20 6c 6f 63 6b 69 6e 67 20 6c 65  ht to locking le
3520: 76 65 6c 20 30 2e 0a 2a 2f 0a 69 6e 74 20 6f 73  vel 0..*/.int os
3530: 32 4c 6f 63 6b 28 20 4f 73 46 69 6c 65 20 2a 69  2Lock( OsFile *i
3540: 64 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 20  d, int locktype 
3550: 29 7b 0a 20 20 41 50 49 52 45 54 20 72 63 20 3d  ){.  APIRET rc =
3560: 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 2f   SQLITE_OK;    /
3570: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66 72  * Return code fr
3580: 6f 6d 20 73 75 62 72 6f 75 74 69 6e 65 73 20 2a  om subroutines *
3590: 2f 0a 20 20 41 50 49 52 45 54 20 72 65 73 20 3d  /.  APIRET res =
35a0: 20 4e 4f 5f 45 52 52 4f 52 3b 20 20 20 20 2f 2a   NO_ERROR;    /*
35b0: 20 52 65 73 75 6c 74 20 6f 66 20 61 6e 20 4f 53   Result of an OS
35c0: 2f 32 20 6c 6f 63 6b 20 63 61 6c 6c 20 2a 2f 0a  /2 lock call */.
35d0: 20 20 69 6e 74 20 6e 65 77 4c 6f 63 6b 74 79 70    int newLocktyp
35e0: 65 3b 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20  e;       /* Set 
35f0: 69 64 2d 3e 6c 6f 63 6b 74 79 70 65 20 74 6f 20  id->locktype to 
3600: 74 68 69 73 20 76 61 6c 75 65 20 62 65 66 6f 72  this value befor
3610: 65 20 65 78 69 74 69 6e 67 20 2a 2f 0a 20 20 69  e exiting */.  i
3620: 6e 74 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63  nt gotPendingLoc
3630: 6b 20 3d 20 30 3b 2f 2a 20 54 72 75 65 20 69 66  k = 0;/* True if
3640: 20 77 65 20 61 63 71 75 69 72 65 64 20 61 20 50   we acquired a P
3650: 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 74 68 69 73  ENDING lock this
3660: 20 74 69 6d 65 20 2a 2f 0a 20 20 46 49 4c 45 4c   time */.  FILEL
3670: 4f 43 4b 20 20 4c 6f 63 6b 41 72 65 61 2c 0a 20  OCK  LockArea,. 
3680: 20 20 20 20 20 20 20 20 20 20 20 55 6e 6c 6f 63             Unloc
3690: 6b 41 72 65 61 3b 0a 20 20 6f 73 32 46 69 6c 65  kArea;.  os2File
36a0: 20 2a 70 46 69 6c 65 20 3d 20 28 6f 73 32 46 69   *pFile = (os2Fi
36b0: 6c 65 2a 29 69 64 3b 0a 20 20 6d 65 6d 73 65 74  le*)id;.  memset
36c0: 28 26 4c 6f 63 6b 41 72 65 61 2c 20 30 2c 20 73  (&LockArea, 0, s
36d0: 69 7a 65 6f 66 28 4c 6f 63 6b 41 72 65 61 29 29  izeof(LockArea))
36e0: 3b 0a 20 20 6d 65 6d 73 65 74 28 26 55 6e 6c 6f  ;.  memset(&Unlo
36f0: 63 6b 41 72 65 61 2c 20 30 2c 20 73 69 7a 65 6f  ckArea, 0, sizeo
3700: 66 28 55 6e 6c 6f 63 6b 41 72 65 61 29 29 3b 0a  f(UnlockArea));.
3710: 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 21    assert( pFile!
3720: 3d 30 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 34  =0 );.  OSTRACE4
3730: 28 20 22 4c 4f 43 4b 20 25 64 20 25 64 20 77 61  ( "LOCK %d %d wa
3740: 73 20 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  s %d\n", pFile->
3750: 68 2c 20 6c 6f 63 6b 74 79 70 65 2c 20 70 46 69  h, locktype, pFi
3760: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 29 3b 0a  le->locktype );.
3770: 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69  .  /* If there i
3780: 73 20 61 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b  s already a lock
3790: 20 6f 66 20 74 68 69 73 20 74 79 70 65 20 6f 72   of this type or
37a0: 20 6d 6f 72 65 20 72 65 73 74 72 69 63 74 69 76   more restrictiv
37b0: 65 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 4f 73  e on the.  ** Os
37c0: 46 69 6c 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67  File, do nothing
37d0: 2e 20 44 6f 6e 27 74 20 75 73 65 20 74 68 65 20  . Don't use the 
37e0: 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70  end_lock: exit p
37f0: 61 74 68 2c 20 61 73 0a 20 20 2a 2a 20 73 71 6c  ath, as.  ** sql
3800: 69 74 65 33 4f 73 45 6e 74 65 72 4d 75 74 65 78  ite3OsEnterMutex
3810: 28 29 20 68 61 73 6e 27 74 20 62 65 65 6e 20 63  () hasn't been c
3820: 61 6c 6c 65 64 20 79 65 74 2e 0a 20 20 2a 2f 0a  alled yet..  */.
3830: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63    if( pFile->loc
3840: 6b 74 79 70 65 3e 3d 6c 6f 63 6b 74 79 70 65 20  ktype>=locktype 
3850: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
3860: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
3870: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
3880: 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65 6e 63   locking sequenc
3890: 65 20 69 73 20 63 6f 72 72 65 63 74 0a 20 20 2a  e is correct.  *
38a0: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  /.  assert( pFil
38b0: 65 2d 3e 6c 6f 63 6b 74 79 70 65 21 3d 4e 4f 5f  e->locktype!=NO_
38c0: 4c 4f 43 4b 20 7c 7c 20 6c 6f 63 6b 74 79 70 65  LOCK || locktype
38d0: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  ==SHARED_LOCK );
38e0: 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74  .  assert( lockt
38f0: 79 70 65 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43  ype!=PENDING_LOC
3900: 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6c  K );.  assert( l
3910: 6f 63 6b 74 79 70 65 21 3d 52 45 53 45 52 56 45  ocktype!=RESERVE
3920: 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d  D_LOCK || pFile-
3930: 3e 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45  >locktype==SHARE
3940: 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20  D_LOCK );..  /* 
3950: 4c 6f 63 6b 20 74 68 65 20 50 45 4e 44 49 4e 47  Lock the PENDING
3960: 5f 4c 4f 43 4b 20 62 79 74 65 20 69 66 20 77 65  _LOCK byte if we
3970: 20 6e 65 65 64 20 74 6f 20 61 63 71 75 69 72 65   need to acquire
3980: 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20   a PENDING lock 
3990: 6f 72 0a 20 20 2a 2a 20 61 20 53 48 41 52 45 44  or.  ** a SHARED
39a0: 20 6c 6f 63 6b 2e 20 20 49 66 20 77 65 20 61 72   lock.  If we ar
39b0: 65 20 61 63 71 75 69 72 69 6e 67 20 61 20 53 48  e acquiring a SH
39c0: 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 61  ARED lock, the a
39d0: 63 71 75 69 73 69 74 69 6f 6e 20 6f 66 0a 20 20  cquisition of.  
39e0: 2a 2a 20 74 68 65 20 50 45 4e 44 49 4e 47 5f 4c  ** the PENDING_L
39f0: 4f 43 4b 20 62 79 74 65 20 69 73 20 74 65 6d 70  OCK byte is temp
3a00: 6f 72 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 6e 65  orary..  */.  ne
3a10: 77 4c 6f 63 6b 74 79 70 65 20 3d 20 70 46 69 6c  wLocktype = pFil
3a20: 65 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 69  e->locktype;.  i
3a30: 66 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79  f( pFile->lockty
3a40: 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b 0a 20 20 20 7c  pe==NO_LOCK.   |
3a50: 7c 20 28 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43  | (locktype==EXC
3a60: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70  LUSIVE_LOCK && p
3a70: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d  File->locktype==
3a80: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 0a 20  RESERVED_LOCK). 
3a90: 20 29 7b 0a 20 20 20 20 69 6e 74 20 63 6e 74 20   ){.    int cnt 
3aa0: 3d 20 33 3b 0a 0a 20 20 20 20 4c 6f 63 6b 41 72  = 3;..    LockAr
3ab0: 65 61 2e 6c 4f 66 66 73 65 74 20 3d 20 50 45 4e  ea.lOffset = PEN
3ac0: 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20 4c  DING_BYTE;.    L
3ad0: 6f 63 6b 41 72 65 61 2e 6c 52 61 6e 67 65 20 3d  ockArea.lRange =
3ae0: 20 31 4c 3b 0a 20 20 20 20 55 6e 6c 6f 63 6b 41   1L;.    UnlockA
3af0: 72 65 61 2e 6c 4f 66 66 73 65 74 20 3d 20 30 4c  rea.lOffset = 0L
3b00: 3b 0a 20 20 20 20 55 6e 6c 6f 63 6b 41 72 65 61  ;.    UnlockArea
3b10: 2e 6c 52 61 6e 67 65 20 3d 20 30 4c 3b 0a 0a 20  .lRange = 0L;.. 
3b20: 20 20 20 77 68 69 6c 65 28 20 63 6e 74 2d 2d 3e     while( cnt-->
3b30: 30 20 26 26 20 28 72 65 73 20 3d 20 44 6f 73 53  0 && (res = DosS
3b40: 65 74 46 69 6c 65 4c 6f 63 6b 73 28 20 70 46 69  etFileLocks( pFi
3b50: 6c 65 2d 3e 68 2c 20 26 55 6e 6c 6f 63 6b 41 72  le->h, &UnlockAr
3b60: 65 61 2c 20 26 4c 6f 63 6b 41 72 65 61 2c 20 32  ea, &LockArea, 2
3b70: 30 30 30 4c 2c 20 31 4c 29 20 29 21 3d 4e 4f 5f  000L, 1L) )!=NO_
3b80: 45 52 52 4f 52 20 29 7b 0a 20 20 20 20 20 20 2f  ERROR ){.      /
3b90: 2a 20 54 72 79 20 33 20 74 69 6d 65 73 20 74 6f  * Try 3 times to
3ba0: 20 67 65 74 20 74 68 65 20 70 65 6e 64 69 6e 67   get the pending
3bb0: 20 6c 6f 63 6b 2e 20 20 54 68 65 20 70 65 6e 64   lock.  The pend
3bc0: 69 6e 67 20 6c 6f 63 6b 20 6d 69 67 68 74 20 62  ing lock might b
3bd0: 65 0a 20 20 20 20 20 20 2a 2a 20 68 65 6c 64 20  e.      ** held 
3be0: 62 79 20 61 6e 6f 74 68 65 72 20 72 65 61 64 65  by another reade
3bf0: 72 20 70 72 6f 63 65 73 73 20 77 68 6f 20 77 69  r process who wi
3c00: 6c 6c 20 72 65 6c 65 61 73 65 20 69 74 20 6d 6f  ll release it mo
3c10: 6d 65 6e 74 61 72 69 6c 79 2e 0a 20 20 20 20 20  mentarily..     
3c20: 20 2a 2f 0a 20 20 20 20 20 20 4f 53 54 52 41 43   */.      OSTRAC
3c30: 45 32 28 20 22 63 6f 75 6c 64 20 6e 6f 74 20 67  E2( "could not g
3c40: 65 74 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63  et a PENDING loc
3c50: 6b 2e 20 63 6e 74 3d 25 64 5c 6e 22 2c 20 63 6e  k. cnt=%d\n", cn
3c60: 74 20 29 3b 0a 20 20 20 20 20 20 44 6f 73 53 6c  t );.      DosSl
3c70: 65 65 70 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20  eep(1);.    }.  
3c80: 20 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b    gotPendingLock
3c90: 20 3d 20 72 65 73 3b 0a 20 20 7d 0a 0a 20 20 2f   = res;.  }..  /
3ca0: 2a 20 41 63 71 75 69 72 65 20 61 20 73 68 61 72  * Acquire a shar
3cb0: 65 64 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69  ed lock.  */.  i
3cc0: 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41  f( locktype==SHA
3cd0: 52 45 44 5f 4c 4f 43 4b 20 26 26 20 72 65 73 20  RED_LOCK && res 
3ce0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
3cf0: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d  File->locktype==
3d00: 4e 4f 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72  NO_LOCK );.    r
3d10: 65 73 20 3d 20 67 65 74 52 65 61 64 4c 6f 63 6b  es = getReadLock
3d20: 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 69 66 28  (pFile);.    if(
3d30: 20 72 65 73 20 3d 3d 20 4e 4f 5f 45 52 52 4f 52   res == NO_ERROR
3d40: 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c 6f 63   ){.      newLoc
3d50: 6b 74 79 70 65 20 3d 20 53 48 41 52 45 44 5f 4c  ktype = SHARED_L
3d60: 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  OCK;.    }.  }..
3d70: 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20 52    /* Acquire a R
3d80: 45 53 45 52 56 45 44 20 6c 6f 63 6b 0a 20 20 2a  ESERVED lock.  *
3d90: 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65  /.  if( locktype
3da0: 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  ==RESERVED_LOCK 
3db0: 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20 61 73  && res ){.    as
3dc0: 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f 63  sert( pFile->loc
3dd0: 6b 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f  ktype==SHARED_LO
3de0: 43 4b 20 29 3b 0a 20 20 20 20 4c 6f 63 6b 41 72  CK );.    LockAr
3df0: 65 61 2e 6c 4f 66 66 73 65 74 20 3d 20 52 45 53  ea.lOffset = RES
3e00: 45 52 56 45 44 5f 42 59 54 45 3b 0a 20 20 20 20  ERVED_BYTE;.    
3e10: 4c 6f 63 6b 41 72 65 61 2e 6c 52 61 6e 67 65 20  LockArea.lRange 
3e20: 3d 20 31 4c 3b 0a 20 20 20 20 55 6e 6c 6f 63 6b  = 1L;.    Unlock
3e30: 41 72 65 61 2e 6c 4f 66 66 73 65 74 20 3d 20 30  Area.lOffset = 0
3e40: 4c 3b 0a 20 20 20 20 55 6e 6c 6f 63 6b 41 72 65  L;.    UnlockAre
3e50: 61 2e 6c 52 61 6e 67 65 20 3d 20 30 4c 3b 0a 20  a.lRange = 0L;. 
3e60: 20 20 20 72 65 73 20 3d 20 44 6f 73 53 65 74 46     res = DosSetF
3e70: 69 6c 65 4c 6f 63 6b 73 28 20 70 46 69 6c 65 2d  ileLocks( pFile-
3e80: 3e 68 2c 20 26 55 6e 6c 6f 63 6b 41 72 65 61 2c  >h, &UnlockArea,
3e90: 20 26 4c 6f 63 6b 41 72 65 61 2c 20 32 30 30 30   &LockArea, 2000
3ea0: 4c 2c 20 31 4c 20 29 3b 0a 20 20 20 20 69 66 28  L, 1L );.    if(
3eb0: 20 72 65 73 20 3d 3d 20 4e 4f 5f 45 52 52 4f 52   res == NO_ERROR
3ec0: 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c 6f 63   ){.      newLoc
3ed0: 6b 74 79 70 65 20 3d 20 52 45 53 45 52 56 45 44  ktype = RESERVED
3ee0: 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  _LOCK;.    }.  }
3ef0: 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61  ..  /* Acquire a
3f00: 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 0a 20 20   PENDING lock.  
3f10: 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79 70  */.  if( locktyp
3f20: 65 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  e==EXCLUSIVE_LOC
3f30: 4b 20 26 26 20 72 65 73 20 29 7b 0a 20 20 20 20  K && res ){.    
3f40: 6e 65 77 4c 6f 63 6b 74 79 70 65 20 3d 20 50 45  newLocktype = PE
3f50: 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20  NDING_LOCK;.    
3f60: 67 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 3d  gotPendingLock =
3f70: 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63   0;.  }..  /* Ac
3f80: 71 75 69 72 65 20 61 6e 20 45 58 43 4c 55 53 49  quire an EXCLUSI
3f90: 56 45 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69  VE lock.  */.  i
3fa0: 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43  f( locktype==EXC
3fb0: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 72  LUSIVE_LOCK && r
3fc0: 65 73 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  es ){.    assert
3fd0: 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  ( pFile->locktyp
3fe0: 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  e>=SHARED_LOCK )
3ff0: 3b 0a 20 20 20 20 72 65 73 20 3d 20 75 6e 6c 6f  ;.    res = unlo
4000: 63 6b 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65  ckReadLock(pFile
4010: 29 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 32 28  );.    OSTRACE2(
4020: 20 22 75 6e 72 65 61 64 6c 6f 63 6b 20 3d 20 25   "unreadlock = %
4030: 64 5c 6e 22 2c 20 72 65 73 20 29 3b 0a 20 20 20  d\n", res );.   
4040: 20 4c 6f 63 6b 41 72 65 61 2e 6c 4f 66 66 73 65   LockArea.lOffse
4050: 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54  t = SHARED_FIRST
4060: 3b 0a 20 20 20 20 4c 6f 63 6b 41 72 65 61 2e 6c  ;.    LockArea.l
4070: 52 61 6e 67 65 20 3d 20 53 48 41 52 45 44 5f 53  Range = SHARED_S
4080: 49 5a 45 3b 0a 20 20 20 20 55 6e 6c 6f 63 6b 41  IZE;.    UnlockA
4090: 72 65 61 2e 6c 4f 66 66 73 65 74 20 3d 20 30 4c  rea.lOffset = 0L
40a0: 3b 0a 20 20 20 20 55 6e 6c 6f 63 6b 41 72 65 61  ;.    UnlockArea
40b0: 2e 6c 52 61 6e 67 65 20 3d 20 30 4c 3b 0a 20 20  .lRange = 0L;.  
40c0: 20 20 72 65 73 20 3d 20 44 6f 73 53 65 74 46 69    res = DosSetFi
40d0: 6c 65 4c 6f 63 6b 73 28 20 70 46 69 6c 65 2d 3e  leLocks( pFile->
40e0: 68 2c 20 26 55 6e 6c 6f 63 6b 41 72 65 61 2c 20  h, &UnlockArea, 
40f0: 26 4c 6f 63 6b 41 72 65 61 2c 20 32 30 30 30 4c  &LockArea, 2000L
4100: 2c 20 31 4c 20 29 3b 0a 20 20 20 20 69 66 28 20  , 1L );.    if( 
4110: 72 65 73 20 3d 3d 20 4e 4f 5f 45 52 52 4f 52 20  res == NO_ERROR 
4120: 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c 6f 63 6b  ){.      newLock
4130: 74 79 70 65 20 3d 20 45 58 43 4c 55 53 49 56 45  type = EXCLUSIVE
4140: 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65  _LOCK;.    }else
4150: 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 32  {.      OSTRACE2
4160: 28 20 22 65 72 72 6f 72 2d 63 6f 64 65 20 3d 20  ( "error-code = 
4170: 25 64 5c 6e 22 2c 20 72 65 73 20 29 3b 0a 20 20  %d\n", res );.  
4180: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
4190: 20 77 65 20 61 72 65 20 68 6f 6c 64 69 6e 67 20   we are holding 
41a0: 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 74  a PENDING lock t
41b0: 68 61 74 20 6f 75 67 68 74 20 74 6f 20 62 65 20  hat ought to be 
41c0: 72 65 6c 65 61 73 65 64 2c 20 74 68 65 6e 0a 20  released, then. 
41d0: 20 2a 2a 20 72 65 6c 65 61 73 65 20 69 74 20 6e   ** release it n
41e0: 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 67  ow..  */.  if( g
41f0: 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 26 26  otPendingLock &&
4200: 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45   locktype==SHARE
4210: 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 4c 6f  D_LOCK ){.    Lo
4220: 63 6b 41 72 65 61 2e 6c 4f 66 66 73 65 74 20 3d  ckArea.lOffset =
4230: 20 30 4c 3b 0a 20 20 20 20 4c 6f 63 6b 41 72 65   0L;.    LockAre
4240: 61 2e 6c 52 61 6e 67 65 20 3d 20 30 4c 3b 0a 20  a.lRange = 0L;. 
4250: 20 20 20 55 6e 6c 6f 63 6b 41 72 65 61 2e 6c 4f     UnlockArea.lO
4260: 66 66 73 65 74 20 3d 20 50 45 4e 44 49 4e 47 5f  ffset = PENDING_
4270: 42 59 54 45 3b 0a 20 20 20 20 55 6e 6c 6f 63 6b  BYTE;.    Unlock
4280: 41 72 65 61 2e 6c 52 61 6e 67 65 20 3d 20 31 4c  Area.lRange = 1L
4290: 3b 0a 20 20 20 20 44 6f 73 53 65 74 46 69 6c 65  ;.    DosSetFile
42a0: 4c 6f 63 6b 73 28 20 70 46 69 6c 65 2d 3e 68 2c  Locks( pFile->h,
42b0: 20 26 55 6e 6c 6f 63 6b 41 72 65 61 2c 20 26 4c   &UnlockArea, &L
42c0: 6f 63 6b 41 72 65 61 2c 20 32 30 30 30 4c 2c 20  ockArea, 2000L, 
42d0: 31 4c 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  1L );.  }..  /* 
42e0: 55 70 64 61 74 65 20 74 68 65 20 73 74 61 74 65  Update the state
42f0: 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20 68 61 73   of the lock has
4300: 20 68 65 6c 64 20 69 6e 20 74 68 65 20 66 69 6c   held in the fil
4310: 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 68 65  e descriptor the
4320: 6e 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 74 68  n.  ** return th
4330: 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 72 65  e appropriate re
4340: 73 75 6c 74 20 63 6f 64 65 2e 0a 20 20 2a 2f 0a  sult code..  */.
4350: 20 20 69 66 28 20 72 65 73 20 3d 3d 20 4e 4f 5f    if( res == NO_
4360: 45 52 52 4f 52 20 29 7b 0a 20 20 20 20 72 63 20  ERROR ){.    rc 
4370: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  = SQLITE_OK;.  }
4380: 65 6c 73 65 7b 0a 20 20 20 20 4f 53 54 52 41 43  else{.    OSTRAC
4390: 45 34 28 20 22 4c 4f 43 4b 20 46 41 49 4c 45 44  E4( "LOCK FAILED
43a0: 20 25 64 20 74 72 79 69 6e 67 20 66 6f 72 20 25   %d trying for %
43b0: 64 20 62 75 74 20 67 6f 74 20 25 64 5c 6e 22 2c  d but got %d\n",
43c0: 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20   pFile->h,.     
43d0: 20 20 20 20 20 20 6c 6f 63 6b 74 79 70 65 2c 20        locktype, 
43e0: 6e 65 77 4c 6f 63 6b 74 79 70 65 20 29 3b 0a 20  newLocktype );. 
43f0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
4400: 55 53 59 3b 0a 20 20 7d 0a 20 20 70 46 69 6c 65  USY;.  }.  pFile
4410: 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6e 65 77  ->locktype = new
4420: 4c 6f 63 6b 74 79 70 65 3b 0a 20 20 72 65 74 75  Locktype;.  retu
4430: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
4440: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65  This routine che
4450: 63 6b 73 20 69 66 20 74 68 65 72 65 20 69 73 20  cks if there is 
4460: 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
4470: 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63  held on the spec
4480: 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79  ified.** file by
4490: 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68   this or any oth
44a0: 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73  er process. If s
44b0: 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65  uch a lock is he
44c0: 6c 64 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 6e 6f  ld, return.** no
44d0: 6e 2d 7a 65 72 6f 2c 20 6f 74 68 65 72 77 69 73  n-zero, otherwis
44e0: 65 20 7a 65 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 6f  e zero..*/.int o
44f0: 73 32 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  s2CheckReservedL
4500: 6f 63 6b 28 20 4f 73 46 69 6c 65 20 2a 69 64 20  ock( OsFile *id 
4510: 29 7b 0a 20 20 41 50 49 52 45 54 20 72 63 20 3d  ){.  APIRET rc =
4520: 20 4e 4f 5f 45 52 52 4f 52 3b 0a 20 20 6f 73 32   NO_ERROR;.  os2
4530: 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 6f  File *pFile = (o
4540: 73 32 46 69 6c 65 2a 29 69 64 3b 0a 20 20 61 73  s2File*)id;.  as
4550: 73 65 72 74 28 20 70 46 69 6c 65 21 3d 30 20 29  sert( pFile!=0 )
4560: 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c  ;.  if( pFile->l
4570: 6f 63 6b 74 79 70 65 3e 3d 52 45 53 45 52 56 45  ocktype>=RESERVE
4580: 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 63  D_LOCK ){.    rc
4590: 20 3d 20 31 3b 0a 20 20 20 20 4f 53 54 52 41 43   = 1;.    OSTRAC
45a0: 45 33 28 20 22 54 45 53 54 20 57 52 2d 4c 4f 43  E3( "TEST WR-LOC
45b0: 4b 20 25 64 20 25 64 20 28 6c 6f 63 61 6c 29 5c  K %d %d (local)\
45c0: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63  n", pFile->h, rc
45d0: 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
45e0: 20 46 49 4c 45 4c 4f 43 4b 20 20 4c 6f 63 6b 41   FILELOCK  LockA
45f0: 72 65 61 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rea,.           
4600: 20 20 20 55 6e 6c 6f 63 6b 41 72 65 61 3b 0a 20     UnlockArea;. 
4610: 20 20 20 6d 65 6d 73 65 74 28 26 4c 6f 63 6b 41     memset(&LockA
4620: 72 65 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4c  rea, 0, sizeof(L
4630: 6f 63 6b 41 72 65 61 29 29 3b 0a 20 20 20 20 6d  ockArea));.    m
4640: 65 6d 73 65 74 28 26 55 6e 6c 6f 63 6b 41 72 65  emset(&UnlockAre
4650: 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28 55 6e 6c  a, 0, sizeof(Unl
4660: 6f 63 6b 41 72 65 61 29 29 3b 0a 20 20 20 20 4c  ockArea));.    L
4670: 6f 63 6b 41 72 65 61 2e 6c 4f 66 66 73 65 74 20  ockArea.lOffset 
4680: 3d 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 3b  = RESERVED_BYTE;
4690: 0a 20 20 20 20 4c 6f 63 6b 41 72 65 61 2e 6c 52  .    LockArea.lR
46a0: 61 6e 67 65 20 3d 20 31 4c 3b 0a 20 20 20 20 55  ange = 1L;.    U
46b0: 6e 6c 6f 63 6b 41 72 65 61 2e 6c 4f 66 66 73 65  nlockArea.lOffse
46c0: 74 20 3d 20 30 4c 3b 0a 20 20 20 20 55 6e 6c 6f  t = 0L;.    Unlo
46d0: 63 6b 41 72 65 61 2e 6c 52 61 6e 67 65 20 3d 20  ckArea.lRange = 
46e0: 30 4c 3b 0a 20 20 20 20 72 63 20 3d 20 44 6f 73  0L;.    rc = Dos
46f0: 53 65 74 46 69 6c 65 4c 6f 63 6b 73 28 20 70 46  SetFileLocks( pF
4700: 69 6c 65 2d 3e 68 2c 20 26 55 6e 6c 6f 63 6b 41  ile->h, &UnlockA
4710: 72 65 61 2c 20 26 4c 6f 63 6b 41 72 65 61 2c 20  rea, &LockArea, 
4720: 32 30 30 30 4c 2c 20 31 4c 20 29 3b 0a 20 20 20  2000L, 1L );.   
4730: 20 69 66 28 20 72 63 20 3d 3d 20 4e 4f 5f 45 52   if( rc == NO_ER
4740: 52 4f 52 20 29 7b 0a 20 20 20 20 20 20 4c 6f 63  ROR ){.      Loc
4750: 6b 41 72 65 61 2e 6c 4f 66 66 73 65 74 20 3d 20  kArea.lOffset = 
4760: 30 4c 3b 0a 20 20 20 20 20 20 4c 6f 63 6b 41 72  0L;.      LockAr
4770: 65 61 2e 6c 52 61 6e 67 65 20 3d 20 30 4c 3b 0a  ea.lRange = 0L;.
4780: 20 20 20 20 20 20 55 6e 6c 6f 63 6b 41 72 65 61        UnlockArea
4790: 2e 6c 4f 66 66 73 65 74 20 3d 20 52 45 53 45 52  .lOffset = RESER
47a0: 56 45 44 5f 42 59 54 45 3b 0a 20 20 20 20 20 20  VED_BYTE;.      
47b0: 55 6e 6c 6f 63 6b 41 72 65 61 2e 6c 52 61 6e 67  UnlockArea.lRang
47c0: 65 20 3d 20 31 4c 3b 0a 20 20 20 20 20 20 72 63  e = 1L;.      rc
47d0: 20 3d 20 44 6f 73 53 65 74 46 69 6c 65 4c 6f 63   = DosSetFileLoc
47e0: 6b 73 28 20 70 46 69 6c 65 2d 3e 68 2c 20 26 55  ks( pFile->h, &U
47f0: 6e 6c 6f 63 6b 41 72 65 61 2c 20 26 4c 6f 63 6b  nlockArea, &Lock
4800: 41 72 65 61 2c 20 32 30 30 30 4c 2c 20 31 4c 20  Area, 2000L, 1L 
4810: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 4f 53 54  );.    }.    OST
4820: 52 41 43 45 33 28 20 22 54 45 53 54 20 57 52 2d  RACE3( "TEST WR-
4830: 4c 4f 43 4b 20 25 64 20 25 64 20 28 72 65 6d 6f  LOCK %d %d (remo
4840: 74 65 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  te)\n", pFile->h
4850: 2c 20 72 63 20 29 3b 0a 20 20 7d 0a 20 20 72 65  , rc );.  }.  re
4860: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
4870: 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b  * Lower the lock
4880: 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c  ing level on fil
4890: 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 64 20  e descriptor id 
48a0: 74 6f 20 6c 6f 63 6b 74 79 70 65 2e 20 20 6c 6f  to locktype.  lo
48b0: 63 6b 74 79 70 65 0a 2a 2a 20 6d 75 73 74 20 62  cktype.** must b
48c0: 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b  e either NO_LOCK
48d0: 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e   or SHARED_LOCK.
48e0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f  .**.** If the lo
48f0: 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74  cking level of t
4900: 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
4910: 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74  or is already at
4920: 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65   or below.** the
4930: 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69   requested locki
4940: 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72  ng level, this r
4950: 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
4960: 70 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 6e  p..**.** It is n
4970: 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20  ot possible for 
4980: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 20  this routine to 
4990: 66 61 69 6c 20 69 66 20 74 68 65 20 73 65 63 6f  fail if the seco
49a0: 6e 64 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69  nd argument.** i
49b0: 73 20 4e 4f 5f 4c 4f 43 4b 2e 20 20 49 66 20 74  s NO_LOCK.  If t
49c0: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
49d0: 6e 74 20 69 73 20 53 48 41 52 45 44 5f 4c 4f 43  nt is SHARED_LOC
49e0: 4b 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  K then this rout
49f0: 69 6e 65 0a 2a 2a 20 6d 69 67 68 74 20 72 65 74  ine.** might ret
4a00: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
4a10: 3b 0a 2a 2f 0a 69 6e 74 20 6f 73 32 55 6e 6c 6f  ;.*/.int os2Unlo
4a20: 63 6b 28 20 4f 73 46 69 6c 65 20 2a 69 64 2c 20  ck( OsFile *id, 
4a30: 69 6e 74 20 6c 6f 63 6b 74 79 70 65 20 29 7b 0a  int locktype ){.
4a40: 20 20 69 6e 74 20 74 79 70 65 3b 0a 20 20 41 50    int type;.  AP
4a50: 49 52 45 54 20 72 63 20 3d 20 53 51 4c 49 54 45  IRET rc = SQLITE
4a60: 5f 4f 4b 3b 0a 20 20 6f 73 32 46 69 6c 65 20 2a  _OK;.  os2File *
4a70: 70 46 69 6c 65 20 3d 20 28 6f 73 32 46 69 6c 65  pFile = (os2File
4a80: 2a 29 69 64 3b 0a 20 20 46 49 4c 45 4c 4f 43 4b  *)id;.  FILELOCK
4a90: 20 20 4c 6f 63 6b 41 72 65 61 2c 0a 20 20 20 20    LockArea,.    
4aa0: 20 20 20 20 20 20 20 20 55 6e 6c 6f 63 6b 41 72          UnlockAr
4ab0: 65 61 3b 0a 20 20 6d 65 6d 73 65 74 28 26 4c 6f  ea;.  memset(&Lo
4ac0: 63 6b 41 72 65 61 2c 20 30 2c 20 73 69 7a 65 6f  ckArea, 0, sizeo
4ad0: 66 28 4c 6f 63 6b 41 72 65 61 29 29 3b 0a 20 20  f(LockArea));.  
4ae0: 6d 65 6d 73 65 74 28 26 55 6e 6c 6f 63 6b 41 72  memset(&UnlockAr
4af0: 65 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28 55 6e  ea, 0, sizeof(Un
4b00: 6c 6f 63 6b 41 72 65 61 29 29 3b 0a 20 20 61 73  lockArea));.  as
4b10: 73 65 72 74 28 20 70 46 69 6c 65 21 3d 30 20 29  sert( pFile!=0 )
4b20: 3b 0a 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b  ;.  assert( lock
4b30: 74 79 70 65 3c 3d 53 48 41 52 45 44 5f 4c 4f 43  type<=SHARED_LOC
4b40: 4b 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 34 28  K );.  OSTRACE4(
4b50: 20 22 55 4e 4c 4f 43 4b 20 25 64 20 74 6f 20 25   "UNLOCK %d to %
4b60: 64 20 77 61 73 20 25 64 5c 6e 22 2c 20 70 46 69  d was %d\n", pFi
4b70: 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 2c  le->h, locktype,
4b80: 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65   pFile->locktype
4b90: 20 29 3b 0a 20 20 74 79 70 65 20 3d 20 70 46 69   );.  type = pFi
4ba0: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20 20  le->locktype;.  
4bb0: 69 66 28 20 74 79 70 65 3e 3d 45 58 43 4c 55 53  if( type>=EXCLUS
4bc0: 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  IVE_LOCK ){.    
4bd0: 4c 6f 63 6b 41 72 65 61 2e 6c 4f 66 66 73 65 74  LockArea.lOffset
4be0: 20 3d 20 30 4c 3b 0a 20 20 20 20 4c 6f 63 6b 41   = 0L;.    LockA
4bf0: 72 65 61 2e 6c 52 61 6e 67 65 20 3d 20 30 4c 3b  rea.lRange = 0L;
4c00: 0a 20 20 20 20 55 6e 6c 6f 63 6b 41 72 65 61 2e  .    UnlockArea.
4c10: 6c 4f 66 66 73 65 74 20 3d 20 53 48 41 52 45 44  lOffset = SHARED
4c20: 5f 46 49 52 53 54 3b 0a 20 20 20 20 55 6e 6c 6f  _FIRST;.    Unlo
4c30: 63 6b 41 72 65 61 2e 6c 52 61 6e 67 65 20 3d 20  ckArea.lRange = 
4c40: 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20  SHARED_SIZE;.   
4c50: 20 44 6f 73 53 65 74 46 69 6c 65 4c 6f 63 6b 73   DosSetFileLocks
4c60: 28 20 70 46 69 6c 65 2d 3e 68 2c 20 26 55 6e 6c  ( pFile->h, &Unl
4c70: 6f 63 6b 41 72 65 61 2c 20 26 4c 6f 63 6b 41 72  ockArea, &LockAr
4c80: 65 61 2c 20 32 30 30 30 4c 2c 20 31 4c 20 29 3b  ea, 2000L, 1L );
4c90: 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 74 79 70  .    if( locktyp
4ca0: 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26  e==SHARED_LOCK &
4cb0: 26 20 67 65 74 52 65 61 64 4c 6f 63 6b 28 70 46  & getReadLock(pF
4cc0: 69 6c 65 29 20 21 3d 20 4e 4f 5f 45 52 52 4f 52  ile) != NO_ERROR
4cd0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69   ){.      /* Thi
4ce0: 73 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 68  s should never h
4cf0: 61 70 70 65 6e 2e 20 20 57 65 20 73 68 6f 75 6c  appen.  We shoul
4d00: 64 20 61 6c 77 61 79 73 20 62 65 20 61 62 6c 65  d always be able
4d10: 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 72 65 61   to.      ** rea
4d20: 63 71 75 69 72 65 20 74 68 65 20 72 65 61 64 20  cquire the read 
4d30: 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 72 63  lock */.      rc
4d40: 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b   = SQLITE_IOERR;
4d50: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
4d60: 20 74 79 70 65 3e 3d 52 45 53 45 52 56 45 44 5f   type>=RESERVED_
4d70: 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 4c 6f 63 6b  LOCK ){.    Lock
4d80: 41 72 65 61 2e 6c 4f 66 66 73 65 74 20 3d 20 30  Area.lOffset = 0
4d90: 4c 3b 0a 20 20 20 20 4c 6f 63 6b 41 72 65 61 2e  L;.    LockArea.
4da0: 6c 52 61 6e 67 65 20 3d 20 30 4c 3b 0a 20 20 20  lRange = 0L;.   
4db0: 20 55 6e 6c 6f 63 6b 41 72 65 61 2e 6c 4f 66 66   UnlockArea.lOff
4dc0: 73 65 74 20 3d 20 52 45 53 45 52 56 45 44 5f 42  set = RESERVED_B
4dd0: 59 54 45 3b 0a 20 20 20 20 55 6e 6c 6f 63 6b 41  YTE;.    UnlockA
4de0: 72 65 61 2e 6c 52 61 6e 67 65 20 3d 20 31 4c 3b  rea.lRange = 1L;
4df0: 0a 20 20 20 20 44 6f 73 53 65 74 46 69 6c 65 4c  .    DosSetFileL
4e00: 6f 63 6b 73 28 20 70 46 69 6c 65 2d 3e 68 2c 20  ocks( pFile->h, 
4e10: 26 55 6e 6c 6f 63 6b 41 72 65 61 2c 20 26 4c 6f  &UnlockArea, &Lo
4e20: 63 6b 41 72 65 61 2c 20 32 30 30 30 4c 2c 20 31  ckArea, 2000L, 1
4e30: 4c 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6c  L );.  }.  if( l
4e40: 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43 4b  ocktype==NO_LOCK
4e50: 20 26 26 20 74 79 70 65 3e 3d 53 48 41 52 45 44   && type>=SHARED
4e60: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 75 6e 6c  _LOCK ){.    unl
4e70: 6f 63 6b 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c  ockReadLock(pFil
4e80: 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 74 79  e);.  }.  if( ty
4e90: 70 65 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  pe>=PENDING_LOCK
4ea0: 20 29 7b 0a 20 20 20 20 4c 6f 63 6b 41 72 65 61   ){.    LockArea
4eb0: 2e 6c 4f 66 66 73 65 74 20 3d 20 30 4c 3b 0a 20  .lOffset = 0L;. 
4ec0: 20 20 20 4c 6f 63 6b 41 72 65 61 2e 6c 52 61 6e     LockArea.lRan
4ed0: 67 65 20 3d 20 30 4c 3b 0a 20 20 20 20 55 6e 6c  ge = 0L;.    Unl
4ee0: 6f 63 6b 41 72 65 61 2e 6c 4f 66 66 73 65 74 20  ockArea.lOffset 
4ef0: 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a  = PENDING_BYTE;.
4f00: 20 20 20 20 55 6e 6c 6f 63 6b 41 72 65 61 2e 6c      UnlockArea.l
4f10: 52 61 6e 67 65 20 3d 20 31 4c 3b 0a 20 20 20 20  Range = 1L;.    
4f20: 44 6f 73 53 65 74 46 69 6c 65 4c 6f 63 6b 73 28  DosSetFileLocks(
4f30: 20 70 46 69 6c 65 2d 3e 68 2c 20 26 55 6e 6c 6f   pFile->h, &Unlo
4f40: 63 6b 41 72 65 61 2c 20 26 4c 6f 63 6b 41 72 65  ckArea, &LockAre
4f50: 61 2c 20 32 30 30 30 4c 2c 20 31 4c 20 29 3b 0a  a, 2000L, 1L );.
4f60: 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 6c 6f 63    }.  pFile->loc
4f70: 6b 74 79 70 65 20 3d 20 6c 6f 63 6b 74 79 70 65  ktype = locktype
4f80: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
4f90: 0a 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 61 20 72  ../*.** Turn a r
4fa0: 65 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65  elative pathname
4fb0: 20 69 6e 74 6f 20 61 20 66 75 6c 6c 20 70 61 74   into a full pat
4fc0: 68 6e 61 6d 65 2e 20 20 52 65 74 75 72 6e 20 61  hname.  Return a
4fd0: 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74   pointer.** to t
4fe0: 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65  he full pathname
4ff0: 20 73 74 6f 72 65 64 20 69 6e 20 73 70 61 63 65   stored in space
5000: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
5010: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 2e 0a 2a  qliteMalloc()..*
5020: 2a 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75  * The calling fu
5030: 6e 63 74 69 6f 6e 20 69 73 20 72 65 73 70 6f 6e  nction is respon
5040: 73 69 62 6c 65 20 66 6f 72 20 66 72 65 65 69 6e  sible for freein
5050: 67 20 74 68 69 73 20 73 70 61 63 65 20 6f 6e 63  g this space onc
5060: 65 20 69 74 0a 2a 2a 20 69 73 20 6e 6f 20 6c 6f  e it.** is no lo
5070: 6e 67 65 72 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a  nger needed..*/.
5080: 63 68 61 72 20 2a 73 71 6c 69 74 65 33 4f 73 32  char *sqlite3Os2
5090: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 20 63 6f  FullPathname( co
50a0: 6e 73 74 20 63 68 61 72 20 2a 7a 52 65 6c 61 74  nst char *zRelat
50b0: 69 76 65 20 29 7b 0a 20 20 63 68 61 72 20 2a 7a  ive ){.  char *z
50c0: 46 75 6c 6c 20 3d 20 30 3b 0a 20 20 69 66 28 20  Full = 0;.  if( 
50d0: 73 74 72 63 68 72 28 7a 52 65 6c 61 74 69 76 65  strchr(zRelative
50e0: 2c 20 27 3a 27 29 20 29 7b 0a 20 20 20 20 73 71  , ':') ){.    sq
50f0: 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 20  lite3SetString( 
5100: 26 7a 46 75 6c 6c 2c 20 7a 52 65 6c 61 74 69 76  &zFull, zRelativ
5110: 65 2c 20 28 63 68 61 72 2a 29 30 20 29 3b 0a 20  e, (char*)0 );. 
5120: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72   }else{.    char
5130: 20 7a 42 75 66 66 5b 53 51 4c 49 54 45 5f 54 45   zBuff[SQLITE_TE
5140: 4d 50 4e 41 4d 45 5f 53 49 5a 45 20 2d 20 32 5d  MPNAME_SIZE - 2]
5150: 20 3d 20 7b 30 7d 3b 0a 20 20 20 20 63 68 61 72   = {0};.    char
5160: 20 7a 44 72 69 76 65 5b 31 5d 20 3d 20 7b 30 7d   zDrive[1] = {0}
5170: 3b 0a 20 20 20 20 55 4c 4f 4e 47 20 63 62 7a 46  ;.    ULONG cbzF
5180: 75 6c 6c 4c 65 6e 20 3d 20 53 51 4c 49 54 45 5f  ullLen = SQLITE_
5190: 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 3b 0a 20  TEMPNAME_SIZE;. 
51a0: 20 20 20 55 4c 4f 4e 47 20 75 6c 44 72 69 76 65     ULONG ulDrive
51b0: 4e 75 6d 20 3d 20 30 3b 0a 20 20 20 20 55 4c 4f  Num = 0;.    ULO
51c0: 4e 47 20 75 6c 44 72 69 76 65 4d 61 70 20 3d 20  NG ulDriveMap = 
51d0: 30 3b 0a 20 20 20 20 44 6f 73 51 75 65 72 79 43  0;.    DosQueryC
51e0: 75 72 72 65 6e 74 44 69 73 6b 28 20 26 75 6c 44  urrentDisk( &ulD
51f0: 72 69 76 65 4e 75 6d 2c 20 26 75 6c 44 72 69 76  riveNum, &ulDriv
5200: 65 4d 61 70 20 29 3b 0a 20 20 20 20 44 6f 73 51  eMap );.    DosQ
5210: 75 65 72 79 43 75 72 72 65 6e 74 44 69 72 28 20  ueryCurrentDir( 
5220: 30 4c 2c 20 7a 42 75 66 66 2c 20 26 63 62 7a 46  0L, zBuff, &cbzF
5230: 75 6c 6c 4c 65 6e 20 29 3b 0a 20 20 20 20 7a 46  ullLen );.    zF
5240: 75 6c 6c 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  ull = sqliteMall
5250: 6f 63 28 20 63 62 7a 46 75 6c 6c 4c 65 6e 20 29  oc( cbzFullLen )
5260: 3b 0a 20 20 20 20 73 70 72 69 6e 74 66 28 20 7a  ;.    sprintf( z
5270: 44 72 69 76 65 2c 20 22 25 63 22 2c 20 28 63 68  Drive, "%c", (ch
5280: 61 72 29 28 27 41 27 20 2b 20 75 6c 44 72 69 76  ar)('A' + ulDriv
5290: 65 4e 75 6d 20 2d 20 31 29 20 29 3b 0a 20 20 20  eNum - 1) );.   
52a0: 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e   sqlite3SetStrin
52b0: 67 28 20 26 7a 46 75 6c 6c 2c 20 7a 44 72 69 76  g( &zFull, zDriv
52c0: 65 2c 20 22 3a 5c 5c 22 2c 20 7a 42 75 66 66 2c  e, ":\\", zBuff,
52d0: 20 22 5c 5c 22 2c 20 7a 52 65 6c 61 74 69 76 65   "\\", zRelative
52e0: 2c 20 28 63 68 61 72 2a 29 30 20 29 3b 0a 20 20  , (char*)0 );.  
52f0: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 46 75 6c 6c  }.  return zFull
5300: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  ;.}../*.** The f
5310: 75 6c 6c 53 79 6e 63 20 6f 70 74 69 6f 6e 20 69  ullSync option i
5320: 73 20 6d 65 61 6e 69 6e 67 6c 65 73 73 20 6f 6e  s meaningless on
5330: 20 6f 73 32 2c 20 6f 72 20 63 6f 72 72 65 63 74   os2, or correct
5340: 20 6d 65 20 69 66 20 49 27 6d 20 77 72 6f 6e 67   me if I'm wrong
5350: 2e 20 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d  .  This is a no-
5360: 6f 70 2e 0a 2a 2a 20 46 72 6f 6d 20 6f 73 5f 75  op..** From os_u
5370: 6e 69 78 2e 63 3a 20 43 68 61 6e 67 65 20 74 68  nix.c: Change th
5380: 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 66  e value of the f
5390: 75 6c 6c 73 79 6e 63 20 66 6c 61 67 20 69 6e 20  ullsync flag in 
53a0: 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64  the given file d
53b0: 65 73 63 72 69 70 74 6f 72 2e 0a 2a 2a 20 46 72  escriptor..** Fr
53c0: 6f 6d 20 6f 73 5f 75 6e 69 78 2e 63 3a 20 28 28  om os_unix.c: ((
53d0: 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 66  unixFile*)id)->f
53e0: 75 6c 6c 53 79 6e 63 20 3d 20 76 3b 0a 2a 2f 0a  ullSync = v;.*/.
53f0: 73 74 61 74 69 63 20 76 6f 69 64 20 6f 73 32 53  static void os2S
5400: 65 74 46 75 6c 6c 53 79 6e 63 28 20 4f 73 46 69  etFullSync( OsFi
5410: 6c 65 20 2a 69 64 2c 20 69 6e 74 20 76 20 29 7b  le *id, int v ){
5420: 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  .  return;.}../*
5430: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 75  .** Return the u
5440: 6e 64 65 72 6c 79 69 6e 67 20 66 69 6c 65 20 68  nderlying file h
5450: 61 6e 64 6c 65 20 66 6f 72 20 61 6e 20 4f 73 46  andle for an OsF
5460: 69 6c 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ile.*/.static in
5470: 74 20 6f 73 32 46 69 6c 65 48 61 6e 64 6c 65 28  t os2FileHandle(
5480: 20 4f 73 46 69 6c 65 20 2a 69 64 20 29 7b 0a 20   OsFile *id ){. 
5490: 20 72 65 74 75 72 6e 20 28 69 6e 74 29 28 28 6f   return (int)((o
54a0: 73 32 46 69 6c 65 2a 29 69 64 29 2d 3e 68 3b 0a  s2File*)id)->h;.
54b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
54c0: 61 6e 20 69 6e 74 65 67 65 72 20 74 68 61 74 20  an integer that 
54d0: 69 6e 64 69 63 65 73 20 74 68 65 20 74 79 70 65  indices the type
54e0: 20 6f 66 20 6c 6f 63 6b 20 63 75 72 72 65 6e 74   of lock current
54f0: 6c 79 20 68 65 6c 64 0a 2a 2a 20 62 79 20 74 68  ly held.** by th
5500: 69 73 20 68 61 6e 64 6c 65 2e 20 20 28 55 73 65  is handle.  (Use
5510: 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e  d for testing an
5520: 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e  d analysis only.
5530: 29 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ).*/.static int 
5540: 6f 73 32 4c 6f 63 6b 53 74 61 74 65 28 20 4f 73  os2LockState( Os
5550: 46 69 6c 65 20 2a 69 64 20 29 7b 0a 20 20 72 65  File *id ){.  re
5560: 74 75 72 6e 20 28 28 6f 73 32 46 69 6c 65 2a 29  turn ((os2File*)
5570: 69 64 29 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a 7d  id)->locktype;.}
5580: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
5590: 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69  he sector size i
55a0: 6e 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 75  n bytes of the u
55b0: 6e 64 65 72 6c 79 69 6e 67 20 62 6c 6f 63 6b 20  nderlying block 
55c0: 64 65 76 69 63 65 20 66 6f 72 0a 2a 2a 20 74 68  device for.** th
55d0: 65 20 73 70 65 63 69 66 69 65 64 20 66 69 6c 65  e specified file
55e0: 2e 20 54 68 69 73 20 69 73 20 61 6c 6d 6f 73 74  . This is almost
55f0: 20 61 6c 77 61 79 73 20 35 31 32 20 62 79 74 65   always 512 byte
5600: 73 2c 20 62 75 74 20 6d 61 79 20 62 65 0a 2a 2a  s, but may be.**
5610: 20 6c 61 72 67 65 72 20 66 6f 72 20 73 6f 6d 65   larger for some
5620: 20 64 65 76 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20   devices..**.** 
5630: 53 51 4c 69 74 65 20 63 6f 64 65 20 61 73 73 75  SQLite code assu
5640: 6d 65 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f  mes this functio
5650: 6e 20 63 61 6e 6e 6f 74 20 66 61 69 6c 2e 20 49  n cannot fail. I
5660: 74 20 61 6c 73 6f 20 61 73 73 75 6d 65 73 20 74  t also assumes t
5670: 68 61 74 0a 2a 2a 20 69 66 20 74 77 6f 20 66 69  hat.** if two fi
5680: 6c 65 73 20 61 72 65 20 63 72 65 61 74 65 64 20  les are created 
5690: 69 6e 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65  in the same file
56a0: 2d 73 79 73 74 65 6d 20 64 69 72 65 63 74 6f 72  -system director
56b0: 79 20 28 69 2e 65 2e 0a 2a 2a 20 61 20 64 61 74  y (i.e..** a dat
56c0: 61 62 61 73 65 20 61 6e 64 20 69 74 27 73 20 6a  abase and it's j
56d0: 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 74 68 61  ournal file) tha
56e0: 74 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a  t the sector siz
56f0: 65 20 77 69 6c 6c 20 62 65 20 74 68 65 0a 2a 2a  e will be the.**
5700: 20 73 61 6d 65 20 66 6f 72 20 62 6f 74 68 2e 0a   same for both..
5710: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 73  */.static int os
5720: 32 53 65 63 74 6f 72 53 69 7a 65 28 4f 73 46 69  2SectorSize(OsFi
5730: 6c 65 20 2a 69 64 29 7b 0a 20 20 72 65 74 75 72  le *id){.  retur
5740: 6e 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  n SQLITE_DEFAULT
5750: 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 7d 0a  _SECTOR_SIZE;.}.
5760: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 65 63 74  ./*.** This vect
5770: 6f 72 20 64 65 66 69 6e 65 73 20 61 6c 6c 20 74  or defines all t
5780: 68 65 20 6d 65 74 68 6f 64 73 20 74 68 61 74 20  he methods that 
5790: 63 61 6e 20 6f 70 65 72 61 74 65 20 6f 6e 20 61  can operate on a
57a0: 6e 20 4f 73 46 69 6c 65 0a 2a 2a 20 66 6f 72 20  n OsFile.** for 
57b0: 6f 73 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  os2..*/.static c
57c0: 6f 6e 73 74 20 49 6f 4d 65 74 68 6f 64 20 73 71  onst IoMethod sq
57d0: 6c 69 74 65 33 4f 73 32 49 6f 4d 65 74 68 6f 64  lite3Os2IoMethod
57e0: 20 3d 20 7b 0a 20 20 6f 73 32 43 6c 6f 73 65 2c   = {.  os2Close,
57f0: 0a 20 20 6f 73 32 4f 70 65 6e 44 69 72 65 63 74  .  os2OpenDirect
5800: 6f 72 79 2c 0a 20 20 6f 73 32 52 65 61 64 2c 0a  ory,.  os2Read,.
5810: 20 20 6f 73 32 57 72 69 74 65 2c 0a 20 20 6f 73    os2Write,.  os
5820: 32 53 65 65 6b 2c 0a 20 20 6f 73 32 54 72 75 6e  2Seek,.  os2Trun
5830: 63 61 74 65 2c 0a 20 20 6f 73 32 53 79 6e 63 2c  cate,.  os2Sync,
5840: 0a 20 20 6f 73 32 53 65 74 46 75 6c 6c 53 79 6e  .  os2SetFullSyn
5850: 63 2c 0a 20 20 6f 73 32 46 69 6c 65 48 61 6e 64  c,.  os2FileHand
5860: 6c 65 2c 0a 20 20 6f 73 32 46 69 6c 65 53 69 7a  le,.  os2FileSiz
5870: 65 2c 0a 20 20 6f 73 32 4c 6f 63 6b 2c 0a 20 20  e,.  os2Lock,.  
5880: 6f 73 32 55 6e 6c 6f 63 6b 2c 0a 20 20 6f 73 32  os2Unlock,.  os2
5890: 4c 6f 63 6b 53 74 61 74 65 2c 0a 20 20 6f 73 32  LockState,.  os2
58a0: 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
58b0: 6b 2c 0a 20 20 6f 73 32 53 65 63 74 6f 72 53 69  k,.  os2SectorSi
58c0: 7a 65 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6c  ze,.};../*.** Al
58d0: 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 6f  locate memory fo
58e0: 72 20 61 6e 20 4f 73 46 69 6c 65 2e 20 20 49 6e  r an OsFile.  In
58f0: 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6e 65 77  itialize the new
5900: 20 4f 73 46 69 6c 65 0a 2a 2a 20 74 6f 20 74 68   OsFile.** to th
5910: 65 20 76 61 6c 75 65 20 67 69 76 65 6e 20 69 6e  e value given in
5920: 20 70 49 6e 69 74 20 61 6e 64 20 72 65 74 75 72   pInit and retur
5930: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
5940: 68 65 20 6e 65 77 0a 2a 2a 20 4f 73 46 69 6c 65  he new.** OsFile
5950: 2e 20 20 49 66 20 77 65 20 72 75 6e 20 6f 75 74  .  If we run out
5960: 20 6f 66 20 6d 65 6d 6f 72 79 2c 20 63 6c 6f 73   of memory, clos
5970: 65 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20 72  e the file and r
5980: 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 69  eturn NULL..*/.i
5990: 6e 74 20 61 6c 6c 6f 63 61 74 65 4f 73 32 46 69  nt allocateOs2Fi
59a0: 6c 65 28 20 6f 73 32 46 69 6c 65 20 2a 70 49 6e  le( os2File *pIn
59b0: 69 74 2c 20 4f 73 46 69 6c 65 20 2a 2a 70 6c 64  it, OsFile **pld
59c0: 20 29 7b 0a 20 20 6f 73 32 46 69 6c 65 20 2a 70   ){.  os2File *p
59d0: 4e 65 77 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  New;.  pNew = sq
59e0: 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65  liteMalloc( size
59f0: 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69  of(*pNew) );.  i
5a00: 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( pNew==0 ){.  
5a10: 20 20 44 6f 73 43 6c 6f 73 65 28 20 70 49 6e 69    DosClose( pIni
5a20: 74 2d 3e 68 20 29 3b 0a 20 20 20 20 2a 70 6c 64  t->h );.    *pld
5a30: 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 0;.    return
5a40: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
5a50: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 4e 65   }else{.    *pNe
5a60: 77 20 3d 20 2a 70 49 6e 69 74 3b 0a 20 20 20 20  w = *pInit;.    
5a70: 70 4e 65 77 2d 3e 70 4d 65 74 68 6f 64 20 3d 20  pNew->pMethod = 
5a80: 26 73 71 6c 69 74 65 33 4f 73 32 49 6f 4d 65 74  &sqlite3Os2IoMet
5a90: 68 6f 64 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6c  hod;.    pNew->l
5aa0: 6f 63 6b 74 79 70 65 20 3d 20 4e 4f 5f 4c 4f 43  ocktype = NO_LOC
5ab0: 4b 3b 0a 20 20 20 20 2a 70 6c 64 20 3d 20 28 4f  K;.    *pld = (O
5ac0: 73 46 69 6c 65 2a 29 70 4e 65 77 3b 0a 20 20 20  sFile*)pNew;.   
5ad0: 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2b 31 29   OpenCounter(+1)
5ae0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
5af0: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 23  ITE_OK;.  }.}..#
5b00: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
5b10: 4f 4d 49 54 5f 44 49 53 4b 49 4f 20 2a 2f 0a 2f  OMIT_DISKIO */./
5b20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5b30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5b40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5b50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5b60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 45  ***********.** E
5b70: 76 65 72 79 74 68 69 6e 67 20 61 62 6f 76 65 20  verything above 
5b80: 64 65 61 6c 73 20 77 69 74 68 20 66 69 6c 65 20  deals with file 
5b90: 49 2f 4f 2e 20 20 45 76 65 72 79 74 68 69 6e 67  I/O.  Everything
5ba0: 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 64 65   that follows de
5bb0: 61 6c 73 0a 2a 2a 20 77 69 74 68 20 6f 74 68 65  als.** with othe
5bc0: 72 20 6d 69 73 63 65 6c 6c 61 6e 6f 75 73 20 61  r miscellanous a
5bd0: 73 70 65 63 74 73 20 6f 66 20 74 68 65 20 6f 70  spects of the op
5be0: 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69  erating system i
5bf0: 6e 74 65 72 66 61 63 65 0a 2a 2a 2a 2a 2a 2a 2a  nterface.*******
5c00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5c10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5c20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5c30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5c40: 2a 2a 2a 2a 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  *****/..#ifndef 
5c50: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44  SQLITE_OMIT_LOAD
5c60: 5f 45 58 54 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a  _EXTENSION./*.**
5c70: 20 49 6e 74 65 72 66 61 63 65 73 20 66 6f 72 20   Interfaces for 
5c80: 6f 70 65 6e 69 6e 67 20 61 20 73 68 61 72 65 64  opening a shared
5c90: 20 6c 69 62 72 61 72 79 2c 20 66 69 6e 64 69 6e   library, findin
5ca0: 67 20 65 6e 74 72 79 20 70 6f 69 6e 74 73 0a 2a  g entry points.*
5cb0: 2a 20 77 69 74 68 69 6e 20 74 68 65 20 73 68 61  * within the sha
5cc0: 72 65 64 20 6c 69 62 72 61 72 79 2c 20 61 6e 64  red library, and
5cd0: 20 63 6c 6f 73 69 6e 67 20 74 68 65 20 73 68 61   closing the sha
5ce0: 72 65 64 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a  red library..*/.
5cf0: 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 4f 73 32  void *sqlite3Os2
5d00: 44 6c 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68 61  Dlopen(const cha
5d10: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20  r *zFilename){. 
5d20: 20 55 43 48 41 52 20 6c 6f 61 64 45 72 72 5b 32   UCHAR loadErr[2
5d30: 35 36 5d 3b 0a 20 20 48 4d 4f 44 55 4c 45 20 68  56];.  HMODULE h
5d40: 6d 6f 64 3b 0a 20 20 41 50 49 52 45 54 20 72 63  mod;.  APIRET rc
5d50: 3b 0a 20 20 72 63 20 3d 20 44 6f 73 4c 6f 61 64  ;.  rc = DosLoad
5d60: 4d 6f 64 75 6c 65 28 6c 6f 61 64 45 72 72 2c 20  Module(loadErr, 
5d70: 73 69 7a 65 6f 66 28 6c 6f 61 64 45 72 72 29 2c  sizeof(loadErr),
5d80: 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 26 68 6d 6f   zFilename, &hmo
5d90: 64 29 3b 0a 20 20 69 66 20 28 72 63 20 21 3d 20  d);.  if (rc != 
5da0: 4e 4f 5f 45 52 52 4f 52 29 20 72 65 74 75 72 6e  NO_ERROR) return
5db0: 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 28 76 6f   0;.  return (vo
5dc0: 69 64 2a 29 68 6d 6f 64 3b 0a 7d 0a 76 6f 69 64  id*)hmod;.}.void
5dd0: 20 2a 73 71 6c 69 74 65 33 4f 73 32 44 6c 73 79   *sqlite3Os2Dlsy
5de0: 6d 28 76 6f 69 64 20 2a 70 48 61 6e 64 6c 65 2c  m(void *pHandle,
5df0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 79   const char *zSy
5e00: 6d 62 6f 6c 29 7b 0a 20 20 50 46 4e 20 70 66 6e  mbol){.  PFN pfn
5e10: 3b 0a 20 20 41 50 49 52 45 54 20 72 63 3b 0a 20  ;.  APIRET rc;. 
5e20: 20 72 63 20 3d 20 44 6f 73 51 75 65 72 79 50 72   rc = DosQueryPr
5e30: 6f 63 41 64 64 72 28 28 48 4d 4f 44 55 4c 45 29  ocAddr((HMODULE)
5e40: 70 48 61 6e 64 6c 65 2c 20 30 4c 2c 20 7a 53 79  pHandle, 0L, zSy
5e50: 6d 62 6f 6c 2c 20 26 70 66 6e 29 3b 0a 20 20 69  mbol, &pfn);.  i
5e60: 66 20 28 72 63 20 21 3d 20 4e 4f 5f 45 52 52 4f  f (rc != NO_ERRO
5e70: 52 29 20 7b 0a 20 20 20 20 2f 2a 20 69 66 20 74  R) {.    /* if t
5e80: 68 65 20 73 79 6d 62 6f 6c 20 69 74 73 65 6c 66  he symbol itself
5e90: 20 77 61 73 20 6e 6f 74 20 66 6f 75 6e 64 2c 20   was not found, 
5ea0: 73 65 61 72 63 68 20 61 67 61 69 6e 20 66 6f 72  search again for
5eb0: 20 74 68 65 20 73 61 6d 65 0a 20 20 20 20 20 2a   the same.     *
5ec0: 20 73 79 6d 62 6f 6c 20 77 69 74 68 20 61 6e 20   symbol with an 
5ed0: 65 78 74 72 61 20 75 6e 64 65 72 73 63 6f 72 65  extra underscore
5ee0: 2c 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20  , that might be 
5ef0: 6e 65 65 64 65 64 20 64 65 70 65 6e 64 69 6e 67  needed depending
5f00: 0a 20 20 20 20 20 2a 20 6f 6e 20 74 68 65 20 63  .     * on the c
5f10: 61 6c 6c 69 6e 67 20 63 6f 6e 76 65 6e 74 69 6f  alling conventio
5f20: 6e 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 5f 7a  n */.    char _z
5f30: 53 79 6d 62 6f 6c 5b 32 35 36 5d 20 3d 20 22 5f  Symbol[256] = "_
5f40: 22 3b 0a 20 20 20 20 73 74 72 6e 63 61 74 28 5f  ";.    strncat(_
5f50: 7a 53 79 6d 62 6f 6c 2c 20 7a 53 79 6d 62 6f 6c  zSymbol, zSymbol
5f60: 2c 20 32 35 35 29 3b 0a 20 20 20 20 72 63 20 3d  , 255);.    rc =
5f70: 20 44 6f 73 51 75 65 72 79 50 72 6f 63 41 64 64   DosQueryProcAdd
5f80: 72 28 28 48 4d 4f 44 55 4c 45 29 70 48 61 6e 64  r((HMODULE)pHand
5f90: 6c 65 2c 20 30 4c 2c 20 5f 7a 53 79 6d 62 6f 6c  le, 0L, _zSymbol
5fa0: 2c 20 26 70 66 6e 29 3b 0a 20 20 7d 0a 20 20 69  , &pfn);.  }.  i
5fb0: 66 20 28 72 63 20 21 3d 20 4e 4f 5f 45 52 52 4f  f (rc != NO_ERRO
5fc0: 52 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72  R) return 0;.  r
5fd0: 65 74 75 72 6e 20 70 66 6e 3b 0a 7d 0a 69 6e 74  eturn pfn;.}.int
5fe0: 20 73 71 6c 69 74 65 33 4f 73 32 44 6c 63 6c 6f   sqlite3Os2Dlclo
5ff0: 73 65 28 76 6f 69 64 20 2a 70 48 61 6e 64 6c 65  se(void *pHandle
6000: 29 7b 0a 20 20 72 65 74 75 72 6e 20 44 6f 73 46  ){.  return DosF
6010: 72 65 65 4d 6f 64 75 6c 65 28 28 48 4d 4f 44 55  reeModule((HMODU
6020: 4c 45 29 70 48 61 6e 64 6c 65 29 3b 0a 7d 0a 23  LE)pHandle);.}.#
6030: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
6040: 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53  OMIT_LOAD_EXTENS
6050: 49 4f 4e 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 47  ION */.../*.** G
6060: 65 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74  et information t
6070: 6f 20 73 65 65 64 20 74 68 65 20 72 61 6e 64 6f  o seed the rando
6080: 6d 20 6e 75 6d 62 65 72 20 67 65 6e 65 72 61 74  m number generat
6090: 6f 72 2e 20 20 54 68 65 20 73 65 65 64 0a 2a 2a  or.  The seed.**
60a0: 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   is written into
60b0: 20 74 68 65 20 62 75 66 66 65 72 20 7a 42 75 66   the buffer zBuf
60c0: 5b 32 35 36 5d 2e 20 20 54 68 65 20 63 61 6c 6c  [256].  The call
60d0: 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73  ing function mus
60e0: 74 0a 2a 2a 20 73 75 70 70 6c 79 20 61 20 73 75  t.** supply a su
60f0: 66 66 69 63 69 65 6e 74 6c 79 20 6c 61 72 67 65  fficiently large
6100: 20 62 75 66 66 65 72 2e 0a 2a 2f 0a 69 6e 74 20   buffer..*/.int 
6110: 73 71 6c 69 74 65 33 4f 73 32 52 61 6e 64 6f 6d  sqlite3Os2Random
6120: 53 65 65 64 28 20 63 68 61 72 20 2a 7a 42 75 66  Seed( char *zBuf
6130: 20 29 7b 0a 20 20 2f 2a 20 57 65 20 68 61 76 65   ){.  /* We have
6140: 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 7a   to initialize z
6150: 42 75 66 20 74 6f 20 70 72 65 76 65 6e 74 20 76  Buf to prevent v
6160: 61 6c 67 72 69 6e 64 20 66 72 6f 6d 20 72 65 70  algrind from rep
6170: 6f 72 74 69 6e 67 0a 20 20 2a 2a 20 65 72 72 6f  orting.  ** erro
6180: 72 73 2e 20 20 54 68 65 20 72 65 70 6f 72 74 73  rs.  The reports
6190: 20 69 73 73 75 65 64 20 62 79 20 76 61 6c 67 72   issued by valgr
61a0: 69 6e 64 20 61 72 65 20 69 6e 63 6f 72 72 65 63  ind are incorrec
61b0: 74 20 2d 20 77 65 20 77 6f 75 6c 64 0a 20 20 2a  t - we would.  *
61c0: 2a 20 70 72 65 66 65 72 20 74 68 61 74 20 74 68  * prefer that th
61d0: 65 20 72 61 6e 64 6f 6d 6e 65 73 73 20 62 65 20  e randomness be 
61e0: 69 6e 63 72 65 61 73 65 64 20 62 79 20 6d 61 6b  increased by mak
61f0: 69 6e 67 20 75 73 65 20 6f 66 20 74 68 65 0a 20  ing use of the. 
6200: 20 2a 2a 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65   ** uninitialize
6210: 64 20 73 70 61 63 65 20 69 6e 20 7a 42 75 66 20  d space in zBuf 
6220: 2d 20 62 75 74 20 76 61 6c 67 72 69 6e 64 20 65  - but valgrind e
6230: 72 72 6f 72 73 20 74 65 6e 64 20 74 6f 20 77 6f  rrors tend to wo
6240: 72 72 79 0a 20 20 2a 2a 20 73 6f 6d 65 20 75 73  rry.  ** some us
6250: 65 72 73 2e 20 20 52 61 74 68 65 72 20 74 68 61  ers.  Rather tha
6260: 6e 20 61 72 67 75 65 2c 20 69 74 20 73 65 65 6d  n argue, it seem
6270: 73 20 65 61 73 69 65 72 20 6a 75 73 74 20 74 6f  s easier just to
6280: 20 69 6e 69 74 69 61 6c 69 7a 65 0a 20 20 2a 2a   initialize.  **
6290: 20 74 68 65 20 77 68 6f 6c 65 20 61 72 72 61 79   the whole array
62a0: 20 61 6e 64 20 73 69 6c 65 6e 63 65 20 76 61 6c   and silence val
62b0: 67 72 69 6e 64 2c 20 65 76 65 6e 20 69 66 20 74  grind, even if t
62c0: 68 61 74 20 6d 65 61 6e 73 20 6c 65 73 73 20 72  hat means less r
62d0: 61 6e 64 6f 6d 6e 65 73 73 0a 20 20 2a 2a 20 69  andomness.  ** i
62e0: 6e 20 74 68 65 20 72 61 6e 64 6f 6d 20 73 65 65  n the random see
62f0: 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65  d..  **.  ** Whe
6300: 6e 20 74 65 73 74 69 6e 67 2c 20 69 6e 69 74 69  n testing, initi
6310: 61 6c 69 7a 69 6e 67 20 7a 42 75 66 5b 5d 20 74  alizing zBuf[] t
6320: 6f 20 7a 65 72 6f 20 69 73 20 61 6c 6c 20 77 65  o zero is all we
6330: 20 64 6f 2e 20 20 54 68 61 74 20 6d 65 61 6e 73   do.  That means
6340: 0a 20 20 2a 2a 20 74 68 61 74 20 77 65 20 61 6c  .  ** that we al
6350: 77 61 79 73 20 75 73 65 20 74 68 65 20 73 61 6d  ways use the sam
6360: 65 20 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20  e random number 
6370: 73 65 71 75 65 6e 63 65 2e 20 54 68 69 73 20 6d  sequence. This m
6380: 61 6b 65 73 20 74 68 65 0a 20 20 2a 2a 20 74 65  akes the.  ** te
6390: 73 74 73 20 72 65 70 65 61 74 61 62 6c 65 2e 0a  sts repeatable..
63a0: 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 20 7a    */.  memset( z
63b0: 42 75 66 2c 20 30 2c 20 32 35 36 20 29 3b 0a 20  Buf, 0, 256 );. 
63c0: 20 44 6f 73 47 65 74 44 61 74 65 54 69 6d 65 28   DosGetDateTime(
63d0: 20 28 50 44 41 54 45 54 49 4d 45 29 7a 42 75 66   (PDATETIME)zBuf
63e0: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   );.  return SQL
63f0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
6400: 20 53 6c 65 65 70 20 66 6f 72 20 61 20 6c 69 74   Sleep for a lit
6410: 74 6c 65 20 77 68 69 6c 65 2e 20 20 52 65 74 75  tle while.  Retu
6420: 72 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  rn the amount of
6430: 20 74 69 6d 65 20 73 6c 65 70 74 2e 0a 2a 2f 0a   time slept..*/.
6440: 69 6e 74 20 73 71 6c 69 74 65 33 4f 73 32 53 6c  int sqlite3Os2Sl
6450: 65 65 70 28 20 69 6e 74 20 6d 73 20 29 7b 0a 20  eep( int ms ){. 
6460: 20 44 6f 73 53 6c 65 65 70 28 20 6d 73 20 29 3b   DosSleep( ms );
6470: 0a 20 20 72 65 74 75 72 6e 20 6d 73 3b 0a 7d 0a  .  return ms;.}.
6480: 0a 2f 2a 0a 2a 2a 20 53 74 61 74 69 63 20 76 61  ./*.** Static va
6490: 72 69 61 62 6c 65 73 20 75 73 65 64 20 66 6f 72  riables used for
64a0: 20 74 68 72 65 61 64 20 73 79 6e 63 68 72 6f 6e   thread synchron
64b0: 69 7a 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69  ization.*/.stati
64c0: 63 20 69 6e 74 20 69 6e 4d 75 74 65 78 20 3d 20  c int inMutex = 
64d0: 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  0;.#ifdef SQLITE
64e0: 5f 4f 53 32 5f 54 48 52 45 41 44 53 0a 73 74 61  _OS2_THREADS.sta
64f0: 74 69 63 20 55 4c 4f 4e 47 20 6d 75 74 65 78 4f  tic ULONG mutexO
6500: 77 6e 65 72 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a  wner;.#endif../*
6510: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
6520: 67 20 70 61 69 72 20 6f 66 20 72 6f 75 74 69 6e  g pair of routin
6530: 65 73 20 69 6d 70 6c 65 6d 65 6e 74 20 6d 75 74  es implement mut
6540: 75 61 6c 20 65 78 63 6c 75 73 69 6f 6e 20 66 6f  ual exclusion fo
6550: 72 0a 2a 2a 20 6d 75 6c 74 69 2d 74 68 72 65 61  r.** multi-threa
6560: 64 65 64 20 70 72 6f 63 65 73 73 65 73 2e 20 20  ded processes.  
6570: 4f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 74 68  Only a single th
6580: 72 65 61 64 20 69 73 20 61 6c 6c 6f 77 65 64 20  read is allowed 
6590: 74 6f 0a 2a 2a 20 65 78 65 63 75 74 65 64 20 63  to.** executed c
65a0: 6f 64 65 20 74 68 61 74 20 69 73 20 73 75 72 72  ode that is surr
65b0: 6f 75 6e 64 65 64 20 62 79 20 45 6e 74 65 72 4d  ounded by EnterM
65c0: 75 74 65 78 28 29 20 61 6e 64 20 4c 65 61 76 65  utex() and Leave
65d0: 4d 75 74 65 78 28 29 2e 0a 2a 2a 0a 2a 2a 20 53  Mutex()..**.** S
65e0: 51 4c 69 74 65 20 75 73 65 73 20 6f 6e 6c 79 20  QLite uses only 
65f0: 61 20 73 69 6e 67 6c 65 20 4d 75 74 65 78 2e 20  a single Mutex. 
6600: 20 54 68 65 72 65 20 69 73 20 6e 6f 74 20 6d 75   There is not mu
6610: 63 68 20 63 72 69 74 69 63 61 6c 0a 2a 2a 20 63  ch critical.** c
6620: 6f 64 65 20 61 6e 64 20 77 68 61 74 20 6c 69 74  ode and what lit
6630: 74 6c 65 20 74 68 65 72 65 20 69 73 20 65 78 65  tle there is exe
6640: 63 75 74 65 73 20 71 75 69 63 6b 6c 79 20 61 6e  cutes quickly an
6650: 64 20 77 69 74 68 6f 75 74 20 62 6c 6f 63 6b 69  d without blocki
6660: 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ng..*/.void sqli
6670: 74 65 33 4f 73 32 45 6e 74 65 72 4d 75 74 65 78  te3Os2EnterMutex
6680: 28 29 7b 0a 20 20 50 54 49 42 20 70 74 69 62 3b  (){.  PTIB ptib;
6690: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
66a0: 53 32 5f 54 48 52 45 41 44 53 0a 20 20 44 6f 73  S2_THREADS.  Dos
66b0: 45 6e 74 65 72 43 72 69 74 53 65 63 28 29 3b 0a  EnterCritSec();.
66c0: 20 20 44 6f 73 47 65 74 49 6e 66 6f 42 6c 6f 63    DosGetInfoBloc
66d0: 6b 73 28 20 26 70 74 69 62 2c 20 4e 55 4c 4c 20  ks( &ptib, NULL 
66e0: 29 3b 0a 20 20 6d 75 74 65 78 4f 77 6e 65 72 20  );.  mutexOwner 
66f0: 3d 20 70 74 69 62 2d 3e 74 69 62 5f 70 74 69 62  = ptib->tib_ptib
6700: 32 2d 3e 74 69 62 32 5f 75 6c 74 69 64 3b 0a 23  2->tib2_ultid;.#
6710: 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20  endif.  assert( 
6720: 21 69 6e 4d 75 74 65 78 20 29 3b 0a 20 20 69 6e  !inMutex );.  in
6730: 4d 75 74 65 78 20 3d 20 31 3b 0a 7d 0a 76 6f 69  Mutex = 1;.}.voi
6740: 64 20 73 71 6c 69 74 65 33 4f 73 32 4c 65 61 76  d sqlite3Os2Leav
6750: 65 4d 75 74 65 78 28 29 7b 0a 20 20 50 54 49 42  eMutex(){.  PTIB
6760: 20 70 74 69 62 3b 0a 20 20 61 73 73 65 72 74 28   ptib;.  assert(
6770: 20 69 6e 4d 75 74 65 78 20 29 3b 0a 20 20 69 6e   inMutex );.  in
6780: 4d 75 74 65 78 20 3d 20 30 3b 0a 23 69 66 64 65  Mutex = 0;.#ifde
6790: 66 20 53 51 4c 49 54 45 5f 4f 53 32 5f 54 48 52  f SQLITE_OS2_THR
67a0: 45 41 44 53 0a 20 20 44 6f 73 47 65 74 49 6e 66  EADS.  DosGetInf
67b0: 6f 42 6c 6f 63 6b 73 28 20 26 70 74 69 62 2c 20  oBlocks( &ptib, 
67c0: 4e 55 4c 4c 20 29 3b 0a 20 20 61 73 73 65 72 74  NULL );.  assert
67d0: 28 20 6d 75 74 65 78 4f 77 6e 65 72 20 3d 3d 20  ( mutexOwner == 
67e0: 70 74 69 62 2d 3e 74 69 62 5f 70 74 69 62 32 2d  ptib->tib_ptib2-
67f0: 3e 74 69 62 32 5f 75 6c 74 69 64 20 29 3b 0a 20  >tib2_ultid );. 
6800: 20 44 6f 73 45 78 69 74 43 72 69 74 53 65 63 28   DosExitCritSec(
6810: 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  );.#endif.}../*.
6820: 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
6830: 66 20 74 68 65 20 6d 75 74 65 78 20 69 73 20 63  f the mutex is c
6840: 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 2e 0a 2a  urrently held..*
6850: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 74 68 69 73  *.** If the this
6860: 54 68 72 65 61 64 4f 6e 6c 79 20 70 61 72 61 6d  ThreadOnly param
6870: 65 74 65 72 20 69 73 20 74 72 75 65 2c 20 72 65  eter is true, re
6880: 74 75 72 6e 20 74 72 75 65 20 69 66 20 61 6e 64  turn true if and
6890: 20 6f 6e 6c 79 20 69 66 20 74 68 65 0a 2a 2a 20   only if the.** 
68a0: 63 61 6c 6c 69 6e 67 20 74 68 72 65 61 64 20 68  calling thread h
68b0: 6f 6c 64 73 20 74 68 65 20 6d 75 74 65 78 2e 20  olds the mutex. 
68c0: 20 49 66 20 74 68 65 20 70 61 72 61 6d 65 74 65   If the paramete
68d0: 72 20 69 73 20 66 61 6c 73 65 2c 20 72 65 74 75  r is false, retu
68e0: 72 6e 0a 2a 2a 20 74 72 75 65 20 69 66 20 61 6e  rn.** true if an
68f0: 79 20 74 68 72 65 61 64 20 68 6f 6c 64 73 20 74  y thread holds t
6900: 68 65 20 6d 75 74 65 78 2e 0a 2a 2f 0a 69 6e 74  he mutex..*/.int
6910: 20 73 71 6c 69 74 65 33 4f 73 32 49 6e 4d 75 74   sqlite3Os2InMut
6920: 65 78 28 20 69 6e 74 20 74 68 69 73 54 68 72 65  ex( int thisThre
6930: 61 64 4f 6e 6c 79 20 29 7b 0a 23 69 66 64 65 66  adOnly ){.#ifdef
6940: 20 53 51 4c 49 54 45 5f 4f 53 32 5f 54 48 52 45   SQLITE_OS2_THRE
6950: 41 44 53 0a 20 20 50 54 49 42 20 70 74 69 62 3b  ADS.  PTIB ptib;
6960: 0a 20 20 44 6f 73 47 65 74 49 6e 66 6f 42 6c 6f  .  DosGetInfoBlo
6970: 63 6b 73 28 20 26 70 74 69 62 2c 20 4e 55 4c 4c  cks( &ptib, NULL
6980: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 6e 4d   );.  return inM
6990: 75 74 65 78 3e 30 20 26 26 20 28 74 68 69 73 54  utex>0 && (thisT
69a0: 68 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 7c 7c 20  hreadOnly==0 || 
69b0: 6d 75 74 65 78 4f 77 6e 65 72 3d 3d 70 74 69 62  mutexOwner==ptib
69c0: 2d 3e 74 69 62 5f 70 74 69 62 32 2d 3e 74 69 62  ->tib_ptib2->tib
69d0: 32 5f 75 6c 74 69 64 29 3b 0a 23 65 6c 73 65 0a  2_ultid);.#else.
69e0: 20 20 72 65 74 75 72 6e 20 69 6e 4d 75 74 65 78    return inMutex
69f0: 3e 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a  >0;.#endif.}../*
6a00: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
6a10: 67 20 76 61 72 69 61 62 6c 65 2c 20 69 66 20 73  g variable, if s
6a20: 65 74 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f  et to a non-zero
6a30: 20 76 61 6c 75 65 2c 20 62 65 63 6f 6d 65 73 20   value, becomes 
6a40: 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20 72 65  the result.** re
6a50: 74 75 72 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  turned from sqli
6a60: 74 65 33 4f 73 43 75 72 72 65 6e 74 54 69 6d 65  te3OsCurrentTime
6a70: 28 29 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  ().  This is use
6a80: 64 20 66 6f 72 20 74 65 73 74 69 6e 67 2e 0a 2a  d for testing..*
6a90: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
6aa0: 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33  TEST.int sqlite3
6ab0: 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 3d 20  _current_time = 
6ac0: 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  0;.#endif../*.**
6ad0: 20 46 69 6e 64 20 74 68 65 20 63 75 72 72 65 6e   Find the curren
6ae0: 74 20 74 69 6d 65 20 28 69 6e 20 55 6e 69 76 65  t time (in Unive
6af0: 72 73 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64  rsal Coordinated
6b00: 20 54 69 6d 65 29 2e 20 20 57 72 69 74 65 20 74   Time).  Write t
6b10: 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 74 69  he.** current ti
6b20: 6d 65 20 61 6e 64 20 64 61 74 65 20 61 73 20 61  me and date as a
6b30: 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62   Julian Day numb
6b40: 65 72 20 69 6e 74 6f 20 2a 70 72 4e 6f 77 20 61  er into *prNow a
6b50: 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20 30 2e 20  nd.** return 0. 
6b60: 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65   Return 1 if the
6b70: 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20 63   time and date c
6b80: 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2e 0a  annot be found..
6b90: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f 73  */.int sqlite3Os
6ba0: 32 43 75 72 72 65 6e 74 54 69 6d 65 28 20 64 6f  2CurrentTime( do
6bb0: 75 62 6c 65 20 2a 70 72 4e 6f 77 20 29 7b 0a 20  uble *prNow ){. 
6bc0: 20 64 6f 75 62 6c 65 20 6e 6f 77 3b 0a 20 20 55   double now;.  U
6bd0: 53 48 4f 52 54 20 73 65 63 6f 6e 64 2c 20 6d 69  SHORT second, mi
6be0: 6e 75 74 65 2c 20 68 6f 75 72 2c 0a 20 20 20 20  nute, hour,.    
6bf0: 20 20 20 20 20 64 61 79 2c 20 6d 6f 6e 74 68 2c       day, month,
6c00: 20 79 65 61 72 3b 0a 20 20 44 41 54 45 54 49 4d   year;.  DATETIM
6c10: 45 20 64 74 3b 0a 20 20 44 6f 73 47 65 74 44 61  E dt;.  DosGetDa
6c20: 74 65 54 69 6d 65 28 20 26 64 74 20 29 3b 0a 20  teTime( &dt );. 
6c30: 20 73 65 63 6f 6e 64 20 3d 20 28 55 53 48 4f 52   second = (USHOR
6c40: 54 29 64 74 2e 73 65 63 6f 6e 64 73 3b 0a 20 20  T)dt.seconds;.  
6c50: 6d 69 6e 75 74 65 20 3d 20 28 55 53 48 4f 52 54  minute = (USHORT
6c60: 29 64 74 2e 6d 69 6e 75 74 65 73 20 2b 20 64 74  )dt.minutes + dt
6c70: 2e 74 69 6d 65 7a 6f 6e 65 3b 0a 20 20 68 6f 75  .timezone;.  hou
6c80: 72 20 3d 20 28 55 53 48 4f 52 54 29 64 74 2e 68  r = (USHORT)dt.h
6c90: 6f 75 72 73 3b 0a 20 20 64 61 79 20 3d 20 28 55  ours;.  day = (U
6ca0: 53 48 4f 52 54 29 64 74 2e 64 61 79 3b 0a 20 20  SHORT)dt.day;.  
6cb0: 6d 6f 6e 74 68 20 3d 20 28 55 53 48 4f 52 54 29  month = (USHORT)
6cc0: 64 74 2e 6d 6f 6e 74 68 3b 0a 20 20 79 65 61 72  dt.month;.  year
6cd0: 20 3d 20 28 55 53 48 4f 52 54 29 64 74 2e 79 65   = (USHORT)dt.ye
6ce0: 61 72 3b 0a 0a 20 20 2f 2a 20 43 61 6c 63 75 6c  ar;..  /* Calcul
6cf0: 61 74 69 6f 6e 73 20 66 72 6f 6d 20 68 74 74 70  ations from http
6d00: 3a 2f 2f 77 77 77 2e 61 73 74 72 6f 2e 6b 65 65  ://www.astro.kee
6d10: 6c 65 2e 61 63 2e 75 6b 2f 7e 72 6e 6f 2f 41 73  le.ac.uk/~rno/As
6d20: 74 72 6f 6e 6f 6d 79 2f 68 6a 64 2e 68 74 6d 6c  tronomy/hjd.html
6d30: 0a 20 20 20 20 20 68 74 74 70 3a 2f 2f 77 77 77  .     http://www
6d40: 2e 61 73 74 72 6f 2e 6b 65 65 6c 65 2e 61 63 2e  .astro.keele.ac.
6d50: 75 6b 2f 7e 72 6e 6f 2f 41 73 74 72 6f 6e 6f 6d  uk/~rno/Astronom
6d60: 79 2f 68 6a 64 2d 30 2e 31 2e 63 20 2a 2f 0a 20  y/hjd-0.1.c */. 
6d70: 20 2f 2a 20 43 61 6c 63 75 6c 61 74 65 20 74 68   /* Calculate th
6d80: 65 20 4a 75 6c 69 61 6e 20 64 61 79 73 20 2a 2f  e Julian days */
6d90: 0a 20 20 6e 6f 77 20 3d 20 64 61 79 20 2d 20 33  .  now = day - 3
6da0: 32 30 37 36 20 2b 0a 20 20 20 20 31 34 36 31 2a  2076 +.    1461*
6db0: 28 79 65 61 72 20 2b 20 34 38 30 30 20 2b 20 28  (year + 4800 + (
6dc0: 6d 6f 6e 74 68 20 2d 20 31 34 29 2f 31 32 29 2f  month - 14)/12)/
6dd0: 34 20 2b 0a 20 20 20 20 33 36 37 2a 28 6d 6f 6e  4 +.    367*(mon
6de0: 74 68 20 2d 20 32 20 2d 20 28 6d 6f 6e 74 68 20  th - 2 - (month 
6df0: 2d 20 31 34 29 2f 31 32 2a 31 32 29 2f 31 32 20  - 14)/12*12)/12 
6e00: 2d 0a 20 20 20 20 33 2a 28 28 79 65 61 72 20 2b  -.    3*((year +
6e10: 20 34 39 30 30 20 2b 20 28 6d 6f 6e 74 68 20 2d   4900 + (month -
6e20: 20 31 34 29 2f 31 32 29 2f 31 30 30 29 2f 34 3b   14)/12)/100)/4;
6e30: 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20 66  ..  /* Add the f
6e40: 72 61 63 74 69 6f 6e 61 6c 20 68 6f 75 72 73 2c  ractional hours,
6e50: 20 6d 69 6e 73 20 61 6e 64 20 73 65 63 6f 6e 64   mins and second
6e60: 73 20 2a 2f 0a 20 20 6e 6f 77 20 2b 3d 20 28 68  s */.  now += (h
6e70: 6f 75 72 20 2b 20 31 32 2e 30 29 2f 32 34 2e 30  our + 12.0)/24.0
6e80: 3b 0a 20 20 6e 6f 77 20 2b 3d 20 6d 69 6e 75 74  ;.  now += minut
6e90: 65 2f 31 34 34 30 2e 30 3b 0a 20 20 6e 6f 77 20  e/1440.0;.  now 
6ea0: 2b 3d 20 73 65 63 6f 6e 64 2f 38 36 34 30 30 2e  += second/86400.
6eb0: 30 3b 0a 20 20 2a 70 72 4e 6f 77 20 3d 20 6e 6f  0;.  *prNow = no
6ec0: 77 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  w;.#ifdef SQLITE
6ed0: 5f 54 45 53 54 0a 20 20 69 66 28 20 73 71 6c 69  _TEST.  if( sqli
6ee0: 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65  te3_current_time
6ef0: 20 29 7b 0a 20 20 20 20 2a 70 72 4e 6f 77 20 3d   ){.    *prNow =
6f00: 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74   sqlite3_current
6f10: 5f 74 69 6d 65 2f 38 36 34 30 30 2e 30 20 2b 20  _time/86400.0 + 
6f20: 32 34 34 30 35 38 37 2e 35 3b 0a 20 20 7d 0a 23  2440587.5;.  }.#
6f30: 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 30  endif.  return 0
6f40: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 65 6d  ;.}../*.** Remem
6f50: 62 65 72 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ber the number o
6f60: 66 20 74 68 72 65 61 64 2d 73 70 65 63 69 66 69  f thread-specifi
6f70: 63 2d 64 61 74 61 20 62 6c 6f 63 6b 73 20 61 6c  c-data blocks al
6f80: 6c 6f 63 61 74 65 64 2e 0a 2a 2a 20 55 73 65 20  located..** Use 
6f90: 74 68 69 73 20 74 6f 20 76 65 72 69 66 79 20 74  this to verify t
6fa0: 68 61 74 20 77 65 20 61 72 65 20 6e 6f 74 20 6c  hat we are not l
6fb0: 65 61 6b 69 6e 67 20 74 68 72 65 61 64 2d 73 70  eaking thread-sp
6fc0: 65 63 69 66 69 63 2d 64 61 74 61 2e 0a 2a 2a 20  ecific-data..** 
6fd0: 54 69 63 6b 65 74 20 23 31 36 30 31 0a 2a 2f 0a  Ticket #1601.*/.
6fe0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
6ff0: 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 74  ST.int sqlite3_t
7000: 73 64 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 20  sd_count = 0;.# 
7010: 64 65 66 69 6e 65 20 54 53 44 5f 43 4f 55 4e 54  define TSD_COUNT
7020: 45 52 5f 49 4e 43 52 20 49 6e 74 65 72 6c 6f 63  ER_INCR Interloc
7030: 6b 65 64 49 6e 63 72 65 6d 65 6e 74 28 20 26 73  kedIncrement( &s
7040: 71 6c 69 74 65 33 5f 74 73 64 5f 63 6f 75 6e 74  qlite3_tsd_count
7050: 20 29 0a 23 20 64 65 66 69 6e 65 20 54 53 44 5f   ).# define TSD_
7060: 43 4f 55 4e 54 45 52 5f 44 45 43 52 20 49 6e 74  COUNTER_DECR Int
7070: 65 72 6c 6f 63 6b 65 64 44 65 63 72 65 6d 65 6e  erlockedDecremen
7080: 74 28 20 26 73 71 6c 69 74 65 33 5f 74 73 64 5f  t( &sqlite3_tsd_
7090: 63 6f 75 6e 74 20 29 0a 23 65 6c 73 65 0a 23 20  count ).#else.# 
70a0: 64 65 66 69 6e 65 20 54 53 44 5f 43 4f 55 4e 54  define TSD_COUNT
70b0: 45 52 5f 49 4e 43 52 20 20 2f 2a 20 6e 6f 2d 6f  ER_INCR  /* no-o
70c0: 70 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 54 53  p */.# define TS
70d0: 44 5f 43 4f 55 4e 54 45 52 5f 44 45 43 52 20 20  D_COUNTER_DECR  
70e0: 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 23 65 6e 64  /* no-op */.#end
70f0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 63 61 6c  if../*.** If cal
7100: 6c 65 64 20 77 69 74 68 20 61 6c 6c 6f 63 61 74  led with allocat
7110: 65 46 6c 61 67 3e 31 2c 20 74 68 65 6e 20 72 65  eFlag>1, then re
7120: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
7130: 6f 20 74 68 72 65 61 64 0a 2a 2a 20 73 70 65 63  o thread.** spec
7140: 69 66 69 63 20 64 61 74 61 20 66 6f 72 20 74 68  ific data for th
7150: 65 20 63 75 72 72 65 6e 74 20 74 68 72 65 61 64  e current thread
7160: 2e 20 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20  .  Allocate and 
7170: 7a 65 72 6f 20 74 68 65 0a 2a 2a 20 74 68 72 65  zero the.** thre
7180: 61 64 2d 73 70 65 63 69 66 69 63 20 64 61 74 61  ad-specific data
7190: 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20   if it does not 
71a0: 61 6c 72 65 61 64 79 20 65 78 69 73 74 20 6e 65  already exist ne
71b0: 63 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 49  cessary..**.** I
71c0: 66 20 63 61 6c 6c 65 64 20 77 69 74 68 20 61 6c  f called with al
71d0: 6c 6f 63 61 74 65 46 6c 61 67 3d 3d 30 2c 20 74  locateFlag==0, t
71e0: 68 65 6e 20 63 68 65 63 6b 20 74 68 65 20 63 75  hen check the cu
71f0: 72 72 65 6e 74 20 74 68 72 65 61 64 0a 2a 2a 20  rrent thread.** 
7200: 73 70 65 63 69 66 69 63 20 64 61 74 61 2e 20 20  specific data.  
7210: 52 65 74 75 72 6e 20 69 74 20 69 66 20 69 74 20  Return it if it 
7220: 65 78 69 73 74 73 2e 20 20 49 66 20 69 74 20 64  exists.  If it d
7230: 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 0a 2a  oes not exist,.*
7240: 2a 20 74 68 65 6e 20 72 65 74 75 72 6e 20 4e 55  * then return NU
7250: 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 63 61 6c  LL..**.** If cal
7260: 6c 65 64 20 77 69 74 68 20 61 6c 6c 6f 63 61 74  led with allocat
7270: 65 46 6c 61 67 3c 30 2c 20 63 68 65 63 6b 20 74  eFlag<0, check t
7280: 6f 20 73 65 65 20 69 66 20 74 68 65 20 74 68 72  o see if the thr
7290: 65 61 64 20 73 70 65 63 69 66 69 63 0a 2a 2a 20  ead specific.** 
72a0: 64 61 74 61 20 69 73 20 61 6c 6c 6f 63 61 74 65  data is allocate
72b0: 64 20 61 6e 64 20 69 73 20 61 6c 6c 20 7a 65 72  d and is all zer
72c0: 6f 2e 20 20 49 66 20 69 74 20 69 73 20 74 68 65  o.  If it is the
72d0: 6e 20 64 65 61 6c 6c 6f 63 61 74 65 20 69 74 2e  n deallocate it.
72e0: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
72f0: 6e 74 65 72 20 74 6f 20 74 68 65 20 74 68 72 65  nter to the thre
7300: 61 64 20 73 70 65 63 69 66 69 63 20 64 61 74 61  ad specific data
7310: 20 6f 72 20 4e 55 4c 4c 20 69 66 20 69 74 20 69   or NULL if it i
7320: 73 0a 2a 2a 20 75 6e 61 6c 6c 6f 63 61 74 65 64  s.** unallocated
7330: 20 6f 72 20 67 65 74 73 20 64 65 61 6c 6c 6f 63   or gets dealloc
7340: 61 74 65 64 2e 0a 2a 2f 0a 54 68 72 65 61 64 44  ated..*/.ThreadD
7350: 61 74 61 20 2a 73 71 6c 69 74 65 33 4f 73 32 54  ata *sqlite3Os2T
7360: 68 72 65 61 64 53 70 65 63 69 66 69 63 44 61 74  hreadSpecificDat
7370: 61 28 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 46  a( int allocateF
7380: 6c 61 67 20 29 7b 0a 20 20 73 74 61 74 69 63 20  lag ){.  static 
7390: 54 68 72 65 61 64 44 61 74 61 20 2a 2a 73 5f 70  ThreadData **s_p
73a0: 70 54 73 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 73  pTsd = NULL;.  s
73b0: 74 61 74 69 63 20 63 6f 6e 73 74 20 54 68 72 65  tatic const Thre
73c0: 61 64 44 61 74 61 20 7a 65 72 6f 44 61 74 61 20  adData zeroData 
73d0: 3d 20 7b 30 2c 20 30 2c 20 30 7d 3b 0a 20 20 54  = {0, 0, 0};.  T
73e0: 68 72 65 61 64 44 61 74 61 20 2a 70 54 73 64 3b  hreadData *pTsd;
73f0: 0a 0a 20 20 69 66 28 20 21 73 5f 70 70 54 73 64  ..  if( !s_ppTsd
7400: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
7410: 73 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  sEnterMutex();. 
7420: 20 20 20 69 66 28 20 21 73 5f 70 70 54 73 64 20     if( !s_ppTsd 
7430: 29 7b 0a 20 20 20 20 20 20 50 55 4c 4f 4e 47 20  ){.      PULONG 
7440: 70 75 6c 3b 0a 20 20 20 20 20 20 41 50 49 52 45  pul;.      APIRE
7450: 54 20 72 63 20 3d 20 44 6f 73 41 6c 6c 6f 63 54  T rc = DosAllocT
7460: 68 72 65 61 64 4c 6f 63 61 6c 4d 65 6d 6f 72 79  hreadLocalMemory
7470: 28 31 2c 20 26 70 75 6c 29 3b 0a 20 20 20 20 20  (1, &pul);.     
7480: 20 69 66 28 20 72 63 20 21 3d 20 4e 4f 5f 45 52   if( rc != NO_ER
7490: 52 4f 52 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ROR ){.        s
74a0: 71 6c 69 74 65 33 4f 73 4c 65 61 76 65 4d 75 74  qlite3OsLeaveMut
74b0: 65 78 28 29 3b 0a 20 20 20 20 20 20 20 20 72 65  ex();.        re
74c0: 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a  turn 0;.      }.
74d0: 20 20 20 20 20 20 73 5f 70 70 54 73 64 20 3d 20        s_ppTsd = 
74e0: 28 54 68 72 65 61 64 44 61 74 61 20 2a 2a 29 70  (ThreadData **)p
74f0: 75 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  ul;.    }.    sq
7500: 6c 69 74 65 33 4f 73 4c 65 61 76 65 4d 75 74 65  lite3OsLeaveMute
7510: 78 28 29 3b 0a 20 20 7d 0a 20 20 70 54 73 64 20  x();.  }.  pTsd 
7520: 3d 20 2a 73 5f 70 70 54 73 64 3b 0a 20 20 69 66  = *s_ppTsd;.  if
7530: 28 20 61 6c 6c 6f 63 61 74 65 46 6c 61 67 3e 30  ( allocateFlag>0
7540: 20 29 7b 0a 20 20 20 20 69 66 28 20 21 70 54 73   ){.    if( !pTs
7550: 64 20 29 7b 0a 20 20 20 20 20 20 70 54 73 64 20  d ){.      pTsd 
7560: 3d 20 73 71 6c 69 74 65 33 4f 73 4d 61 6c 6c 6f  = sqlite3OsMallo
7570: 63 28 20 73 69 7a 65 6f 66 28 7a 65 72 6f 44 61  c( sizeof(zeroDa
7580: 74 61 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ta) );.      if(
7590: 20 70 54 73 64 20 29 7b 0a 20 20 20 20 20 20 20   pTsd ){.       
75a0: 20 2a 70 54 73 64 20 3d 20 7a 65 72 6f 44 61 74   *pTsd = zeroDat
75b0: 61 3b 0a 20 20 20 20 20 20 20 20 2a 73 5f 70 70  a;.        *s_pp
75c0: 54 73 64 20 3d 20 70 54 73 64 3b 0a 20 20 20 20  Tsd = pTsd;.    
75d0: 20 20 20 20 54 53 44 5f 43 4f 55 4e 54 45 52 5f      TSD_COUNTER_
75e0: 49 4e 43 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20  INCR;.      }.  
75f0: 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
7600: 70 54 73 64 21 3d 30 20 26 26 20 61 6c 6c 6f 63  pTsd!=0 && alloc
7610: 61 74 65 46 6c 61 67 3c 30 0a 20 20 20 20 20 20  ateFlag<0.      
7620: 20 20 20 20 20 20 20 20 26 26 20 6d 65 6d 63 6d          && memcm
7630: 70 28 20 70 54 73 64 2c 20 26 7a 65 72 6f 44 61  p( pTsd, &zeroDa
7640: 74 61 2c 20 73 69 7a 65 6f 66 28 54 68 72 65 61  ta, sizeof(Threa
7650: 64 44 61 74 61 29 20 29 3d 3d 30 20 29 7b 0a 20  dData) )==0 ){. 
7660: 20 20 20 73 71 6c 69 74 65 33 4f 73 46 72 65 65     sqlite3OsFree
7670: 28 70 54 73 64 29 3b 0a 20 20 20 20 2a 73 5f 70  (pTsd);.    *s_p
7680: 70 54 73 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  pTsd = NULL;.   
7690: 20 54 53 44 5f 43 4f 55 4e 54 45 52 5f 44 45 43   TSD_COUNTER_DEC
76a0: 52 3b 0a 20 20 20 20 70 54 73 64 20 3d 20 30 3b  R;.    pTsd = 0;
76b0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 54  .  }.  return pT
76c0: 73 64 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  sd;.}.#endif /* 
76d0: 4f 53 5f 4f 53 32 20 2a 2f 0a                    OS_OS2 */.