/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact 665876d5eec7585226b0a1cf5e18098de2b2da19:


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 6e 63 6c 75 64 65 20 22 73 71 6c 69  ..#include "sqli
01c0: 74 65 49 6e 74 2e 68 22 0a 0a 23 69 66 20 53 51  teInt.h"..#if SQ
01d0: 4c 49 54 45 5f 4f 53 5f 4f 53 32 0a 0a 2f 2a 0a  LITE_OS_OS2../*.
01e0: 2a 2a 20 41 20 4e 6f 74 65 20 41 62 6f 75 74 20  ** A Note About 
01f0: 4d 65 6d 6f 72 79 20 41 6c 6c 6f 63 61 74 69 6f  Memory Allocatio
0200: 6e 3a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 64 72  n:.**.** This dr
0210: 69 76 65 72 20 75 73 65 73 20 6d 61 6c 6c 6f 63  iver uses malloc
0220: 28 29 2f 66 72 65 65 28 29 20 64 69 72 65 63 74  ()/free() direct
0230: 6c 79 20 72 61 74 68 65 72 20 74 68 61 6e 20 67  ly rather than g
0240: 6f 69 6e 67 20 74 68 72 6f 75 67 68 0a 2a 2a 20  oing through.** 
0250: 74 68 65 20 53 51 4c 69 74 65 2d 77 72 61 70 70  the SQLite-wrapp
0260: 65 72 73 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  ers sqlite3_mall
0270: 6f 63 28 29 2f 73 71 6c 69 74 65 33 5f 66 72 65  oc()/sqlite3_fre
0280: 65 28 29 2e 20 20 54 68 6f 73 65 20 77 72 61 70  e().  Those wrap
0290: 70 65 72 73 0a 2a 2a 20 61 72 65 20 64 65 73 69  pers.** are desi
02a0: 67 6e 65 64 20 66 6f 72 20 75 73 65 20 6f 6e 20  gned for use on 
02b0: 65 6d 62 65 64 64 65 64 20 73 79 73 74 65 6d 73  embedded systems
02c0: 20 77 68 65 72 65 20 6d 65 6d 6f 72 79 20 69 73   where memory is
02d0: 20 73 63 61 72 63 65 20 61 6e 64 0a 2a 2a 20 6d   scarce and.** m
02e0: 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 73 20 68  alloc failures h
02f0: 61 70 70 65 6e 20 66 72 65 71 75 65 6e 74 6c 79  appen frequently
0300: 2e 20 20 4f 53 2f 32 20 64 6f 65 73 20 6e 6f 74  .  OS/2 does not
0310: 20 74 79 70 69 63 61 6c 6c 79 20 72 75 6e 20 6f   typically run o
0320: 6e 0a 2a 2a 20 65 6d 62 65 64 64 65 64 20 73 79  n.** embedded sy
0330: 73 74 65 6d 73 2c 20 61 6e 64 20 77 68 65 6e 20  stems, and when 
0340: 69 74 20 64 6f 65 73 20 74 68 65 20 64 65 76 65  it does the deve
0350: 6c 6f 70 65 72 73 20 6e 6f 72 6d 61 6c 6c 79 20  lopers normally 
0360: 68 61 76 65 20 62 69 67 67 65 72 0a 2a 2a 20 70  have bigger.** p
0370: 72 6f 62 6c 65 6d 73 20 74 6f 20 77 6f 72 72 79  roblems to worry
0380: 20 61 62 6f 75 74 20 74 68 61 6e 20 72 75 6e 6e   about than runn
0390: 69 6e 67 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72  ing out of memor
03a0: 79 2e 20 20 53 6f 20 74 68 65 72 65 20 69 73 20  y.  So there is 
03b0: 6e 6f 74 0a 2a 2a 20 61 20 63 6f 6d 70 65 6c 6c  not.** a compell
03c0: 69 6e 67 20 6e 65 65 64 20 74 6f 20 75 73 65 20  ing need to use 
03d0: 74 68 65 20 77 72 61 70 70 65 72 73 2e 0a 2a 2a  the wrappers..**
03e0: 0a 2a 2a 20 42 75 74 20 74 68 65 72 65 20 69 73  .** But there is
03f0: 20 61 20 67 6f 6f 64 20 72 65 61 73 6f 6e 20 74   a good reason t
0400: 6f 20 6e 6f 74 20 75 73 65 20 74 68 65 20 77 72  o not use the wr
0410: 61 70 70 65 72 73 2e 20 20 49 66 20 77 65 20 75  appers.  If we u
0420: 73 65 20 74 68 65 0a 2a 2a 20 77 72 61 70 70 65  se the.** wrappe
0430: 72 73 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20  rs then we will 
0440: 67 65 74 20 73 69 6d 75 6c 61 74 65 64 20 6d 61  get simulated ma
0450: 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 73 20  lloc() failures 
0460: 77 69 74 68 69 6e 20 74 68 69 73 0a 2a 2a 20 64  within this.** d
0470: 72 69 76 65 72 2e 20 20 41 6e 64 20 74 68 61 74  river.  And that
0480: 20 63 61 75 73 65 73 20 61 6c 6c 20 6b 69 6e 64   causes all kind
0490: 73 20 6f 66 20 70 72 6f 62 6c 65 6d 73 20 66 6f  s of problems fo
04a0: 72 20 6f 75 72 20 74 65 73 74 73 2e 20 20 57 65  r our tests.  We
04b0: 0a 2a 2a 20 63 6f 75 6c 64 20 65 6e 68 61 6e 63  .** could enhanc
04c0: 65 20 53 51 4c 69 74 65 20 74 6f 20 64 65 61 6c  e SQLite to deal
04d0: 20 77 69 74 68 20 73 69 6d 75 6c 61 74 65 64 20   with simulated 
04e0: 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 73 20  malloc failures 
04f0: 77 69 74 68 69 6e 0a 2a 2a 20 74 68 65 20 4f 53  within.** the OS
0500: 20 64 72 69 76 65 72 2c 20 62 75 74 20 74 68 65   driver, but the
0510: 20 63 6f 64 65 20 74 6f 20 64 65 61 6c 20 77 69   code to deal wi
0520: 74 68 20 74 68 6f 73 65 20 66 61 69 6c 75 72 65  th those failure
0530: 20 77 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 62 65   would not.** be
0540: 20 65 78 65 72 63 69 73 65 64 20 6f 6e 20 4c 69   exercised on Li
0550: 6e 75 78 20 28 77 68 69 63 68 20 64 6f 65 73 20  nux (which does 
0560: 6e 6f 74 20 6e 65 65 64 20 74 6f 20 6d 61 6c 6c  not need to mall
0570: 6f 63 28 29 20 69 6e 20 74 68 65 20 64 72 69 76  oc() in the driv
0580: 65 72 29 0a 2a 2a 20 61 6e 64 20 73 6f 20 77 65  er).** and so we
0590: 20 77 6f 75 6c 64 20 68 61 76 65 20 64 69 66 66   would have diff
05a0: 69 63 75 6c 74 79 20 77 72 69 74 69 6e 67 20 63  iculty writing c
05b0: 6f 76 65 72 61 67 65 20 74 65 73 74 73 20 66 6f  overage tests fo
05c0: 72 20 74 68 61 74 0a 2a 2a 20 63 6f 64 65 2e 20  r that.** code. 
05d0: 20 42 65 74 74 65 72 20 74 6f 20 6c 65 61 76 65   Better to leave
05e0: 20 74 68 65 20 63 6f 64 65 20 6f 75 74 2c 20 77   the code out, w
05f0: 65 20 74 68 69 6e 6b 2e 0a 2a 2a 0a 2a 2a 20 54  e think..**.** T
0600: 68 65 20 70 6f 69 6e 74 20 6f 66 20 74 68 69 73  he point of this
0610: 20 64 69 73 63 75 73 73 69 6f 6e 20 69 73 20 61   discussion is a
0620: 73 20 66 6f 6c 6c 6f 77 73 3a 20 20 57 68 65 6e  s follows:  When
0630: 20 63 72 65 61 74 69 6e 67 20 61 20 6e 65 77 0a   creating a new.
0640: 2a 2a 20 4f 53 20 6c 61 79 65 72 20 66 6f 72 20  ** OS layer for 
0650: 61 6e 20 65 6d 62 65 64 64 65 64 20 73 79 73 74  an embedded syst
0660: 65 6d 2c 20 69 66 20 79 6f 75 20 75 73 65 20 74  em, if you use t
0670: 68 69 73 20 66 69 6c 65 20 61 73 20 61 6e 20 65  his file as an e
0680: 78 61 6d 70 6c 65 2c 0a 2a 2a 20 61 76 6f 69 64  xample,.** avoid
0690: 20 74 68 65 20 75 73 65 20 6f 66 20 6d 61 6c 6c   the use of mall
06a0: 6f 63 28 29 2f 66 72 65 65 28 29 2e 20 20 54 68  oc()/free().  Th
06b0: 6f 73 65 20 72 6f 75 74 69 6e 65 73 20 77 6f 72  ose routines wor
06c0: 6b 20 6f 6b 20 6f 6e 20 4f 53 2f 32 0a 2a 2a 20  k ok on OS/2.** 
06d0: 64 65 73 6b 74 6f 70 73 20 62 75 74 20 6e 6f 74  desktops but not
06e0: 20 73 6f 20 77 65 6c 6c 20 69 6e 20 65 6d 62 65   so well in embe
06f0: 64 64 65 64 20 73 79 73 74 65 6d 73 2e 0a 2a 2f  dded systems..*/
0700: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 63 72 6f 73 20 75  ../*.** Macros u
0710: 73 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  sed to determine
0720: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
0730: 74 6f 20 75 73 65 20 74 68 72 65 61 64 73 2e 0a  to use threads..
0740: 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  */.#if defined(S
0750: 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
0760: 29 20 26 26 20 53 51 4c 49 54 45 5f 54 48 52 45  ) && SQLITE_THRE
0770: 41 44 53 41 46 45 0a 23 20 64 65 66 69 6e 65 20  ADSAFE.# define 
0780: 53 51 4c 49 54 45 5f 4f 53 32 5f 54 48 52 45 41  SQLITE_OS2_THREA
0790: 44 53 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  DS 1.#endif../*.
07a0: 2a 2a 20 49 6e 63 6c 75 64 65 20 63 6f 64 65 20  ** Include code 
07b0: 74 68 61 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 74  that is common t
07c0: 6f 20 61 6c 6c 20 6f 73 5f 2a 2e 63 20 66 69 6c  o all os_*.c fil
07d0: 65 73 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22  es.*/.#include "
07e0: 6f 73 5f 63 6f 6d 6d 6f 6e 2e 68 22 0a 0a 2f 2a  os_common.h"../*
07f0: 0a 2a 2a 20 54 68 65 20 6f 73 32 46 69 6c 65 20  .** The os2File 
0800: 73 74 72 75 63 74 75 72 65 20 69 73 20 73 75 62  structure is sub
0810: 63 6c 61 73 73 20 6f 66 20 73 71 6c 69 74 65 33  class of sqlite3
0820: 5f 66 69 6c 65 20 73 70 65 63 69 66 69 63 20 66  _file specific f
0830: 6f 72 20 74 68 65 20 4f 53 2f 32 0a 2a 2a 20 70  or the OS/2.** p
0840: 72 6f 74 61 62 69 6c 69 74 79 20 6c 61 79 65 72  rotability layer
0850: 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
0860: 75 63 74 20 6f 73 32 46 69 6c 65 20 6f 73 32 46  uct os2File os2F
0870: 69 6c 65 3b 0a 73 74 72 75 63 74 20 6f 73 32 46  ile;.struct os2F
0880: 69 6c 65 20 7b 0a 20 20 63 6f 6e 73 74 20 73 71  ile {.  const sq
0890: 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
08a0: 20 2a 70 4d 65 74 68 6f 64 3b 20 20 2f 2a 20 41   *pMethod;  /* A
08b0: 6c 77 61 79 73 20 74 68 65 20 66 69 72 73 74 20  lways the first 
08c0: 65 6e 74 72 79 20 2a 2f 0a 20 20 48 46 49 4c 45  entry */.  HFILE
08d0: 20 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   h;             
08e0: 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 66       /* Handle f
08f0: 6f 72 20 61 63 63 65 73 73 69 6e 67 20 74 68 65  or accessing the
0900: 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 2a   file */.  char*
0910: 20 70 61 74 68 54 6f 44 65 6c 3b 20 20 20 20 20   pathToDel;     
0920: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
0930: 66 69 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 6f  file to delete o
0940: 6e 20 63 6c 6f 73 65 2c 20 4e 55 4c 4c 20 69 66  n close, NULL if
0950: 20 6e 6f 74 20 2a 2f 0a 20 20 75 6e 73 69 67 6e   not */.  unsign
0960: 65 64 20 63 68 61 72 20 6c 6f 63 6b 74 79 70 65  ed char locktype
0970: 3b 20 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 6c  ;   /* Type of l
0980: 6f 63 6b 20 63 75 72 72 65 6e 74 6c 79 20 68 65  ock currently he
0990: 6c 64 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 20  ld on this file 
09a0: 2a 2f 0a 7d 3b 0a 0a 23 64 65 66 69 6e 65 20 4c  */.};..#define L
09b0: 4f 43 4b 5f 54 49 4d 45 4f 55 54 20 31 30 4c 20  OCK_TIMEOUT 10L 
09c0: 2f 2a 20 74 68 65 20 64 65 66 61 75 6c 74 20 6c  /* the default l
09d0: 6f 63 6b 69 6e 67 20 74 69 6d 65 6f 75 74 20 2a  ocking timeout *
09e0: 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /../************
09f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0a00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0a10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0a20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0a30: 2a 0a 2a 2a 20 54 68 65 20 6e 65 78 74 20 67 72  *.** The next gr
0a40: 6f 75 70 20 6f 66 20 72 6f 75 74 69 6e 65 73 20  oup of routines 
0a50: 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 49 2f  implement the I/
0a60: 4f 20 6d 65 74 68 6f 64 73 20 73 70 65 63 69 66  O methods specif
0a70: 69 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 73 71  ied.** by the sq
0a80: 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
0a90: 20 6f 62 6a 65 63 74 2e 0a 2a 2a 2a 2a 2a 2a 2a   object..*******
0aa0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0ab0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0ac0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0ad0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0ae0: 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  *******/../*.** 
0af0: 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2f  Close a file..*/
0b00: 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 73 32 43  .static int os2C
0b10: 6c 6f 73 65 28 20 73 71 6c 69 74 65 33 5f 66 69  lose( sqlite3_fi
0b20: 6c 65 20 2a 69 64 20 29 7b 0a 20 20 41 50 49 52  le *id ){.  APIR
0b30: 45 54 20 72 63 20 3d 20 4e 4f 5f 45 52 52 4f 52  ET rc = NO_ERROR
0b40: 3b 0a 20 20 6f 73 32 46 69 6c 65 20 2a 70 46 69  ;.  os2File *pFi
0b50: 6c 65 3b 0a 20 20 69 66 28 20 69 64 20 26 26 20  le;.  if( id && 
0b60: 28 70 46 69 6c 65 20 3d 20 28 6f 73 32 46 69 6c  (pFile = (os2Fil
0b70: 65 2a 29 69 64 29 20 21 3d 20 30 20 29 7b 0a 20  e*)id) != 0 ){. 
0b80: 20 20 20 4f 53 54 52 41 43 45 28 28 20 22 43 4c     OSTRACE(( "CL
0b90: 4f 53 45 20 25 64 5c 6e 22 2c 20 70 46 69 6c 65  OSE %d\n", pFile
0ba0: 2d 3e 68 20 29 29 3b 0a 20 20 20 20 72 63 20 3d  ->h ));.    rc =
0bb0: 20 44 6f 73 43 6c 6f 73 65 28 20 70 46 69 6c 65   DosClose( pFile
0bc0: 2d 3e 68 20 29 3b 0a 20 20 20 20 70 46 69 6c 65  ->h );.    pFile
0bd0: 2d 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 4e 4f 5f  ->locktype = NO_
0be0: 4c 4f 43 4b 3b 0a 20 20 20 20 69 66 28 20 70 46  LOCK;.    if( pF
0bf0: 69 6c 65 2d 3e 70 61 74 68 54 6f 44 65 6c 20 21  ile->pathToDel !
0c00: 3d 20 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20  = NULL ){.      
0c10: 72 63 20 3d 20 44 6f 73 46 6f 72 63 65 44 65 6c  rc = DosForceDel
0c20: 65 74 65 28 20 28 50 53 5a 29 70 46 69 6c 65 2d  ete( (PSZ)pFile-
0c30: 3e 70 61 74 68 54 6f 44 65 6c 20 29 3b 0a 20 20  >pathToDel );.  
0c40: 20 20 20 20 66 72 65 65 28 20 70 46 69 6c 65 2d      free( pFile-
0c50: 3e 70 61 74 68 54 6f 44 65 6c 20 29 3b 0a 20 20  >pathToDel );.  
0c60: 20 20 20 20 70 46 69 6c 65 2d 3e 70 61 74 68 54      pFile->pathT
0c70: 6f 44 65 6c 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  oDel = NULL;.   
0c80: 20 7d 0a 20 20 20 20 69 64 20 3d 20 30 3b 0a 20   }.    id = 0;. 
0c90: 20 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 20     OpenCounter( 
0ca0: 2d 31 20 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  -1 );.  }..  ret
0cb0: 75 72 6e 20 72 63 20 3d 3d 20 4e 4f 5f 45 52 52  urn rc == NO_ERR
0cc0: 4f 52 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a  OR ? SQLITE_OK :
0cd0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 7d   SQLITE_IOERR;.}
0ce0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 64 61 74  ../*.** Read dat
0cf0: 61 20 66 72 6f 6d 20 61 20 66 69 6c 65 20 69 6e  a from a file in
0d00: 74 6f 20 61 20 62 75 66 66 65 72 2e 20 20 52 65  to a buffer.  Re
0d10: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  turn SQLITE_OK i
0d20: 66 20 61 6c 6c 0a 2a 2a 20 62 79 74 65 73 20 77  f all.** bytes w
0d30: 65 72 65 20 72 65 61 64 20 73 75 63 63 65 73 73  ere read success
0d40: 66 75 6c 6c 79 20 61 6e 64 20 53 51 4c 49 54 45  fully and SQLITE
0d50: 5f 49 4f 45 52 52 20 69 66 20 61 6e 79 74 68 69  _IOERR if anythi
0d60: 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67  ng goes.** wrong
0d70: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
0d80: 6f 73 32 52 65 61 64 28 0a 20 20 73 71 6c 69 74  os2Read(.  sqlit
0d90: 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 20 20 20  e3_file *id,    
0da0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
0db0: 6c 65 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20  le to read from 
0dc0: 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c  */.  void *pBuf,
0dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0de0: 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 63 6f       /* Write co
0df0: 6e 74 65 6e 74 20 69 6e 74 6f 20 74 68 69 73 20  ntent into this 
0e00: 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20  buffer */.  int 
0e10: 61 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  amt,            
0e20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
0e30: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
0e40: 6f 20 72 65 61 64 20 2a 2f 0a 20 20 73 71 6c 69  o read */.  sqli
0e50: 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74  te3_int64 offset
0e60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
0e70: 65 67 69 6e 20 72 65 61 64 69 6e 67 20 61 74 20  egin reading at 
0e80: 74 68 69 73 20 6f 66 66 73 65 74 20 2a 2f 0a 29  this offset */.)
0e90: 7b 0a 20 20 55 4c 4f 4e 47 20 66 69 6c 65 4c 6f  {.  ULONG fileLo
0ea0: 63 61 74 69 6f 6e 20 3d 20 30 4c 3b 0a 20 20 55  cation = 0L;.  U
0eb0: 4c 4f 4e 47 20 67 6f 74 3b 0a 20 20 6f 73 32 46  LONG got;.  os2F
0ec0: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 6f 73  ile *pFile = (os
0ed0: 32 46 69 6c 65 2a 29 69 64 3b 0a 20 20 61 73 73  2File*)id;.  ass
0ee0: 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20  ert( id!=0 );.  
0ef0: 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
0f00: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
0f10: 4f 45 52 52 5f 52 45 41 44 20 29 3b 0a 20 20 4f  OERR_READ );.  O
0f20: 53 54 52 41 43 45 28 28 20 22 52 45 41 44 20 25  STRACE(( "READ %
0f30: 64 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 20 70 46  d lock=%d\n", pF
0f40: 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 6c  ile->h, pFile->l
0f50: 6f 63 6b 74 79 70 65 20 29 29 3b 0a 20 20 69 66  ocktype ));.  if
0f60: 28 20 44 6f 73 53 65 74 46 69 6c 65 50 74 72 28  ( DosSetFilePtr(
0f70: 70 46 69 6c 65 2d 3e 68 2c 20 6f 66 66 73 65 74  pFile->h, offset
0f80: 2c 20 46 49 4c 45 5f 42 45 47 49 4e 2c 20 26 66  , FILE_BEGIN, &f
0f90: 69 6c 65 4c 6f 63 61 74 69 6f 6e 29 20 21 3d 20  ileLocation) != 
0fa0: 4e 4f 5f 45 52 52 4f 52 20 29 7b 0a 20 20 20 20  NO_ERROR ){.    
0fb0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
0fc0: 45 52 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 44  ERR;.  }.  if( D
0fd0: 6f 73 52 65 61 64 28 20 70 46 69 6c 65 2d 3e 68  osRead( pFile->h
0fe0: 2c 20 70 42 75 66 2c 20 61 6d 74 2c 20 26 67 6f  , pBuf, amt, &go
0ff0: 74 20 29 20 21 3d 20 4e 4f 5f 45 52 52 4f 52 20  t ) != NO_ERROR 
1000: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
1010: 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 3b  LITE_IOERR_READ;
1020: 0a 20 20 7d 0a 20 20 69 66 28 20 67 6f 74 20 3d  .  }.  if( got =
1030: 3d 20 28 55 4c 4f 4e 47 29 61 6d 74 20 29 0a 20  = (ULONG)amt ). 
1040: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1050: 5f 4f 4b 3b 0a 20 20 65 6c 73 65 20 7b 0a 20 20  _OK;.  else {.  
1060: 20 20 2f 2a 20 55 6e 72 65 61 64 20 70 6f 72 74    /* Unread port
1070: 69 6f 6e 73 20 6f 66 20 74 68 65 20 69 6e 70 75  ions of the inpu
1080: 74 20 62 75 66 66 65 72 20 6d 75 73 74 20 62 65  t buffer must be
1090: 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 2a 2f 0a   zero-filled */.
10a0: 20 20 20 20 6d 65 6d 73 65 74 28 26 28 28 63 68      memset(&((ch
10b0: 61 72 2a 29 70 42 75 66 29 5b 67 6f 74 5d 2c 20  ar*)pBuf)[got], 
10c0: 30 2c 20 61 6d 74 2d 67 6f 74 29 3b 0a 20 20 20  0, amt-got);.   
10d0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
10e0: 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 3b  OERR_SHORT_READ;
10f0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72  .  }.}../*.** Wr
1100: 69 74 65 20 64 61 74 61 20 66 72 6f 6d 20 61 20  ite data from a 
1110: 62 75 66 66 65 72 20 69 6e 74 6f 20 61 20 66 69  buffer into a fi
1120: 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  le.  Return SQLI
1130: 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
1140: 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65  .** or some othe
1150: 72 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 6e 20  r error code on 
1160: 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74  failure..*/.stat
1170: 69 63 20 69 6e 74 20 6f 73 32 57 72 69 74 65 28  ic int os2Write(
1180: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
1190: 2a 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  *id,            
11a0: 20 20 20 2f 2a 20 46 69 6c 65 20 74 6f 20 77 72     /* File to wr
11b0: 69 74 65 20 69 6e 74 6f 20 2a 2f 0a 20 20 63 6f  ite into */.  co
11c0: 6e 73 74 20 76 6f 69 64 20 2a 70 42 75 66 2c 20  nst void *pBuf, 
11d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11e0: 20 54 68 65 20 62 79 74 65 73 20 74 6f 20 62 65   The bytes to be
11f0: 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 69 6e   written */.  in
1200: 74 20 61 6d 74 2c 20 20 20 20 20 20 20 20 20 20  t amt,          
1210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1220: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
1230: 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20 73   to write */.  s
1240: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66  qlite3_int64 off
1250: 73 65 74 20 20 20 20 20 20 20 20 20 20 20 20 2f  set            /
1260: 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 74 68  * Offset into th
1270: 65 20 66 69 6c 65 20 74 6f 20 62 65 67 69 6e 20  e file to begin 
1280: 77 72 69 74 69 6e 67 20 61 74 20 2a 2f 0a 29 7b  writing at */.){
1290: 0a 20 20 55 4c 4f 4e 47 20 66 69 6c 65 4c 6f 63  .  ULONG fileLoc
12a0: 61 74 69 6f 6e 20 3d 20 30 4c 3b 0a 20 20 41 50  ation = 0L;.  AP
12b0: 49 52 45 54 20 72 63 20 3d 20 4e 4f 5f 45 52 52  IRET rc = NO_ERR
12c0: 4f 52 3b 0a 20 20 55 4c 4f 4e 47 20 77 72 6f 74  OR;.  ULONG wrot
12d0: 65 3b 0a 20 20 6f 73 32 46 69 6c 65 20 2a 70 46  e;.  os2File *pF
12e0: 69 6c 65 20 3d 20 28 6f 73 32 46 69 6c 65 2a 29  ile = (os2File*)
12f0: 69 64 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64  id;.  assert( id
1300: 21 3d 30 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74  !=0 );.  Simulat
1310: 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
1320: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52   SQLITE_IOERR_WR
1330: 49 54 45 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74  ITE );.  Simulat
1340: 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28 20  eDiskfullError( 
1350: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55  return SQLITE_FU
1360: 4c 4c 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  LL );.  OSTRACE(
1370: 28 20 22 57 52 49 54 45 20 25 64 20 6c 6f 63 6b  ( "WRITE %d lock
1380: 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  =%d\n", pFile->h
1390: 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  , pFile->locktyp
13a0: 65 20 29 29 3b 0a 20 20 69 66 28 20 44 6f 73 53  e ));.  if( DosS
13b0: 65 74 46 69 6c 65 50 74 72 28 70 46 69 6c 65 2d  etFilePtr(pFile-
13c0: 3e 68 2c 20 6f 66 66 73 65 74 2c 20 46 49 4c 45  >h, offset, FILE
13d0: 5f 42 45 47 49 4e 2c 20 26 66 69 6c 65 4c 6f 63  _BEGIN, &fileLoc
13e0: 61 74 69 6f 6e 29 20 21 3d 20 4e 4f 5f 45 52 52  ation) != NO_ERR
13f0: 4f 52 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OR ){.    return
1400: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20   SQLITE_IOERR;. 
1410: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 61 6d 74   }.  assert( amt
1420: 3e 30 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 61  >0 );.  while( a
1430: 6d 74 20 3e 20 30 20 26 26 0a 20 20 20 20 20 20  mt > 0 &&.      
1440: 20 20 20 28 20 72 63 20 3d 20 44 6f 73 57 72 69     ( rc = DosWri
1450: 74 65 28 20 70 46 69 6c 65 2d 3e 68 2c 20 28 50  te( pFile->h, (P
1460: 56 4f 49 44 29 70 42 75 66 2c 20 61 6d 74 2c 20  VOID)pBuf, amt, 
1470: 26 77 72 6f 74 65 20 29 20 29 20 3d 3d 20 4e 4f  &wrote ) ) == NO
1480: 5f 45 52 52 4f 52 20 26 26 0a 20 20 20 20 20 20  _ERROR &&.      
1490: 20 20 20 77 72 6f 74 65 20 3e 20 30 0a 20 20 29     wrote > 0.  )
14a0: 7b 0a 20 20 20 20 61 6d 74 20 2d 3d 20 77 72 6f  {.    amt -= wro
14b0: 74 65 3b 0a 20 20 20 20 70 42 75 66 20 3d 20 26  te;.    pBuf = &
14c0: 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b 77 72  ((char*)pBuf)[wr
14d0: 6f 74 65 5d 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  ote];.  }..  ret
14e0: 75 72 6e 20 28 20 72 63 20 21 3d 20 4e 4f 5f 45  urn ( rc != NO_E
14f0: 52 52 4f 52 20 7c 7c 20 61 6d 74 20 3e 20 28 69  RROR || amt > (i
1500: 6e 74 29 77 72 6f 74 65 20 29 20 3f 20 53 51 4c  nt)wrote ) ? SQL
1510: 49 54 45 5f 46 55 4c 4c 20 3a 20 53 51 4c 49 54  ITE_FULL : SQLIT
1520: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
1530: 72 75 6e 63 61 74 65 20 61 6e 20 6f 70 65 6e 20  runcate an open 
1540: 66 69 6c 65 20 74 6f 20 61 20 73 70 65 63 69 66  file to a specif
1550: 69 65 64 20 73 69 7a 65 0a 2a 2f 0a 73 74 61 74  ied size.*/.stat
1560: 69 63 20 69 6e 74 20 6f 73 32 54 72 75 6e 63 61  ic int os2Trunca
1570: 74 65 28 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  te( sqlite3_file
1580: 20 2a 69 64 2c 20 69 36 34 20 6e 42 79 74 65 20   *id, i64 nByte 
1590: 29 7b 0a 20 20 41 50 49 52 45 54 20 72 63 20 3d  ){.  APIRET rc =
15a0: 20 4e 4f 5f 45 52 52 4f 52 3b 0a 20 20 6f 73 32   NO_ERROR;.  os2
15b0: 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 6f  File *pFile = (o
15c0: 73 32 46 69 6c 65 2a 29 69 64 3b 0a 20 20 4f 53  s2File*)id;.  OS
15d0: 54 52 41 43 45 28 28 20 22 54 52 55 4e 43 41 54  TRACE(( "TRUNCAT
15e0: 45 20 25 64 20 25 6c 6c 64 5c 6e 22 2c 20 70 46  E %d %lld\n", pF
15f0: 69 6c 65 2d 3e 68 2c 20 6e 42 79 74 65 20 29 29  ile->h, nByte ))
1600: 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
1610: 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
1620: 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54  TE_IOERR_TRUNCAT
1630: 45 20 29 3b 0a 20 20 72 63 20 3d 20 44 6f 73 53  E );.  rc = DosS
1640: 65 74 46 69 6c 65 53 69 7a 65 28 20 70 46 69 6c  etFileSize( pFil
1650: 65 2d 3e 68 2c 20 6e 42 79 74 65 20 29 3b 0a 20  e->h, nByte );. 
1660: 20 72 65 74 75 72 6e 20 72 63 20 3d 3d 20 4e 4f   return rc == NO
1670: 5f 45 52 52 4f 52 20 3f 20 53 51 4c 49 54 45 5f  _ERROR ? SQLITE_
1680: 4f 4b 20 3a 20 53 51 4c 49 54 45 5f 49 4f 45 52  OK : SQLITE_IOER
1690: 52 5f 54 52 55 4e 43 41 54 45 3b 0a 7d 0a 0a 23  R_TRUNCATE;.}..#
16a0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
16b0: 54 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68  T./*.** Count th
16c0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c  e number of full
16d0: 73 79 6e 63 73 20 61 6e 64 20 6e 6f 72 6d 61 6c  syncs and normal
16e0: 20 73 79 6e 63 73 2e 20 20 54 68 69 73 20 69 73   syncs.  This is
16f0: 20 75 73 65 64 20 74 6f 20 74 65 73 74 0a 2a 2a   used to test.**
1700: 20 74 68 61 74 20 73 79 6e 63 73 20 61 6e 64 20   that syncs and 
1710: 66 75 6c 6c 73 79 6e 63 73 20 61 72 65 20 6f 63  fullsyncs are oc
1720: 63 75 72 69 6e 67 20 61 74 20 74 68 65 20 72 69  curing at the ri
1730: 67 68 74 20 74 69 6d 65 73 2e 0a 2a 2f 0a 69 6e  ght times..*/.in
1740: 74 20 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63  t sqlite3_sync_c
1750: 6f 75 6e 74 20 3d 20 30 3b 0a 69 6e 74 20 73 71  ount = 0;.int sq
1760: 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63  lite3_fullsync_c
1770: 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66  ount = 0;.#endif
1780: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ../*.** Make sur
1790: 65 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20  e all writes to 
17a0: 61 20 70 61 72 74 69 63 75 6c 61 72 20 66 69 6c  a particular fil
17b0: 65 20 61 72 65 20 63 6f 6d 6d 69 74 74 65 64 20  e are committed 
17c0: 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74  to disk..*/.stat
17d0: 69 63 20 69 6e 74 20 6f 73 32 53 79 6e 63 28 20  ic int os2Sync( 
17e0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
17f0: 2c 20 69 6e 74 20 66 6c 61 67 73 20 29 7b 0a 20  , int flags ){. 
1800: 20 6f 73 32 46 69 6c 65 20 2a 70 46 69 6c 65 20   os2File *pFile 
1810: 3d 20 28 6f 73 32 46 69 6c 65 2a 29 69 64 3b 0a  = (os2File*)id;.
1820: 20 20 4f 53 54 52 41 43 45 28 28 20 22 53 59 4e    OSTRACE(( "SYN
1830: 43 20 25 64 20 6c 6f 63 6b 3d 25 64 5c 6e 22 2c  C %d lock=%d\n",
1840: 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65   pFile->h, pFile
1850: 2d 3e 6c 6f 63 6b 74 79 70 65 20 29 29 3b 0a 23  ->locktype ));.#
1860: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
1870: 54 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20  T.  if( flags & 
1880: 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c  SQLITE_SYNC_FULL
1890: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
18a0: 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b  ullsync_count++;
18b0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73  .  }.  sqlite3_s
18c0: 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e  ync_count++;.#en
18d0: 64 69 66 0a 20 20 2f 2a 20 49 66 20 77 65 20 63  dif.  /* If we c
18e0: 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 74 68 65  ompiled with the
18f0: 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20   SQLITE_NO_SYNC 
1900: 66 6c 61 67 2c 20 74 68 65 6e 20 73 79 6e 63 69  flag, then synci
1910: 6e 67 20 69 73 20 61 0a 20 20 2a 2a 20 6e 6f 2d  ng is a.  ** no-
1920: 6f 70 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  op.  */.#ifdef S
1930: 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20  QLITE_NO_SYNC.  
1940: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
1950: 28 70 46 69 6c 65 29 3b 0a 20 20 72 65 74 75 72  (pFile);.  retur
1960: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c  n SQLITE_OK;.#el
1970: 73 65 0a 20 20 72 65 74 75 72 6e 20 44 6f 73 52  se.  return DosR
1980: 65 73 65 74 42 75 66 66 65 72 28 20 70 46 69 6c  esetBuffer( pFil
1990: 65 2d 3e 68 20 29 20 3d 3d 20 4e 4f 5f 45 52 52  e->h ) == NO_ERR
19a0: 4f 52 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a  OR ? SQLITE_OK :
19b0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 23   SQLITE_IOERR;.#
19c0: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  endif.}../*.** D
19d0: 65 74 65 72 6d 69 6e 65 20 74 68 65 20 63 75 72  etermine the cur
19e0: 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 61 20 66  rent size of a f
19f0: 69 6c 65 20 69 6e 20 62 79 74 65 73 0a 2a 2f 0a  ile in bytes.*/.
1a00: 73 74 61 74 69 63 20 69 6e 74 20 6f 73 32 46 69  static int os2Fi
1a10: 6c 65 53 69 7a 65 28 20 73 71 6c 69 74 65 33 5f  leSize( sqlite3_
1a20: 66 69 6c 65 20 2a 69 64 2c 20 73 71 6c 69 74 65  file *id, sqlite
1a30: 33 5f 69 6e 74 36 34 20 2a 70 53 69 7a 65 20 29  3_int64 *pSize )
1a40: 7b 0a 20 20 41 50 49 52 45 54 20 72 63 20 3d 20  {.  APIRET rc = 
1a50: 4e 4f 5f 45 52 52 4f 52 3b 0a 20 20 46 49 4c 45  NO_ERROR;.  FILE
1a60: 53 54 41 54 55 53 33 20 66 73 74 73 33 46 69 6c  STATUS3 fsts3Fil
1a70: 65 49 6e 66 6f 3b 0a 20 20 6d 65 6d 73 65 74 28  eInfo;.  memset(
1a80: 26 66 73 74 73 33 46 69 6c 65 49 6e 66 6f 2c 20  &fsts3FileInfo, 
1a90: 30 2c 20 73 69 7a 65 6f 66 28 66 73 74 73 33 46  0, sizeof(fsts3F
1aa0: 69 6c 65 49 6e 66 6f 29 29 3b 0a 20 20 61 73 73  ileInfo));.  ass
1ab0: 65 72 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20  ert( id!=0 );.  
1ac0: 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
1ad0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
1ae0: 4f 45 52 52 5f 46 53 54 41 54 20 29 3b 0a 20 20  OERR_FSTAT );.  
1af0: 72 63 20 3d 20 44 6f 73 51 75 65 72 79 46 69 6c  rc = DosQueryFil
1b00: 65 49 6e 66 6f 28 20 28 28 6f 73 32 46 69 6c 65  eInfo( ((os2File
1b10: 2a 29 69 64 29 2d 3e 68 2c 20 46 49 4c 5f 53 54  *)id)->h, FIL_ST
1b20: 41 4e 44 41 52 44 2c 20 26 66 73 74 73 33 46 69  ANDARD, &fsts3Fi
1b30: 6c 65 49 6e 66 6f 2c 20 73 69 7a 65 6f 66 28 46  leInfo, sizeof(F
1b40: 49 4c 45 53 54 41 54 55 53 33 29 20 29 3b 0a 20  ILESTATUS3) );. 
1b50: 20 69 66 28 20 72 63 20 3d 3d 20 4e 4f 5f 45 52   if( rc == NO_ER
1b60: 52 4f 52 20 29 7b 0a 20 20 20 20 2a 70 53 69 7a  ROR ){.    *pSiz
1b70: 65 20 3d 20 66 73 74 73 33 46 69 6c 65 49 6e 66  e = fsts3FileInf
1b80: 6f 2e 63 62 46 69 6c 65 3b 0a 20 20 20 20 72 65  o.cbFile;.    re
1b90: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1ba0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
1bb0: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
1bc0: 5f 46 53 54 41 54 3b 0a 20 20 7d 0a 7d 0a 0a 2f  _FSTAT;.  }.}../
1bd0: 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 72  *.** Acquire a r
1be0: 65 61 64 65 72 20 6c 6f 63 6b 2e 0a 2a 2f 0a 73  eader lock..*/.s
1bf0: 74 61 74 69 63 20 69 6e 74 20 67 65 74 52 65 61  tatic int getRea
1c00: 64 4c 6f 63 6b 28 20 6f 73 32 46 69 6c 65 20 2a  dLock( os2File *
1c10: 70 46 69 6c 65 20 29 7b 0a 20 20 46 49 4c 45 4c  pFile ){.  FILEL
1c20: 4f 43 4b 20 20 4c 6f 63 6b 41 72 65 61 2c 0a 20  OCK  LockArea,. 
1c30: 20 20 20 20 20 20 20 20 20 20 20 55 6e 6c 6f 63             Unloc
1c40: 6b 41 72 65 61 3b 0a 20 20 41 50 49 52 45 54 20  kArea;.  APIRET 
1c50: 72 65 73 3b 0a 20 20 6d 65 6d 73 65 74 28 26 4c  res;.  memset(&L
1c60: 6f 63 6b 41 72 65 61 2c 20 30 2c 20 73 69 7a 65  ockArea, 0, size
1c70: 6f 66 28 4c 6f 63 6b 41 72 65 61 29 29 3b 0a 20  of(LockArea));. 
1c80: 20 6d 65 6d 73 65 74 28 26 55 6e 6c 6f 63 6b 41   memset(&UnlockA
1c90: 72 65 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28 55  rea, 0, sizeof(U
1ca0: 6e 6c 6f 63 6b 41 72 65 61 29 29 3b 0a 20 20 4c  nlockArea));.  L
1cb0: 6f 63 6b 41 72 65 61 2e 6c 4f 66 66 73 65 74 20  ockArea.lOffset 
1cc0: 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a  = SHARED_FIRST;.
1cd0: 20 20 4c 6f 63 6b 41 72 65 61 2e 6c 52 61 6e 67    LockArea.lRang
1ce0: 65 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b  e = SHARED_SIZE;
1cf0: 0a 20 20 55 6e 6c 6f 63 6b 41 72 65 61 2e 6c 4f  .  UnlockArea.lO
1d00: 66 66 73 65 74 20 3d 20 30 4c 3b 0a 20 20 55 6e  ffset = 0L;.  Un
1d10: 6c 6f 63 6b 41 72 65 61 2e 6c 52 61 6e 67 65 20  lockArea.lRange 
1d20: 3d 20 30 4c 3b 0a 20 20 72 65 73 20 3d 20 44 6f  = 0L;.  res = Do
1d30: 73 53 65 74 46 69 6c 65 4c 6f 63 6b 73 28 20 70  sSetFileLocks( p
1d40: 46 69 6c 65 2d 3e 68 2c 20 26 55 6e 6c 6f 63 6b  File->h, &Unlock
1d50: 41 72 65 61 2c 20 26 4c 6f 63 6b 41 72 65 61 2c  Area, &LockArea,
1d60: 20 4c 4f 43 4b 5f 54 49 4d 45 4f 55 54 2c 20 31   LOCK_TIMEOUT, 1
1d70: 4c 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  L );.  OSTRACE((
1d80: 20 22 47 45 54 52 45 41 44 4c 4f 43 4b 20 25 64   "GETREADLOCK %d
1d90: 20 72 65 73 3d 25 64 5c 6e 22 2c 20 70 46 69 6c   res=%d\n", pFil
1da0: 65 2d 3e 68 2c 20 72 65 73 20 29 29 3b 0a 20 20  e->h, res ));.  
1db0: 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f  return res;.}../
1dc0: 2a 0a 2a 2a 20 55 6e 64 6f 20 61 20 72 65 61 64  *.** Undo a read
1dd0: 6c 6f 63 6b 0a 2a 2f 0a 73 74 61 74 69 63 20 69  lock.*/.static i
1de0: 6e 74 20 75 6e 6c 6f 63 6b 52 65 61 64 4c 6f 63  nt unlockReadLoc
1df0: 6b 28 20 6f 73 32 46 69 6c 65 20 2a 69 64 20 29  k( os2File *id )
1e00: 7b 0a 20 20 46 49 4c 45 4c 4f 43 4b 20 20 4c 6f  {.  FILELOCK  Lo
1e10: 63 6b 41 72 65 61 2c 0a 20 20 20 20 20 20 20 20  ckArea,.        
1e20: 20 20 20 20 55 6e 6c 6f 63 6b 41 72 65 61 3b 0a      UnlockArea;.
1e30: 20 20 41 50 49 52 45 54 20 72 65 73 3b 0a 20 20    APIRET res;.  
1e40: 6d 65 6d 73 65 74 28 26 4c 6f 63 6b 41 72 65 61  memset(&LockArea
1e50: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4c 6f 63 6b  , 0, sizeof(Lock
1e60: 41 72 65 61 29 29 3b 0a 20 20 6d 65 6d 73 65 74  Area));.  memset
1e70: 28 26 55 6e 6c 6f 63 6b 41 72 65 61 2c 20 30 2c  (&UnlockArea, 0,
1e80: 20 73 69 7a 65 6f 66 28 55 6e 6c 6f 63 6b 41 72   sizeof(UnlockAr
1e90: 65 61 29 29 3b 0a 20 20 4c 6f 63 6b 41 72 65 61  ea));.  LockArea
1ea0: 2e 6c 4f 66 66 73 65 74 20 3d 20 30 4c 3b 0a 20  .lOffset = 0L;. 
1eb0: 20 4c 6f 63 6b 41 72 65 61 2e 6c 52 61 6e 67 65   LockArea.lRange
1ec0: 20 3d 20 30 4c 3b 0a 20 20 55 6e 6c 6f 63 6b 41   = 0L;.  UnlockA
1ed0: 72 65 61 2e 6c 4f 66 66 73 65 74 20 3d 20 53 48  rea.lOffset = SH
1ee0: 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 55 6e  ARED_FIRST;.  Un
1ef0: 6c 6f 63 6b 41 72 65 61 2e 6c 52 61 6e 67 65 20  lockArea.lRange 
1f00: 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20  = SHARED_SIZE;. 
1f10: 20 72 65 73 20 3d 20 44 6f 73 53 65 74 46 69 6c   res = DosSetFil
1f20: 65 4c 6f 63 6b 73 28 20 69 64 2d 3e 68 2c 20 26  eLocks( id->h, &
1f30: 55 6e 6c 6f 63 6b 41 72 65 61 2c 20 26 4c 6f 63  UnlockArea, &Loc
1f40: 6b 41 72 65 61 2c 20 4c 4f 43 4b 5f 54 49 4d 45  kArea, LOCK_TIME
1f50: 4f 55 54 2c 20 31 4c 20 29 3b 0a 20 20 4f 53 54  OUT, 1L );.  OST
1f60: 52 41 43 45 28 28 20 22 55 4e 4c 4f 43 4b 2d 52  RACE(( "UNLOCK-R
1f70: 45 41 44 4c 4f 43 4b 20 66 69 6c 65 20 68 61 6e  EADLOCK file han
1f80: 64 6c 65 3d 25 64 20 72 65 73 3d 25 64 3f 5c 6e  dle=%d res=%d?\n
1f90: 22 2c 20 69 64 2d 3e 68 2c 20 72 65 73 20 29 29  ", id->h, res ))
1fa0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a  ;.  return res;.
1fb0: 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68  }../*.** Lock th
1fc0: 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20  e file with the 
1fd0: 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20 62  lock specified b
1fe0: 79 20 70 61 72 61 6d 65 74 65 72 20 6c 6f 63 6b  y parameter lock
1ff0: 74 79 70 65 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66  type - one.** of
2000: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
2010: 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48  **.**     (1) SH
2020: 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  ARED_LOCK.**    
2030: 20 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f   (2) RESERVED_LO
2040: 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45  CK.**     (3) PE
2050: 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  NDING_LOCK.**   
2060: 20 20 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f    (4) EXCLUSIVE_
2070: 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74  LOCK.**.** Somet
2080: 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65 73  imes when reques
2090: 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74  ting one lock st
20a0: 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20  ate, additional 
20b0: 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61  lock states.** a
20c0: 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62  re inserted in b
20d0: 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63  etween.  The loc
20e0: 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20  king might fail 
20f0: 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61  on one of the la
2100: 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  ter.** transitio
2110: 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c  ns leaving the l
2120: 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66 65 72  ock state differ
2130: 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74  ent from what it
2140: 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20   started but.** 
2150: 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69  still short of i
2160: 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f  ts goal.  The fo
2170: 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68  llowing chart sh
2180: 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a  ows the allowed.
2190: 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61  ** transitions a
21a0: 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65 64 20  nd the inserted 
21b0: 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61  intermediate sta
21c0: 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e  tes:.**.**    UN
21d0: 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44  LOCKED -> SHARED
21e0: 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e  .**    SHARED ->
21f0: 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20   RESERVED.**    
2200: 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49  SHARED -> (PENDI
2210: 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  NG) -> EXCLUSIVE
2220: 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44 20  .**    RESERVED 
2230: 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20  -> (PENDING) -> 
2240: 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20  EXCLUSIVE.**    
2250: 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55  PENDING -> EXCLU
2260: 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  SIVE.**.** This 
2270: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c  routine will onl
2280: 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63  y increase a loc
2290: 6b 2e 20 20 54 68 65 20 6f 73 32 55 6e 6c 6f 63  k.  The os2Unloc
22a0: 6b 28 29 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 65  k() routine.** e
22b0: 72 61 73 65 73 20 61 6c 6c 20 6c 6f 63 6b 73 20  rases all locks 
22c0: 61 74 20 6f 6e 63 65 20 61 6e 64 20 72 65 74 75  at once and retu
22d0: 72 6e 73 20 75 73 20 69 6d 6d 65 64 69 61 74 65  rns us immediate
22e0: 6c 79 20 74 6f 20 6c 6f 63 6b 69 6e 67 20 6c 65  ly to locking le
22f0: 76 65 6c 20 30 2e 0a 2a 2a 20 49 74 20 69 73 20  vel 0..** It is 
2300: 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  not possible to 
2310: 6c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e  lower the lockin
2320: 67 20 6c 65 76 65 6c 20 6f 6e 65 20 73 74 65 70  g level one step
2330: 20 61 74 20 61 20 74 69 6d 65 2e 20 20 59 6f 75   at a time.  You
2340: 0a 2a 2a 20 6d 75 73 74 20 67 6f 20 73 74 72 61  .** must go stra
2350: 69 67 68 74 20 74 6f 20 6c 6f 63 6b 69 6e 67 20  ight to locking 
2360: 6c 65 76 65 6c 20 30 2e 0a 2a 2f 0a 73 74 61 74  level 0..*/.stat
2370: 69 63 20 69 6e 74 20 6f 73 32 4c 6f 63 6b 28 20  ic int os2Lock( 
2380: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
2390: 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 20 29  , int locktype )
23a0: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
23b0: 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 2f 2a  ITE_OK;       /*
23c0: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f   Return code fro
23d0: 6d 20 73 75 62 72 6f 75 74 69 6e 65 73 20 2a 2f  m subroutines */
23e0: 0a 20 20 41 50 49 52 45 54 20 72 65 73 20 3d 20  .  APIRET res = 
23f0: 4e 4f 5f 45 52 52 4f 52 3b 20 20 20 20 2f 2a 20  NO_ERROR;    /* 
2400: 52 65 73 75 6c 74 20 6f 66 20 61 6e 20 4f 53 2f  Result of an OS/
2410: 32 20 6c 6f 63 6b 20 63 61 6c 6c 20 2a 2f 0a 20  2 lock call */. 
2420: 20 69 6e 74 20 6e 65 77 4c 6f 63 6b 74 79 70 65   int newLocktype
2430: 3b 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 70  ;       /* Set p
2440: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 74  File->locktype t
2450: 6f 20 74 68 69 73 20 76 61 6c 75 65 20 62 65 66  o this value bef
2460: 6f 72 65 20 65 78 69 74 69 6e 67 20 2a 2f 0a 20  ore exiting */. 
2470: 20 69 6e 74 20 67 6f 74 50 65 6e 64 69 6e 67 4c   int gotPendingL
2480: 6f 63 6b 20 3d 20 30 3b 2f 2a 20 54 72 75 65 20  ock = 0;/* True 
2490: 69 66 20 77 65 20 61 63 71 75 69 72 65 64 20 61  if we acquired a
24a0: 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 74 68   PENDING lock th
24b0: 69 73 20 74 69 6d 65 20 2a 2f 0a 20 20 46 49 4c  is time */.  FIL
24c0: 45 4c 4f 43 4b 20 20 4c 6f 63 6b 41 72 65 61 2c  ELOCK  LockArea,
24d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 55 6e 6c  .            Unl
24e0: 6f 63 6b 41 72 65 61 3b 0a 20 20 6f 73 32 46 69  ockArea;.  os2Fi
24f0: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 6f 73 32  le *pFile = (os2
2500: 46 69 6c 65 2a 29 69 64 3b 0a 20 20 6d 65 6d 73  File*)id;.  mems
2510: 65 74 28 26 4c 6f 63 6b 41 72 65 61 2c 20 30 2c  et(&LockArea, 0,
2520: 20 73 69 7a 65 6f 66 28 4c 6f 63 6b 41 72 65 61   sizeof(LockArea
2530: 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 55 6e  ));.  memset(&Un
2540: 6c 6f 63 6b 41 72 65 61 2c 20 30 2c 20 73 69 7a  lockArea, 0, siz
2550: 65 6f 66 28 55 6e 6c 6f 63 6b 41 72 65 61 29 29  eof(UnlockArea))
2560: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ;.  assert( pFil
2570: 65 21 3d 30 20 29 3b 0a 20 20 4f 53 54 52 41 43  e!=0 );.  OSTRAC
2580: 45 28 28 20 22 4c 4f 43 4b 20 25 64 20 25 64 20  E(( "LOCK %d %d 
2590: 77 61 73 20 25 64 5c 6e 22 2c 20 70 46 69 6c 65  was %d\n", pFile
25a0: 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70 65 2c 20 70  ->h, locktype, p
25b0: 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 20 29  File->locktype )
25c0: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  );..  /* If ther
25d0: 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 6c  e is already a l
25e0: 6f 63 6b 20 6f 66 20 74 68 69 73 20 74 79 70 65  ock of this type
25f0: 20 6f 72 20 6d 6f 72 65 20 72 65 73 74 72 69 63   or more restric
2600: 74 69 76 65 20 6f 6e 20 74 68 65 0a 20 20 2a 2a  tive on the.  **
2610: 20 6f 73 32 46 69 6c 65 2c 20 64 6f 20 6e 6f 74   os2File, do not
2620: 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75 73 65 20  hing. Don't use 
2630: 74 68 65 20 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78  the end_lock: ex
2640: 69 74 20 70 61 74 68 2c 20 61 73 0a 20 20 2a 2a  it path, as.  **
2650: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
2660: 6e 74 65 72 28 29 20 68 61 73 6e 27 74 20 62 65  nter() hasn't be
2670: 65 6e 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a 20  en called yet.. 
2680: 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
2690: 3e 6c 6f 63 6b 74 79 70 65 3e 3d 6c 6f 63 6b 74  >locktype>=lockt
26a0: 79 70 65 20 29 7b 0a 20 20 20 20 4f 53 54 52 41  ype ){.    OSTRA
26b0: 43 45 28 28 20 22 4c 4f 43 4b 20 25 64 20 25 64  CE(( "LOCK %d %d
26c0: 20 6f 6b 20 28 61 6c 72 65 61 64 79 20 68 65 6c   ok (already hel
26d0: 64 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  d)\n", pFile->h,
26e0: 20 6c 6f 63 6b 74 79 70 65 20 29 29 3b 0a 20 20   locktype ));.  
26f0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2700: 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61  OK;.  }..  /* Ma
2710: 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63 6b  ke sure the lock
2720: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73 20  ing sequence is 
2730: 63 6f 72 72 65 63 74 0a 20 20 2a 2f 0a 20 20 61  correct.  */.  a
2740: 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 6c 6f  ssert( pFile->lo
2750: 63 6b 74 79 70 65 21 3d 4e 4f 5f 4c 4f 43 4b 20  cktype!=NO_LOCK 
2760: 7c 7c 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41  || locktype==SHA
2770: 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  RED_LOCK );.  as
2780: 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 21 3d  sert( locktype!=
2790: 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a  PENDING_LOCK );.
27a0: 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 74 79    assert( lockty
27b0: 70 65 21 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  pe!=RESERVED_LOC
27c0: 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b  K || pFile->lock
27d0: 74 79 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  type==SHARED_LOC
27e0: 4b 20 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 6b 20  K );..  /* Lock 
27f0: 74 68 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  the PENDING_LOCK
2800: 20 62 79 74 65 20 69 66 20 77 65 20 6e 65 65 64   byte if we need
2810: 20 74 6f 20 61 63 71 75 69 72 65 20 61 20 50 45   to acquire a PE
2820: 4e 44 49 4e 47 20 6c 6f 63 6b 20 6f 72 0a 20 20  NDING lock or.  
2830: 2a 2a 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  ** a SHARED lock
2840: 2e 20 20 49 66 20 77 65 20 61 72 65 20 61 63 71  .  If we are acq
2850: 75 69 72 69 6e 67 20 61 20 53 48 41 52 45 44 20  uiring a SHARED 
2860: 6c 6f 63 6b 2c 20 74 68 65 20 61 63 71 75 69 73  lock, the acquis
2870: 69 74 69 6f 6e 20 6f 66 0a 20 20 2a 2a 20 74 68  ition of.  ** th
2880: 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 62  e PENDING_LOCK b
2890: 79 74 65 20 69 73 20 74 65 6d 70 6f 72 61 72 79  yte is temporary
28a0: 2e 0a 20 20 2a 2f 0a 20 20 6e 65 77 4c 6f 63 6b  ..  */.  newLock
28b0: 74 79 70 65 20 3d 20 70 46 69 6c 65 2d 3e 6c 6f  type = pFile->lo
28c0: 63 6b 74 79 70 65 3b 0a 20 20 69 66 28 20 70 46  cktype;.  if( pF
28d0: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 4e  ile->locktype==N
28e0: 4f 5f 4c 4f 43 4b 0a 20 20 20 20 20 20 7c 7c 20  O_LOCK.      || 
28f0: 28 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c 55  (locktype==EXCLU
2900: 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 46 69  SIVE_LOCK && pFi
2910: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 52 45  le->locktype==RE
2920: 53 45 52 56 45 44 5f 4c 4f 43 4b 29 0a 20 20 29  SERVED_LOCK).  )
2930: 7b 0a 20 20 20 20 4c 6f 63 6b 41 72 65 61 2e 6c  {.    LockArea.l
2940: 4f 66 66 73 65 74 20 3d 20 50 45 4e 44 49 4e 47  Offset = PENDING
2950: 5f 42 59 54 45 3b 0a 20 20 20 20 4c 6f 63 6b 41  _BYTE;.    LockA
2960: 72 65 61 2e 6c 52 61 6e 67 65 20 3d 20 31 4c 3b  rea.lRange = 1L;
2970: 0a 20 20 20 20 55 6e 6c 6f 63 6b 41 72 65 61 2e  .    UnlockArea.
2980: 6c 4f 66 66 73 65 74 20 3d 20 30 4c 3b 0a 20 20  lOffset = 0L;.  
2990: 20 20 55 6e 6c 6f 63 6b 41 72 65 61 2e 6c 52 61    UnlockArea.lRa
29a0: 6e 67 65 20 3d 20 30 4c 3b 0a 0a 20 20 20 20 2f  nge = 0L;..    /
29b0: 2a 20 77 61 69 74 20 6c 6f 6e 67 65 72 20 74 68  * wait longer th
29c0: 61 6e 20 4c 4f 43 4b 5f 54 49 4d 45 4f 55 54 20  an LOCK_TIMEOUT 
29d0: 68 65 72 65 20 6e 6f 74 20 74 6f 20 68 61 76 65  here not to have
29e0: 20 74 6f 20 74 72 79 20 6d 75 6c 74 69 70 6c 65   to try multiple
29f0: 20 74 69 6d 65 73 20 2a 2f 0a 20 20 20 20 72 65   times */.    re
2a00: 73 20 3d 20 44 6f 73 53 65 74 46 69 6c 65 4c 6f  s = DosSetFileLo
2a10: 63 6b 73 28 20 70 46 69 6c 65 2d 3e 68 2c 20 26  cks( pFile->h, &
2a20: 55 6e 6c 6f 63 6b 41 72 65 61 2c 20 26 4c 6f 63  UnlockArea, &Loc
2a30: 6b 41 72 65 61 2c 20 31 30 30 4c 2c 20 30 4c 20  kArea, 100L, 0L 
2a40: 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73 20 3d  );.    if( res =
2a50: 3d 20 4e 4f 5f 45 52 52 4f 52 20 29 7b 0a 20 20  = NO_ERROR ){.  
2a60: 20 20 20 20 67 6f 74 50 65 6e 64 69 6e 67 4c 6f      gotPendingLo
2a70: 63 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 4f 53  ck = 1;.      OS
2a80: 54 52 41 43 45 28 28 20 22 4c 4f 43 4b 20 25 64  TRACE(( "LOCK %d
2a90: 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 20 62 6f   pending lock bo
2aa0: 6f 6c 65 61 6e 20 73 65 74 2e 20 20 72 65 73 3d  olean set.  res=
2ab0: 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  %d\n", pFile->h,
2ac0: 20 72 65 73 20 29 29 3b 0a 20 20 20 20 7d 0a 20   res ));.    }. 
2ad0: 20 7d 0a 0a 20 20 2f 2a 20 41 63 71 75 69 72 65   }..  /* Acquire
2ae0: 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 0a 20   a shared lock. 
2af0: 20 2a 2f 0a 20 20 69 66 28 20 6c 6f 63 6b 74 79   */.  if( lockty
2b00: 70 65 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  pe==SHARED_LOCK 
2b10: 26 26 20 72 65 73 20 3d 3d 20 4e 4f 5f 45 52 52  && res == NO_ERR
2b20: 4f 52 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  OR ){.    assert
2b30: 28 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  ( pFile->locktyp
2b40: 65 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 3b 0a 20 20  e==NO_LOCK );.  
2b50: 20 20 72 65 73 20 3d 20 67 65 74 52 65 61 64 4c    res = getReadL
2b60: 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20 20 20  ock(pFile);.    
2b70: 69 66 28 20 72 65 73 20 3d 3d 20 4e 4f 5f 45 52  if( res == NO_ER
2b80: 52 4f 52 20 29 7b 0a 20 20 20 20 20 20 6e 65 77  ROR ){.      new
2b90: 4c 6f 63 6b 74 79 70 65 20 3d 20 53 48 41 52 45  Locktype = SHARE
2ba0: 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20  D_LOCK;.    }.  
2bb0: 20 20 4f 53 54 52 41 43 45 28 28 20 22 4c 4f 43    OSTRACE(( "LOC
2bc0: 4b 20 25 64 20 61 63 71 75 69 72 65 20 73 68 61  K %d acquire sha
2bd0: 72 65 64 20 6c 6f 63 6b 2e 20 72 65 73 3d 25 64  red lock. res=%d
2be0: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72  \n", pFile->h, r
2bf0: 65 73 20 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  es ));.  }..  /*
2c00: 20 41 63 71 75 69 72 65 20 61 20 52 45 53 45 52   Acquire a RESER
2c10: 56 45 44 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20  VED lock.  */.  
2c20: 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 52 45  if( locktype==RE
2c30: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20 72  SERVED_LOCK && r
2c40: 65 73 20 3d 3d 20 4e 4f 5f 45 52 52 4f 52 20 29  es == NO_ERROR )
2c50: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46  {.    assert( pF
2c60: 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3d 3d 53  ile->locktype==S
2c70: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
2c80: 20 20 4c 6f 63 6b 41 72 65 61 2e 6c 4f 66 66 73    LockArea.lOffs
2c90: 65 74 20 3d 20 52 45 53 45 52 56 45 44 5f 42 59  et = RESERVED_BY
2ca0: 54 45 3b 0a 20 20 20 20 4c 6f 63 6b 41 72 65 61  TE;.    LockArea
2cb0: 2e 6c 52 61 6e 67 65 20 3d 20 31 4c 3b 0a 20 20  .lRange = 1L;.  
2cc0: 20 20 55 6e 6c 6f 63 6b 41 72 65 61 2e 6c 4f 66    UnlockArea.lOf
2cd0: 66 73 65 74 20 3d 20 30 4c 3b 0a 20 20 20 20 55  fset = 0L;.    U
2ce0: 6e 6c 6f 63 6b 41 72 65 61 2e 6c 52 61 6e 67 65  nlockArea.lRange
2cf0: 20 3d 20 30 4c 3b 0a 20 20 20 20 72 65 73 20 3d   = 0L;.    res =
2d00: 20 44 6f 73 53 65 74 46 69 6c 65 4c 6f 63 6b 73   DosSetFileLocks
2d10: 28 20 70 46 69 6c 65 2d 3e 68 2c 20 26 55 6e 6c  ( pFile->h, &Unl
2d20: 6f 63 6b 41 72 65 61 2c 20 26 4c 6f 63 6b 41 72  ockArea, &LockAr
2d30: 65 61 2c 20 4c 4f 43 4b 5f 54 49 4d 45 4f 55 54  ea, LOCK_TIMEOUT
2d40: 2c 20 30 4c 20 29 3b 0a 20 20 20 20 69 66 28 20  , 0L );.    if( 
2d50: 72 65 73 20 3d 3d 20 4e 4f 5f 45 52 52 4f 52 20  res == NO_ERROR 
2d60: 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c 6f 63 6b  ){.      newLock
2d70: 74 79 70 65 20 3d 20 52 45 53 45 52 56 45 44 5f  type = RESERVED_
2d80: 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  LOCK;.    }.    
2d90: 4f 53 54 52 41 43 45 28 28 20 22 4c 4f 43 4b 20  OSTRACE(( "LOCK 
2da0: 25 64 20 61 63 71 75 69 72 65 20 72 65 73 65 72  %d acquire reser
2db0: 76 65 64 20 6c 6f 63 6b 2e 20 72 65 73 3d 25 64  ved lock. res=%d
2dc0: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72  \n", pFile->h, r
2dd0: 65 73 20 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  es ));.  }..  /*
2de0: 20 41 63 71 75 69 72 65 20 61 20 50 45 4e 44 49   Acquire a PENDI
2df0: 4e 47 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69  NG lock.  */.  i
2e00: 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43  f( locktype==EXC
2e10: 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 72  LUSIVE_LOCK && r
2e20: 65 73 20 3d 3d 20 4e 4f 5f 45 52 52 4f 52 20 29  es == NO_ERROR )
2e30: 7b 0a 20 20 20 20 6e 65 77 4c 6f 63 6b 74 79 70  {.    newLocktyp
2e40: 65 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  e = PENDING_LOCK
2e50: 3b 0a 20 20 20 20 67 6f 74 50 65 6e 64 69 6e 67  ;.    gotPending
2e60: 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 20 20 4f 53  Lock = 0;.    OS
2e70: 54 52 41 43 45 28 28 20 22 4c 4f 43 4b 20 25 64  TRACE(( "LOCK %d
2e80: 20 61 63 71 75 69 72 65 20 70 65 6e 64 69 6e 67   acquire pending
2e90: 20 6c 6f 63 6b 2e 20 70 65 6e 64 69 6e 67 20 6c   lock. pending l
2ea0: 6f 63 6b 20 62 6f 6f 6c 65 61 6e 20 75 6e 73 65  ock boolean unse
2eb0: 74 2e 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  t.\n",.         
2ec0: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 20 29        pFile->h )
2ed0: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 63 71  );.  }..  /* Acq
2ee0: 75 69 72 65 20 61 6e 20 45 58 43 4c 55 53 49 56  uire an EXCLUSIV
2ef0: 45 20 6c 6f 63 6b 0a 20 20 2a 2f 0a 20 20 69 66  E lock.  */.  if
2f00: 28 20 6c 6f 63 6b 74 79 70 65 3d 3d 45 58 43 4c  ( locktype==EXCL
2f10: 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 72 65  USIVE_LOCK && re
2f20: 73 20 3d 3d 20 4e 4f 5f 45 52 52 4f 52 20 29 7b  s == NO_ERROR ){
2f30: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69  .    assert( pFi
2f40: 6c 65 2d 3e 6c 6f 63 6b 74 79 70 65 3e 3d 53 48  le->locktype>=SH
2f50: 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20  ARED_LOCK );.   
2f60: 20 72 65 73 20 3d 20 75 6e 6c 6f 63 6b 52 65 61   res = unlockRea
2f70: 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20  dLock(pFile);.  
2f80: 20 20 4f 53 54 52 41 43 45 28 28 20 22 75 6e 72    OSTRACE(( "unr
2f90: 65 61 64 6c 6f 63 6b 20 3d 20 25 64 5c 6e 22 2c  eadlock = %d\n",
2fa0: 20 72 65 73 20 29 29 3b 0a 20 20 20 20 4c 6f 63   res ));.    Loc
2fb0: 6b 41 72 65 61 2e 6c 4f 66 66 73 65 74 20 3d 20  kArea.lOffset = 
2fc0: 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20  SHARED_FIRST;.  
2fd0: 20 20 4c 6f 63 6b 41 72 65 61 2e 6c 52 61 6e 67    LockArea.lRang
2fe0: 65 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b  e = SHARED_SIZE;
2ff0: 0a 20 20 20 20 55 6e 6c 6f 63 6b 41 72 65 61 2e  .    UnlockArea.
3000: 6c 4f 66 66 73 65 74 20 3d 20 30 4c 3b 0a 20 20  lOffset = 0L;.  
3010: 20 20 55 6e 6c 6f 63 6b 41 72 65 61 2e 6c 52 61    UnlockArea.lRa
3020: 6e 67 65 20 3d 20 30 4c 3b 0a 20 20 20 20 72 65  nge = 0L;.    re
3030: 73 20 3d 20 44 6f 73 53 65 74 46 69 6c 65 4c 6f  s = DosSetFileLo
3040: 63 6b 73 28 20 70 46 69 6c 65 2d 3e 68 2c 20 26  cks( pFile->h, &
3050: 55 6e 6c 6f 63 6b 41 72 65 61 2c 20 26 4c 6f 63  UnlockArea, &Loc
3060: 6b 41 72 65 61 2c 20 4c 4f 43 4b 5f 54 49 4d 45  kArea, LOCK_TIME
3070: 4f 55 54 2c 20 30 4c 20 29 3b 0a 20 20 20 20 69  OUT, 0L );.    i
3080: 66 28 20 72 65 73 20 3d 3d 20 4e 4f 5f 45 52 52  f( res == NO_ERR
3090: 4f 52 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c  OR ){.      newL
30a0: 6f 63 6b 74 79 70 65 20 3d 20 45 58 43 4c 55 53  ocktype = EXCLUS
30b0: 49 56 45 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65  IVE_LOCK;.    }e
30c0: 6c 73 65 7b 0a 20 20 20 20 20 20 4f 53 54 52 41  lse{.      OSTRA
30d0: 43 45 28 28 20 22 4f 53 2f 32 20 65 72 72 6f 72  CE(( "OS/2 error
30e0: 2d 63 6f 64 65 20 3d 20 25 64 5c 6e 22 2c 20 72  -code = %d\n", r
30f0: 65 73 20 29 29 3b 0a 20 20 20 20 20 20 67 65 74  es ));.      get
3100: 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65 29 3b  ReadLock(pFile);
3110: 0a 20 20 20 20 7d 0a 20 20 20 20 4f 53 54 52 41  .    }.    OSTRA
3120: 43 45 28 28 20 22 4c 4f 43 4b 20 25 64 20 61 63  CE(( "LOCK %d ac
3130: 71 75 69 72 65 20 65 78 63 6c 75 73 69 76 65 20  quire exclusive 
3140: 6c 6f 63 6b 2e 20 20 72 65 73 3d 25 64 5c 6e 22  lock.  res=%d\n"
3150: 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 65 73 20  , pFile->h, res 
3160: 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  ));.  }..  /* If
3170: 20 77 65 20 61 72 65 20 68 6f 6c 64 69 6e 67 20   we are holding 
3180: 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 74  a PENDING lock t
3190: 68 61 74 20 6f 75 67 68 74 20 74 6f 20 62 65 20  hat ought to be 
31a0: 72 65 6c 65 61 73 65 64 2c 20 74 68 65 6e 0a 20  released, then. 
31b0: 20 2a 2a 20 72 65 6c 65 61 73 65 20 69 74 20 6e   ** release it n
31c0: 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 67  ow..  */.  if( g
31d0: 6f 74 50 65 6e 64 69 6e 67 4c 6f 63 6b 20 26 26  otPendingLock &&
31e0: 20 6c 6f 63 6b 74 79 70 65 3d 3d 53 48 41 52 45   locktype==SHARE
31f0: 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 69 6e  D_LOCK ){.    in
3200: 74 20 72 3b 0a 20 20 20 20 4c 6f 63 6b 41 72 65  t r;.    LockAre
3210: 61 2e 6c 4f 66 66 73 65 74 20 3d 20 30 4c 3b 0a  a.lOffset = 0L;.
3220: 20 20 20 20 4c 6f 63 6b 41 72 65 61 2e 6c 52 61      LockArea.lRa
3230: 6e 67 65 20 3d 20 30 4c 3b 0a 20 20 20 20 55 6e  nge = 0L;.    Un
3240: 6c 6f 63 6b 41 72 65 61 2e 6c 4f 66 66 73 65 74  lockArea.lOffset
3250: 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b   = PENDING_BYTE;
3260: 0a 20 20 20 20 55 6e 6c 6f 63 6b 41 72 65 61 2e  .    UnlockArea.
3270: 6c 52 61 6e 67 65 20 3d 20 31 4c 3b 0a 20 20 20  lRange = 1L;.   
3280: 20 72 20 3d 20 44 6f 73 53 65 74 46 69 6c 65 4c   r = DosSetFileL
3290: 6f 63 6b 73 28 20 70 46 69 6c 65 2d 3e 68 2c 20  ocks( pFile->h, 
32a0: 26 55 6e 6c 6f 63 6b 41 72 65 61 2c 20 26 4c 6f  &UnlockArea, &Lo
32b0: 63 6b 41 72 65 61 2c 20 4c 4f 43 4b 5f 54 49 4d  ckArea, LOCK_TIM
32c0: 45 4f 55 54 2c 20 30 4c 20 29 3b 0a 20 20 20 20  EOUT, 0L );.    
32d0: 4f 53 54 52 41 43 45 28 28 20 22 4c 4f 43 4b 20  OSTRACE(( "LOCK 
32e0: 25 64 20 75 6e 6c 6f 63 6b 69 6e 67 20 70 65 6e  %d unlocking pen
32f0: 64 69 6e 67 2f 69 73 20 73 68 61 72 65 64 2e 20  ding/is shared. 
3300: 72 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  r=%d\n", pFile->
3310: 68 2c 20 72 20 29 29 3b 0a 20 20 7d 0a 0a 20 20  h, r ));.  }..  
3320: 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 73 74  /* Update the st
3330: 61 74 65 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20  ate of the lock 
3340: 68 61 73 20 68 65 6c 64 20 69 6e 20 74 68 65 20  has held in the 
3350: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
3360: 74 68 65 6e 0a 20 20 2a 2a 20 72 65 74 75 72 6e  then.  ** return
3370: 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
3380: 20 72 65 73 75 6c 74 20 63 6f 64 65 2e 0a 20 20   result code..  
3390: 2a 2f 0a 20 20 69 66 28 20 72 65 73 20 3d 3d 20  */.  if( res == 
33a0: 4e 4f 5f 45 52 52 4f 52 20 29 7b 0a 20 20 20 20  NO_ERROR ){.    
33b0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
33c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 4f 53 54    }else{.    OST
33d0: 52 41 43 45 28 28 20 22 4c 4f 43 4b 20 46 41 49  RACE(( "LOCK FAI
33e0: 4c 45 44 20 25 64 20 74 72 79 69 6e 67 20 66 6f  LED %d trying fo
33f0: 72 20 25 64 20 62 75 74 20 67 6f 74 20 25 64 5c  r %d but got %d\
3400: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20  n", pFile->h,.  
3410: 20 20 20 20 20 20 20 20 20 20 20 20 6c 6f 63 6b              lock
3420: 74 79 70 65 2c 20 6e 65 77 4c 6f 63 6b 74 79 70  type, newLocktyp
3430: 65 20 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 53  e ));.    rc = S
3440: 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a  QLITE_BUSY;.  }.
3450: 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70    pFile->locktyp
3460: 65 20 3d 20 6e 65 77 4c 6f 63 6b 74 79 70 65 3b  e = newLocktype;
3470: 0a 20 20 4f 53 54 52 41 43 45 28 28 20 22 4c 4f  .  OSTRACE(( "LO
3480: 43 4b 20 25 64 20 6e 6f 77 20 25 64 5c 6e 22 2c  CK %d now %d\n",
3490: 20 70 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65   pFile->h, pFile
34a0: 2d 3e 6c 6f 63 6b 74 79 70 65 20 29 29 3b 0a 20  ->locktype ));. 
34b0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
34c0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
34d0: 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72  e checks if ther
34e0: 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20  e is a RESERVED 
34f0: 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65  lock held on the
3500: 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69   specified.** fi
3510: 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e  le by this or an
3520: 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e  y other process.
3530: 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20   If such a lock 
3540: 69 73 20 68 65 6c 64 2c 20 72 65 74 75 72 6e 0a  is held, return.
3550: 2a 2a 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 6f 74 68  ** non-zero, oth
3560: 65 72 77 69 73 65 20 7a 65 72 6f 2e 0a 2a 2f 0a  erwise zero..*/.
3570: 73 74 61 74 69 63 20 69 6e 74 20 6f 73 32 43 68  static int os2Ch
3580: 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
3590: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69   sqlite3_file *i
35a0: 64 2c 20 69 6e 74 20 2a 70 4f 75 74 20 29 7b 0a  d, int *pOut ){.
35b0: 20 20 69 6e 74 20 72 20 3d 20 30 3b 0a 20 20 6f    int r = 0;.  o
35c0: 73 32 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  s2File *pFile = 
35d0: 28 6f 73 32 46 69 6c 65 2a 29 69 64 3b 0a 20 20  (os2File*)id;.  
35e0: 61 73 73 65 72 74 28 20 70 46 69 6c 65 21 3d 30  assert( pFile!=0
35f0: 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   );.  if( pFile-
3600: 3e 6c 6f 63 6b 74 79 70 65 3e 3d 52 45 53 45 52  >locktype>=RESER
3610: 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  VED_LOCK ){.    
3620: 72 20 3d 20 31 3b 0a 20 20 20 20 4f 53 54 52 41  r = 1;.    OSTRA
3630: 43 45 28 28 20 22 54 45 53 54 20 57 52 2d 4c 4f  CE(( "TEST WR-LO
3640: 43 4b 20 25 64 20 25 64 20 28 6c 6f 63 61 6c 29  CK %d %d (local)
3650: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72  \n", pFile->h, r
3660: 20 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   ));.  }else{.  
3670: 20 20 46 49 4c 45 4c 4f 43 4b 20 20 4c 6f 63 6b    FILELOCK  Lock
3680: 41 72 65 61 2c 0a 20 20 20 20 20 20 20 20 20 20  Area,.          
3690: 20 20 20 20 55 6e 6c 6f 63 6b 41 72 65 61 3b 0a      UnlockArea;.
36a0: 20 20 20 20 41 50 49 52 45 54 20 72 63 20 3d 20      APIRET rc = 
36b0: 4e 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 6d 65  NO_ERROR;.    me
36c0: 6d 73 65 74 28 26 4c 6f 63 6b 41 72 65 61 2c 20  mset(&LockArea, 
36d0: 30 2c 20 73 69 7a 65 6f 66 28 4c 6f 63 6b 41 72  0, sizeof(LockAr
36e0: 65 61 29 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74  ea));.    memset
36f0: 28 26 55 6e 6c 6f 63 6b 41 72 65 61 2c 20 30 2c  (&UnlockArea, 0,
3700: 20 73 69 7a 65 6f 66 28 55 6e 6c 6f 63 6b 41 72   sizeof(UnlockAr
3710: 65 61 29 29 3b 0a 20 20 20 20 4c 6f 63 6b 41 72  ea));.    LockAr
3720: 65 61 2e 6c 4f 66 66 73 65 74 20 3d 20 52 45 53  ea.lOffset = RES
3730: 45 52 56 45 44 5f 42 59 54 45 3b 0a 20 20 20 20  ERVED_BYTE;.    
3740: 4c 6f 63 6b 41 72 65 61 2e 6c 52 61 6e 67 65 20  LockArea.lRange 
3750: 3d 20 31 4c 3b 0a 20 20 20 20 55 6e 6c 6f 63 6b  = 1L;.    Unlock
3760: 41 72 65 61 2e 6c 4f 66 66 73 65 74 20 3d 20 30  Area.lOffset = 0
3770: 4c 3b 0a 20 20 20 20 55 6e 6c 6f 63 6b 41 72 65  L;.    UnlockAre
3780: 61 2e 6c 52 61 6e 67 65 20 3d 20 30 4c 3b 0a 20  a.lRange = 0L;. 
3790: 20 20 20 72 63 20 3d 20 44 6f 73 53 65 74 46 69     rc = DosSetFi
37a0: 6c 65 4c 6f 63 6b 73 28 20 70 46 69 6c 65 2d 3e  leLocks( pFile->
37b0: 68 2c 20 26 55 6e 6c 6f 63 6b 41 72 65 61 2c 20  h, &UnlockArea, 
37c0: 26 4c 6f 63 6b 41 72 65 61 2c 20 4c 4f 43 4b 5f  &LockArea, LOCK_
37d0: 54 49 4d 45 4f 55 54 2c 20 30 4c 20 29 3b 0a 20  TIMEOUT, 0L );. 
37e0: 20 20 20 4f 53 54 52 41 43 45 28 28 20 22 54 45     OSTRACE(( "TE
37f0: 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 6c 6f  ST WR-LOCK %d lo
3800: 63 6b 20 72 65 73 65 72 76 65 64 20 62 79 74 65  ck reserved byte
3810: 20 72 63 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65   rc=%d\n", pFile
3820: 2d 3e 68 2c 20 72 63 20 29 29 3b 0a 20 20 20 20  ->h, rc ));.    
3830: 69 66 28 20 72 63 20 3d 3d 20 4e 4f 5f 45 52 52  if( rc == NO_ERR
3840: 4f 52 20 29 7b 0a 20 20 20 20 20 20 41 50 49 52  OR ){.      APIR
3850: 45 54 20 72 63 75 20 3d 20 4e 4f 5f 45 52 52 4f  ET rcu = NO_ERRO
3860: 52 3b 20 2f 2a 20 72 65 74 75 72 6e 20 63 6f 64  R; /* return cod
3870: 65 20 66 6f 72 20 75 6e 6c 6f 63 6b 69 6e 67 20  e for unlocking 
3880: 2a 2f 0a 20 20 20 20 20 20 4c 6f 63 6b 41 72 65  */.      LockAre
3890: 61 2e 6c 4f 66 66 73 65 74 20 3d 20 30 4c 3b 0a  a.lOffset = 0L;.
38a0: 20 20 20 20 20 20 4c 6f 63 6b 41 72 65 61 2e 6c        LockArea.l
38b0: 52 61 6e 67 65 20 3d 20 30 4c 3b 0a 20 20 20 20  Range = 0L;.    
38c0: 20 20 55 6e 6c 6f 63 6b 41 72 65 61 2e 6c 4f 66    UnlockArea.lOf
38d0: 66 73 65 74 20 3d 20 52 45 53 45 52 56 45 44 5f  fset = RESERVED_
38e0: 42 59 54 45 3b 0a 20 20 20 20 20 20 55 6e 6c 6f  BYTE;.      Unlo
38f0: 63 6b 41 72 65 61 2e 6c 52 61 6e 67 65 20 3d 20  ckArea.lRange = 
3900: 31 4c 3b 0a 20 20 20 20 20 20 72 63 75 20 3d 20  1L;.      rcu = 
3910: 44 6f 73 53 65 74 46 69 6c 65 4c 6f 63 6b 73 28  DosSetFileLocks(
3920: 20 70 46 69 6c 65 2d 3e 68 2c 20 26 55 6e 6c 6f   pFile->h, &Unlo
3930: 63 6b 41 72 65 61 2c 20 26 4c 6f 63 6b 41 72 65  ckArea, &LockAre
3940: 61 2c 20 4c 4f 43 4b 5f 54 49 4d 45 4f 55 54 2c  a, LOCK_TIMEOUT,
3950: 20 30 4c 20 29 3b 0a 20 20 20 20 20 20 4f 53 54   0L );.      OST
3960: 52 41 43 45 28 28 20 22 54 45 53 54 20 57 52 2d  RACE(( "TEST WR-
3970: 4c 4f 43 4b 20 25 64 20 75 6e 6c 6f 63 6b 20 72  LOCK %d unlock r
3980: 65 73 65 72 76 65 64 20 62 79 74 65 20 72 3d 25  eserved byte r=%
3990: 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  d\n", pFile->h, 
39a0: 72 63 75 20 29 29 3b 0a 20 20 20 20 7d 0a 20 20  rcu ));.    }.  
39b0: 20 20 72 20 3d 20 21 28 72 63 20 3d 3d 20 4e 4f    r = !(rc == NO
39c0: 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 4f 53 54  _ERROR);.    OST
39d0: 52 41 43 45 28 28 20 22 54 45 53 54 20 57 52 2d  RACE(( "TEST WR-
39e0: 4c 4f 43 4b 20 25 64 20 25 64 20 28 72 65 6d 6f  LOCK %d %d (remo
39f0: 74 65 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  te)\n", pFile->h
3a00: 2c 20 72 20 29 29 3b 0a 20 20 7d 0a 20 20 2a 70  , r ));.  }.  *p
3a10: 4f 75 74 20 3d 20 72 3b 0a 20 20 72 65 74 75 72  Out = r;.  retur
3a20: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
3a30: 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20  /*.** Lower the 
3a40: 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e  locking level on
3a50: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
3a60: 20 69 64 20 74 6f 20 6c 6f 63 6b 74 79 70 65 2e   id to locktype.
3a70: 20 20 6c 6f 63 6b 74 79 70 65 0a 2a 2a 20 6d 75    locktype.** mu
3a80: 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f  st be either NO_
3a90: 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c  LOCK or SHARED_L
3aa0: 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  OCK..**.** If th
3ab0: 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
3ac0: 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  of the file desc
3ad0: 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64  riptor is alread
3ae0: 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a  y at or below.**
3af0: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
3b00: 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68  ocking level, th
3b10: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
3b20: 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 74 20  no-op..**.** It 
3b30: 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
3b40: 66 6f 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65  for this routine
3b50: 20 74 6f 20 66 61 69 6c 20 69 66 20 74 68 65 20   to fail if the 
3b60: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 0a  second argument.
3b70: 2a 2a 20 69 73 20 4e 4f 5f 4c 4f 43 4b 2e 20 20  ** is NO_LOCK.  
3b80: 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  If the second ar
3b90: 67 75 6d 65 6e 74 20 69 73 20 53 48 41 52 45 44  gument is SHARED
3ba0: 5f 4c 4f 43 4b 20 74 68 65 6e 20 74 68 69 73 20  _LOCK then this 
3bb0: 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d 69 67 68 74  routine.** might
3bc0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
3bd0: 4f 45 52 52 3b 0a 2a 2f 0a 73 74 61 74 69 63 20  OERR;.*/.static 
3be0: 69 6e 74 20 6f 73 32 55 6e 6c 6f 63 6b 28 20 73  int os2Unlock( s
3bf0: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
3c00: 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 20 29 7b   int locktype ){
3c10: 0a 20 20 69 6e 74 20 74 79 70 65 3b 0a 20 20 6f  .  int type;.  o
3c20: 73 32 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  s2File *pFile = 
3c30: 28 6f 73 32 46 69 6c 65 2a 29 69 64 3b 0a 20 20  (os2File*)id;.  
3c40: 41 50 49 52 45 54 20 72 63 20 3d 20 53 51 4c 49  APIRET rc = SQLI
3c50: 54 45 5f 4f 4b 3b 0a 20 20 41 50 49 52 45 54 20  TE_OK;.  APIRET 
3c60: 72 65 73 20 3d 20 4e 4f 5f 45 52 52 4f 52 3b 0a  res = NO_ERROR;.
3c70: 20 20 46 49 4c 45 4c 4f 43 4b 20 20 4c 6f 63 6b    FILELOCK  Lock
3c80: 41 72 65 61 2c 0a 20 20 20 20 20 20 20 20 20 20  Area,.          
3c90: 20 20 55 6e 6c 6f 63 6b 41 72 65 61 3b 0a 20 20    UnlockArea;.  
3ca0: 6d 65 6d 73 65 74 28 26 4c 6f 63 6b 41 72 65 61  memset(&LockArea
3cb0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4c 6f 63 6b  , 0, sizeof(Lock
3cc0: 41 72 65 61 29 29 3b 0a 20 20 6d 65 6d 73 65 74  Area));.  memset
3cd0: 28 26 55 6e 6c 6f 63 6b 41 72 65 61 2c 20 30 2c  (&UnlockArea, 0,
3ce0: 20 73 69 7a 65 6f 66 28 55 6e 6c 6f 63 6b 41 72   sizeof(UnlockAr
3cf0: 65 61 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ea));.  assert( 
3d00: 70 46 69 6c 65 21 3d 30 20 29 3b 0a 20 20 61 73  pFile!=0 );.  as
3d10: 73 65 72 74 28 20 6c 6f 63 6b 74 79 70 65 3c 3d  sert( locktype<=
3d20: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
3d30: 20 4f 53 54 52 41 43 45 28 28 20 22 55 4e 4c 4f   OSTRACE(( "UNLO
3d40: 43 4b 20 25 64 20 74 6f 20 25 64 20 77 61 73 20  CK %d to %d was 
3d50: 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  %d\n", pFile->h,
3d60: 20 6c 6f 63 6b 74 79 70 65 2c 20 70 46 69 6c 65   locktype, pFile
3d70: 2d 3e 6c 6f 63 6b 74 79 70 65 20 29 29 3b 0a 20  ->locktype ));. 
3d80: 20 74 79 70 65 20 3d 20 70 46 69 6c 65 2d 3e 6c   type = pFile->l
3d90: 6f 63 6b 74 79 70 65 3b 0a 20 20 69 66 28 20 74  ocktype;.  if( t
3da0: 79 70 65 3e 3d 45 58 43 4c 55 53 49 56 45 5f 4c  ype>=EXCLUSIVE_L
3db0: 4f 43 4b 20 29 7b 0a 20 20 20 20 4c 6f 63 6b 41  OCK ){.    LockA
3dc0: 72 65 61 2e 6c 4f 66 66 73 65 74 20 3d 20 30 4c  rea.lOffset = 0L
3dd0: 3b 0a 20 20 20 20 4c 6f 63 6b 41 72 65 61 2e 6c  ;.    LockArea.l
3de0: 52 61 6e 67 65 20 3d 20 30 4c 3b 0a 20 20 20 20  Range = 0L;.    
3df0: 55 6e 6c 6f 63 6b 41 72 65 61 2e 6c 4f 66 66 73  UnlockArea.lOffs
3e00: 65 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53  et = SHARED_FIRS
3e10: 54 3b 0a 20 20 20 20 55 6e 6c 6f 63 6b 41 72 65  T;.    UnlockAre
3e20: 61 2e 6c 52 61 6e 67 65 20 3d 20 53 48 41 52 45  a.lRange = SHARE
3e30: 44 5f 53 49 5a 45 3b 0a 20 20 20 20 72 65 73 20  D_SIZE;.    res 
3e40: 3d 20 44 6f 73 53 65 74 46 69 6c 65 4c 6f 63 6b  = DosSetFileLock
3e50: 73 28 20 70 46 69 6c 65 2d 3e 68 2c 20 26 55 6e  s( pFile->h, &Un
3e60: 6c 6f 63 6b 41 72 65 61 2c 20 26 4c 6f 63 6b 41  lockArea, &LockA
3e70: 72 65 61 2c 20 4c 4f 43 4b 5f 54 49 4d 45 4f 55  rea, LOCK_TIMEOU
3e80: 54 2c 20 30 4c 20 29 3b 0a 20 20 20 20 4f 53 54  T, 0L );.    OST
3e90: 52 41 43 45 28 28 20 22 55 4e 4c 4f 43 4b 20 25  RACE(( "UNLOCK %
3ea0: 64 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  d exclusive lock
3eb0: 20 72 65 73 3d 25 64 5c 6e 22 2c 20 70 46 69 6c   res=%d\n", pFil
3ec0: 65 2d 3e 68 2c 20 72 65 73 20 29 29 3b 0a 20 20  e->h, res ));.  
3ed0: 20 20 69 66 28 20 6c 6f 63 6b 74 79 70 65 3d 3d    if( locktype==
3ee0: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 67  SHARED_LOCK && g
3ef0: 65 74 52 65 61 64 4c 6f 63 6b 28 70 46 69 6c 65  etReadLock(pFile
3f00: 29 20 21 3d 20 4e 4f 5f 45 52 52 4f 52 20 29 7b  ) != NO_ERROR ){
3f10: 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 73  .      /* This s
3f20: 68 6f 75 6c 64 20 6e 65 76 65 72 20 68 61 70 70  hould never happ
3f30: 65 6e 2e 20 20 57 65 20 73 68 6f 75 6c 64 20 61  en.  We should a
3f40: 6c 77 61 79 73 20 62 65 20 61 62 6c 65 20 74 6f  lways be able to
3f50: 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 63 71 75  .      ** reacqu
3f60: 69 72 65 20 74 68 65 20 72 65 61 64 20 6c 6f 63  ire the read loc
3f70: 6b 20 2a 2f 0a 20 20 20 20 20 20 4f 53 54 52 41  k */.      OSTRA
3f80: 43 45 28 28 20 22 55 4e 4c 4f 43 4b 20 25 64 20  CE(( "UNLOCK %d 
3f90: 74 6f 20 25 64 20 67 65 74 52 65 61 64 4c 6f 63  to %d getReadLoc
3fa0: 6b 28 29 20 66 61 69 6c 65 64 5c 6e 22 2c 20 70  k() failed\n", p
3fb0: 46 69 6c 65 2d 3e 68 2c 20 6c 6f 63 6b 74 79 70  File->h, locktyp
3fc0: 65 20 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  e ));.      rc =
3fd0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
3fe0: 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  LOCK;.    }.  }.
3ff0: 20 20 69 66 28 20 74 79 70 65 3e 3d 52 45 53 45    if( type>=RESE
4000: 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  RVED_LOCK ){.   
4010: 20 4c 6f 63 6b 41 72 65 61 2e 6c 4f 66 66 73 65   LockArea.lOffse
4020: 74 20 3d 20 30 4c 3b 0a 20 20 20 20 4c 6f 63 6b  t = 0L;.    Lock
4030: 41 72 65 61 2e 6c 52 61 6e 67 65 20 3d 20 30 4c  Area.lRange = 0L
4040: 3b 0a 20 20 20 20 55 6e 6c 6f 63 6b 41 72 65 61  ;.    UnlockArea
4050: 2e 6c 4f 66 66 73 65 74 20 3d 20 52 45 53 45 52  .lOffset = RESER
4060: 56 45 44 5f 42 59 54 45 3b 0a 20 20 20 20 55 6e  VED_BYTE;.    Un
4070: 6c 6f 63 6b 41 72 65 61 2e 6c 52 61 6e 67 65 20  lockArea.lRange 
4080: 3d 20 31 4c 3b 0a 20 20 20 20 72 65 73 20 3d 20  = 1L;.    res = 
4090: 44 6f 73 53 65 74 46 69 6c 65 4c 6f 63 6b 73 28  DosSetFileLocks(
40a0: 20 70 46 69 6c 65 2d 3e 68 2c 20 26 55 6e 6c 6f   pFile->h, &Unlo
40b0: 63 6b 41 72 65 61 2c 20 26 4c 6f 63 6b 41 72 65  ckArea, &LockAre
40c0: 61 2c 20 4c 4f 43 4b 5f 54 49 4d 45 4f 55 54 2c  a, LOCK_TIMEOUT,
40d0: 20 30 4c 20 29 3b 0a 20 20 20 20 4f 53 54 52 41   0L );.    OSTRA
40e0: 43 45 28 28 20 22 55 4e 4c 4f 43 4b 20 25 64 20  CE(( "UNLOCK %d 
40f0: 72 65 73 65 72 76 65 64 20 72 65 73 3d 25 64 5c  reserved res=%d\
4100: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 65  n", pFile->h, re
4110: 73 20 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  s ));.  }.  if( 
4120: 6c 6f 63 6b 74 79 70 65 3d 3d 4e 4f 5f 4c 4f 43  locktype==NO_LOC
4130: 4b 20 26 26 20 74 79 70 65 3e 3d 53 48 41 52 45  K && type>=SHARE
4140: 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65  D_LOCK ){.    re
4150: 73 20 3d 20 75 6e 6c 6f 63 6b 52 65 61 64 4c 6f  s = unlockReadLo
4160: 63 6b 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 4f  ck(pFile);.    O
4170: 53 54 52 41 43 45 28 28 20 22 55 4e 4c 4f 43 4b  STRACE(( "UNLOCK
4180: 20 25 64 20 69 73 20 25 64 20 77 61 6e 74 20 25   %d is %d want %
4190: 64 20 72 65 73 3d 25 64 5c 6e 22 2c 0a 20 20 20  d res=%d\n",.   
41a0: 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
41b0: 2d 3e 68 2c 20 74 79 70 65 2c 20 6c 6f 63 6b 74  ->h, type, lockt
41c0: 79 70 65 2c 20 72 65 73 20 29 29 3b 0a 20 20 7d  ype, res ));.  }
41d0: 0a 20 20 69 66 28 20 74 79 70 65 3e 3d 50 45 4e  .  if( type>=PEN
41e0: 44 49 4e 47 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  DING_LOCK ){.   
41f0: 20 4c 6f 63 6b 41 72 65 61 2e 6c 4f 66 66 73 65   LockArea.lOffse
4200: 74 20 3d 20 30 4c 3b 0a 20 20 20 20 4c 6f 63 6b  t = 0L;.    Lock
4210: 41 72 65 61 2e 6c 52 61 6e 67 65 20 3d 20 30 4c  Area.lRange = 0L
4220: 3b 0a 20 20 20 20 55 6e 6c 6f 63 6b 41 72 65 61  ;.    UnlockArea
4230: 2e 6c 4f 66 66 73 65 74 20 3d 20 50 45 4e 44 49  .lOffset = PENDI
4240: 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20 55 6e 6c  NG_BYTE;.    Unl
4250: 6f 63 6b 41 72 65 61 2e 6c 52 61 6e 67 65 20 3d  ockArea.lRange =
4260: 20 31 4c 3b 0a 20 20 20 20 72 65 73 20 3d 20 44   1L;.    res = D
4270: 6f 73 53 65 74 46 69 6c 65 4c 6f 63 6b 73 28 20  osSetFileLocks( 
4280: 70 46 69 6c 65 2d 3e 68 2c 20 26 55 6e 6c 6f 63  pFile->h, &Unloc
4290: 6b 41 72 65 61 2c 20 26 4c 6f 63 6b 41 72 65 61  kArea, &LockArea
42a0: 2c 20 4c 4f 43 4b 5f 54 49 4d 45 4f 55 54 2c 20  , LOCK_TIMEOUT, 
42b0: 30 4c 20 29 3b 0a 20 20 20 20 4f 53 54 52 41 43  0L );.    OSTRAC
42c0: 45 28 28 20 22 55 4e 4c 4f 43 4b 20 25 64 20 70  E(( "UNLOCK %d p
42d0: 65 6e 64 69 6e 67 20 72 65 73 3d 25 64 5c 6e 22  ending res=%d\n"
42e0: 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 65 73 20  , pFile->h, res 
42f0: 29 29 3b 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d  ));.  }.  pFile-
4300: 3e 6c 6f 63 6b 74 79 70 65 20 3d 20 6c 6f 63 6b  >locktype = lock
4310: 74 79 70 65 3b 0a 20 20 4f 53 54 52 41 43 45 28  type;.  OSTRACE(
4320: 28 20 22 55 4e 4c 4f 43 4b 20 25 64 20 6e 6f 77  ( "UNLOCK %d now
4330: 20 25 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68   %d\n", pFile->h
4340: 2c 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 74 79 70  , pFile->locktyp
4350: 65 20 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e ));.  return r
4360: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 74  c;.}../*.** Cont
4370: 72 6f 6c 20 61 6e 64 20 71 75 65 72 79 20 6f 66  rol and query of
4380: 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20 68   the open file h
4390: 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  andle..*/.static
43a0: 20 69 6e 74 20 6f 73 32 46 69 6c 65 43 6f 6e 74   int os2FileCont
43b0: 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  rol(sqlite3_file
43c0: 20 2a 69 64 2c 20 69 6e 74 20 6f 70 2c 20 76 6f   *id, int op, vo
43d0: 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 73 77 69  id *pArg){.  swi
43e0: 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63  tch( op ){.    c
43f0: 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
4400: 5f 4c 4f 43 4b 53 54 41 54 45 3a 20 7b 0a 20 20  _LOCKSTATE: {.  
4410: 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67 20      *(int*)pArg 
4420: 3d 20 28 28 6f 73 32 46 69 6c 65 2a 29 69 64 29  = ((os2File*)id)
4430: 2d 3e 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20  ->locktype;.    
4440: 20 20 4f 53 54 52 41 43 45 28 28 20 22 46 43 4e    OSTRACE(( "FCN
4450: 54 4c 5f 4c 4f 43 4b 53 54 41 54 45 20 25 64 20  TL_LOCKSTATE %d 
4460: 6c 6f 63 6b 3d 25 64 5c 6e 22 2c 0a 20 20 20 20  lock=%d\n",.    
4470: 20 20 20 20 20 20 20 20 20 20 20 20 28 28 6f 73              ((os
4480: 32 46 69 6c 65 2a 29 69 64 29 2d 3e 68 2c 20 28  2File*)id)->h, (
4490: 28 6f 73 32 46 69 6c 65 2a 29 69 64 29 2d 3e 6c  (os2File*)id)->l
44a0: 6f 63 6b 74 79 70 65 20 29 29 3b 0a 20 20 20 20  ocktype ));.    
44b0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
44c0: 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  OK;.    }.  }.  
44d0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
44e0: 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ROR;.}../*.** Re
44f0: 74 75 72 6e 20 74 68 65 20 73 65 63 74 6f 72 20  turn the sector 
4500: 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 66  size in bytes of
4510: 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
4520: 62 6c 6f 63 6b 20 64 65 76 69 63 65 20 66 6f 72  block device for
4530: 0a 2a 2a 20 74 68 65 20 73 70 65 63 69 66 69 65  .** the specifie
4540: 64 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20  d file. This is 
4550: 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20 35 31  almost always 51
4560: 32 20 62 79 74 65 73 2c 20 62 75 74 20 6d 61 79  2 bytes, but may
4570: 20 62 65 0a 2a 2a 20 6c 61 72 67 65 72 20 66 6f   be.** larger fo
4580: 72 20 73 6f 6d 65 20 64 65 76 69 63 65 73 2e 0a  r some devices..
4590: 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 63 6f 64  **.** SQLite cod
45a0: 65 20 61 73 73 75 6d 65 73 20 74 68 69 73 20 66  e assumes this f
45b0: 75 6e 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 66  unction cannot f
45c0: 61 69 6c 2e 20 49 74 20 61 6c 73 6f 20 61 73 73  ail. It also ass
45d0: 75 6d 65 73 20 74 68 61 74 0a 2a 2a 20 69 66 20  umes that.** if 
45e0: 74 77 6f 20 66 69 6c 65 73 20 61 72 65 20 63 72  two files are cr
45f0: 65 61 74 65 64 20 69 6e 20 74 68 65 20 73 61 6d  eated in the sam
4600: 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 64 69  e file-system di
4610: 72 65 63 74 6f 72 79 20 28 69 2e 65 2e 0a 2a 2a  rectory (i.e..**
4620: 20 61 20 64 61 74 61 62 61 73 65 20 61 6e 64 20   a database and 
4630: 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  its journal file
4640: 29 20 74 68 61 74 20 74 68 65 20 73 65 63 74 6f  ) that the secto
4650: 72 20 73 69 7a 65 20 77 69 6c 6c 20 62 65 20 74  r size will be t
4660: 68 65 0a 2a 2a 20 73 61 6d 65 20 66 6f 72 20 62  he.** same for b
4670: 6f 74 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  oth..*/.static i
4680: 6e 74 20 6f 73 32 53 65 63 74 6f 72 53 69 7a 65  nt os2SectorSize
4690: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
46a0: 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  d){.  return SQL
46b0: 49 54 45 5f 44 45 46 41 55 4c 54 5f 53 45 43 54  ITE_DEFAULT_SECT
46c0: 4f 52 5f 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a 0a 2a  OR_SIZE;.}../*.*
46d0: 2a 20 52 65 74 75 72 6e 20 61 20 76 65 63 74 6f  * Return a vecto
46e0: 72 20 6f 66 20 64 65 76 69 63 65 20 63 68 61 72  r of device char
46f0: 61 63 74 65 72 69 73 74 69 63 73 2e 0a 2a 2f 0a  acteristics..*/.
4700: 73 74 61 74 69 63 20 69 6e 74 20 6f 73 32 44 65  static int os2De
4710: 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
4720: 69 63 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ics(sqlite3_file
4730: 20 2a 69 64 29 7b 0a 20 20 72 65 74 75 72 6e 20   *id){.  return 
4740: 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  0;.}.../*.** Cha
4750: 72 61 63 74 65 72 20 73 65 74 20 63 6f 6e 76 65  racter set conve
4760: 72 73 69 6f 6e 20 6f 62 6a 65 63 74 73 20 75 73  rsion objects us
4770: 65 64 20 62 79 20 63 6f 6e 76 65 72 73 69 6f 6e  ed by conversion
4780: 20 72 6f 75 74 69 6e 65 73 2e 0a 2a 2f 0a 73 74   routines..*/.st
4790: 61 74 69 63 20 55 63 6f 6e 76 4f 62 6a 65 63 74  atic UconvObject
47a0: 20 75 63 55 74 66 38 20 3d 20 4e 55 4c 4c 3b 20   ucUtf8 = NULL; 
47b0: 2f 2a 20 63 6f 6e 76 65 72 74 20 62 65 74 77 65  /* convert betwe
47c0: 65 6e 20 55 54 46 2d 38 20 61 6e 64 20 55 43 53  en UTF-8 and UCS
47d0: 2d 32 20 2a 2f 0a 73 74 61 74 69 63 20 55 63 6f  -2 */.static Uco
47e0: 6e 76 4f 62 6a 65 63 74 20 75 63 6c 43 70 20 3d  nvObject uclCp =
47f0: 20 4e 55 4c 4c 3b 20 20 2f 2a 20 63 6f 6e 76 65   NULL;  /* conve
4800: 72 74 20 62 65 74 77 65 65 6e 20 6c 6f 63 61 6c  rt between local
4810: 20 63 6f 64 65 70 61 67 65 20 61 6e 64 20 55 43   codepage and UC
4820: 53 2d 32 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 48 65  S-2 */../*.** He
4830: 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e 20 74 6f  lper function to
4840: 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   initialize the 
4850: 63 6f 6e 76 65 72 73 69 6f 6e 20 6f 62 6a 65 63  conversion objec
4860: 74 73 20 66 72 6f 6d 20 61 6e 64 20 74 6f 20 55  ts from and to U
4870: 54 46 2d 38 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  TF-8..*/.static 
4880: 76 6f 69 64 20 69 6e 69 74 55 63 6f 6e 76 4f 62  void initUconvOb
4890: 6a 65 63 74 73 28 20 76 6f 69 64 20 29 7b 0a 20  jects( void ){. 
48a0: 20 69 66 28 20 55 6e 69 43 72 65 61 74 65 55 63   if( UniCreateUc
48b0: 6f 6e 76 4f 62 6a 65 63 74 28 20 55 54 46 5f 38  onvObject( UTF_8
48c0: 2c 20 26 75 63 55 74 66 38 20 29 20 21 3d 20 55  , &ucUtf8 ) != U
48d0: 4c 53 5f 53 55 43 43 45 53 53 20 29 0a 20 20 20  LS_SUCCESS ).   
48e0: 20 75 63 55 74 66 38 20 3d 20 4e 55 4c 4c 3b 0a   ucUtf8 = NULL;.
48f0: 20 20 69 66 20 28 20 55 6e 69 43 72 65 61 74 65    if ( UniCreate
4900: 55 63 6f 6e 76 4f 62 6a 65 63 74 28 20 28 55 6e  UconvObject( (Un
4910: 69 43 68 61 72 20 2a 29 4c 22 40 70 61 74 68 3d  iChar *)L"@path=
4920: 79 65 73 22 2c 20 26 75 63 6c 43 70 20 29 20 21  yes", &uclCp ) !
4930: 3d 20 55 4c 53 5f 53 55 43 43 45 53 53 20 29 0a  = ULS_SUCCESS ).
4940: 20 20 20 20 75 63 6c 43 70 20 3d 20 4e 55 4c 4c      uclCp = NULL
4950: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65  ;.}../*.** Helpe
4960: 72 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 66 72  r function to fr
4970: 65 65 20 74 68 65 20 63 6f 6e 76 65 72 73 69 6f  ee the conversio
4980: 6e 20 6f 62 6a 65 63 74 73 20 66 72 6f 6d 20 61  n objects from a
4990: 6e 64 20 74 6f 20 55 54 46 2d 38 2e 0a 2a 2f 0a  nd to UTF-8..*/.
49a0: 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65  static void free
49b0: 55 63 6f 6e 76 4f 62 6a 65 63 74 73 28 20 76 6f  UconvObjects( vo
49c0: 69 64 20 29 7b 0a 20 20 69 66 20 28 20 75 63 55  id ){.  if ( ucU
49d0: 74 66 38 20 29 0a 20 20 20 20 55 6e 69 46 72 65  tf8 ).    UniFre
49e0: 65 55 63 6f 6e 76 4f 62 6a 65 63 74 28 20 75 63  eUconvObject( uc
49f0: 55 74 66 38 20 29 3b 0a 20 20 69 66 20 28 20 75  Utf8 );.  if ( u
4a00: 63 6c 43 70 20 29 0a 20 20 20 20 55 6e 69 46 72  clCp ).    UniFr
4a10: 65 65 55 63 6f 6e 76 4f 62 6a 65 63 74 28 20 75  eeUconvObject( u
4a20: 63 6c 43 70 20 29 3b 0a 20 20 75 63 55 74 66 38  clCp );.  ucUtf8
4a30: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 75 63 6c 43 70   = NULL;.  uclCp
4a40: 20 3d 20 4e 55 4c 4c 3b 0a 7d 0a 0a 2f 2a 0a 2a   = NULL;.}../*.*
4a50: 2a 20 48 65 6c 70 65 72 20 66 75 6e 63 74 69 6f  * Helper functio
4a60: 6e 20 74 6f 20 63 6f 6e 76 65 72 74 20 55 54 46  n to convert UTF
4a70: 2d 38 20 66 69 6c 65 6e 61 6d 65 73 20 74 6f 20  -8 filenames to 
4a80: 6c 6f 63 61 6c 20 4f 53 2f 32 20 63 6f 64 65 70  local OS/2 codep
4a90: 61 67 65 2e 0a 2a 2a 20 54 68 65 20 74 77 6f 2d  age..** The two-
4aa0: 73 74 65 70 20 70 72 6f 63 65 73 73 3a 20 66 69  step process: fi
4ab0: 72 73 74 20 63 6f 6e 76 65 72 74 20 74 68 65 20  rst convert the 
4ac0: 69 6e 63 6f 6d 69 6e 67 20 55 54 46 2d 38 20 73  incoming UTF-8 s
4ad0: 74 72 69 6e 67 0a 2a 2a 20 69 6e 74 6f 20 55 43  tring.** into UC
4ae0: 53 2d 32 20 61 6e 64 20 74 68 65 6e 20 66 72 6f  S-2 and then fro
4af0: 6d 20 55 43 53 2d 32 20 74 6f 20 74 68 65 20 63  m UCS-2 to the c
4b00: 75 72 72 65 6e 74 20 63 6f 64 65 70 61 67 65 2e  urrent codepage.
4b10: 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64  .** The returned
4b20: 20 63 68 61 72 20 70 6f 69 6e 74 65 72 20 68 61   char pointer ha
4b30: 73 20 74 6f 20 62 65 20 66 72 65 65 64 2e 0a 2a  s to be freed..*
4b40: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 63  /.static char *c
4b50: 6f 6e 76 65 72 74 55 74 66 38 50 61 74 68 54 6f  onvertUtf8PathTo
4b60: 43 70 28 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  Cp( const char *
4b70: 69 6e 20 29 7b 0a 20 20 55 6e 69 43 68 61 72 20  in ){.  UniChar 
4b80: 74 65 6d 70 50 61 74 68 5b 43 43 48 4d 41 58 50  tempPath[CCHMAXP
4b90: 41 54 48 5d 3b 0a 20 20 63 68 61 72 20 2a 6f 75  ATH];.  char *ou
4ba0: 74 20 3d 20 28 63 68 61 72 20 2a 29 63 61 6c 6c  t = (char *)call
4bb0: 6f 63 28 20 43 43 48 4d 41 58 50 41 54 48 2c 20  oc( CCHMAXPATH, 
4bc0: 31 20 29 3b 0a 0a 20 20 69 66 28 20 21 6f 75 74  1 );..  if( !out
4bd0: 20 29 0a 20 20 20 20 72 65 74 75 72 6e 20 4e 55   ).    return NU
4be0: 4c 4c 3b 0a 0a 20 20 69 66 28 20 21 75 63 55 74  LL;..  if( !ucUt
4bf0: 66 38 20 7c 7c 20 21 75 63 6c 43 70 20 29 0a 20  f8 || !uclCp ). 
4c00: 20 20 20 69 6e 69 74 55 63 6f 6e 76 4f 62 6a 65     initUconvObje
4c10: 63 74 73 28 29 3b 0a 0a 20 20 2f 2a 20 64 65 74  cts();..  /* det
4c20: 65 72 6d 69 6e 65 20 73 74 72 69 6e 67 20 66 6f  ermine string fo
4c30: 72 20 74 68 65 20 63 6f 6e 76 65 72 73 69 6f 6e  r the conversion
4c40: 20 6f 66 20 55 54 46 2d 38 20 77 68 69 63 68 20   of UTF-8 which 
4c50: 69 73 20 43 50 31 32 30 38 20 2a 2f 0a 20 20 69  is CP1208 */.  i
4c60: 66 28 20 55 6e 69 53 74 72 54 6f 55 63 73 28 20  f( UniStrToUcs( 
4c70: 75 63 55 74 66 38 2c 20 74 65 6d 70 50 61 74 68  ucUtf8, tempPath
4c80: 2c 20 28 63 68 61 72 20 2a 29 69 6e 2c 20 43 43  , (char *)in, CC
4c90: 48 4d 41 58 50 41 54 48 20 29 20 21 3d 20 55 4c  HMAXPATH ) != UL
4ca0: 53 5f 53 55 43 43 45 53 53 20 29 0a 20 20 20 20  S_SUCCESS ).    
4cb0: 72 65 74 75 72 6e 20 6f 75 74 3b 20 2f 2a 20 69  return out; /* i
4cc0: 66 20 63 6f 6e 76 65 72 73 69 6f 6e 20 66 61 69  f conversion fai
4cd0: 6c 73 2c 20 72 65 74 75 72 6e 20 74 68 65 20 65  ls, return the e
4ce0: 6d 70 74 79 20 73 74 72 69 6e 67 20 2a 2f 0a 0a  mpty string */..
4cf0: 20 20 2f 2a 20 63 6f 6e 76 65 72 73 69 6f 6e 20    /* conversion 
4d00: 66 6f 72 20 63 75 72 72 65 6e 74 20 63 6f 64 65  for current code
4d10: 70 61 67 65 20 77 68 69 63 68 20 63 61 6e 20 62  page which can b
4d20: 65 20 75 73 65 64 20 66 6f 72 20 70 61 74 68 73  e used for paths
4d30: 20 2a 2f 0a 20 20 55 6e 69 53 74 72 46 72 6f 6d   */.  UniStrFrom
4d40: 55 63 73 28 20 75 63 6c 43 70 2c 20 6f 75 74 2c  Ucs( uclCp, out,
4d50: 20 74 65 6d 70 50 61 74 68 2c 20 43 43 48 4d 41   tempPath, CCHMA
4d60: 58 50 41 54 48 20 29 3b 0a 0a 20 20 72 65 74 75  XPATH );..  retu
4d70: 72 6e 20 6f 75 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn out;.}../*.**
4d80: 20 48 65 6c 70 65 72 20 66 75 6e 63 74 69 6f 6e   Helper function
4d90: 20 74 6f 20 63 6f 6e 76 65 72 74 20 66 69 6c 65   to convert file
4da0: 6e 61 6d 65 73 20 66 72 6f 6d 20 6c 6f 63 61 6c  names from local
4db0: 20 63 6f 64 65 70 61 67 65 20 74 6f 20 55 54 46   codepage to UTF
4dc0: 2d 38 2e 0a 2a 2a 20 54 68 65 20 74 77 6f 2d 73  -8..** The two-s
4dd0: 74 65 70 20 70 72 6f 63 65 73 73 3a 20 66 69 72  tep process: fir
4de0: 73 74 20 63 6f 6e 76 65 72 74 20 74 68 65 20 69  st convert the i
4df0: 6e 63 6f 6d 69 6e 67 20 63 6f 64 65 70 61 67 65  ncoming codepage
4e00: 2d 73 70 65 63 69 66 69 63 0a 2a 2a 20 73 74 72  -specific.** str
4e10: 69 6e 67 20 69 6e 74 6f 20 55 43 53 2d 32 20 61  ing into UCS-2 a
4e20: 6e 64 20 74 68 65 6e 20 66 72 6f 6d 20 55 43 53  nd then from UCS
4e30: 2d 32 20 74 6f 20 74 68 65 20 63 6f 64 65 70 61  -2 to the codepa
4e40: 67 65 20 6f 66 20 55 54 46 2d 38 2e 0a 2a 2a 20  ge of UTF-8..** 
4e50: 54 68 65 20 72 65 74 75 72 6e 65 64 20 63 68 61  The returned cha
4e60: 72 20 70 6f 69 6e 74 65 72 20 68 61 73 20 74 6f  r pointer has to
4e70: 20 62 65 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a   be freed..**.**
4e80: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
4e90: 73 20 6e 6f 6e 2d 73 74 61 74 69 63 20 74 6f 20  s non-static to 
4ea0: 62 65 20 61 62 6c 65 20 74 6f 20 75 73 65 20 74  be able to use t
4eb0: 68 69 73 20 69 6e 20 73 68 65 6c 6c 2e 63 20 61  his in shell.c a
4ec0: 6e 64 0a 2a 2a 20 73 69 6d 69 6c 61 72 20 61 70  nd.** similar ap
4ed0: 70 6c 69 63 61 74 69 6f 6e 73 20 74 68 61 74 20  plications that 
4ee0: 74 61 6b 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e  take command lin
4ef0: 65 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a  e arguments..*/.
4f00: 63 68 61 72 20 2a 63 6f 6e 76 65 72 74 43 70 50  char *convertCpP
4f10: 61 74 68 54 6f 55 74 66 38 28 20 63 6f 6e 73 74  athToUtf8( const
4f20: 20 63 68 61 72 20 2a 69 6e 20 29 7b 0a 20 20 55   char *in ){.  U
4f30: 6e 69 43 68 61 72 20 74 65 6d 70 50 61 74 68 5b  niChar tempPath[
4f40: 43 43 48 4d 41 58 50 41 54 48 5d 3b 0a 20 20 63  CCHMAXPATH];.  c
4f50: 68 61 72 20 2a 6f 75 74 20 3d 20 28 63 68 61 72  har *out = (char
4f60: 20 2a 29 63 61 6c 6c 6f 63 28 20 43 43 48 4d 41   *)calloc( CCHMA
4f70: 58 50 41 54 48 2c 20 31 20 29 3b 0a 0a 20 20 69  XPATH, 1 );..  i
4f80: 66 28 20 21 6f 75 74 20 29 0a 20 20 20 20 72 65  f( !out ).    re
4f90: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 0a 20 20 69 66  turn NULL;..  if
4fa0: 28 20 21 75 63 55 74 66 38 20 7c 7c 20 21 75 63  ( !ucUtf8 || !uc
4fb0: 6c 43 70 20 29 0a 20 20 20 20 69 6e 69 74 55 63  lCp ).    initUc
4fc0: 6f 6e 76 4f 62 6a 65 63 74 73 28 29 3b 0a 0a 20  onvObjects();.. 
4fd0: 20 2f 2a 20 63 6f 6e 76 65 72 73 69 6f 6e 20 66   /* conversion f
4fe0: 6f 72 20 63 75 72 72 65 6e 74 20 63 6f 64 65 70  or current codep
4ff0: 61 67 65 20 77 68 69 63 68 20 63 61 6e 20 62 65  age which can be
5000: 20 75 73 65 64 20 66 6f 72 20 70 61 74 68 73 20   used for paths 
5010: 2a 2f 0a 20 20 69 66 28 20 55 6e 69 53 74 72 54  */.  if( UniStrT
5020: 6f 55 63 73 28 20 75 63 6c 43 70 2c 20 74 65 6d  oUcs( uclCp, tem
5030: 70 50 61 74 68 2c 20 28 63 68 61 72 20 2a 29 69  pPath, (char *)i
5040: 6e 2c 20 43 43 48 4d 41 58 50 41 54 48 20 29 20  n, CCHMAXPATH ) 
5050: 21 3d 20 55 4c 53 5f 53 55 43 43 45 53 53 20 29  != ULS_SUCCESS )
5060: 0a 20 20 20 20 72 65 74 75 72 6e 20 6f 75 74 3b  .    return out;
5070: 20 2f 2a 20 69 66 20 63 6f 6e 76 65 72 73 69 6f   /* if conversio
5080: 6e 20 66 61 69 6c 73 2c 20 72 65 74 75 72 6e 20  n fails, return 
5090: 74 68 65 20 65 6d 70 74 79 20 73 74 72 69 6e 67  the empty string
50a0: 20 2a 2f 0a 0a 20 20 2f 2a 20 64 65 74 65 72 6d   */..  /* determ
50b0: 69 6e 65 20 73 74 72 69 6e 67 20 66 6f 72 20 74  ine string for t
50c0: 68 65 20 63 6f 6e 76 65 72 73 69 6f 6e 20 6f 66  he conversion of
50d0: 20 55 54 46 2d 38 20 77 68 69 63 68 20 69 73 20   UTF-8 which is 
50e0: 43 50 31 32 30 38 20 2a 2f 0a 20 20 55 6e 69 53  CP1208 */.  UniS
50f0: 74 72 46 72 6f 6d 55 63 73 28 20 75 63 55 74 66  trFromUcs( ucUtf
5100: 38 2c 20 6f 75 74 2c 20 74 65 6d 70 50 61 74 68  8, out, tempPath
5110: 2c 20 43 43 48 4d 41 58 50 41 54 48 20 29 3b 0a  , CCHMAXPATH );.
5120: 0a 20 20 72 65 74 75 72 6e 20 6f 75 74 3b 0a 7d  .  return out;.}
5130: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 65 63  ../*.** This vec
5140: 74 6f 72 20 64 65 66 69 6e 65 73 20 61 6c 6c 20  tor defines all 
5150: 74 68 65 20 6d 65 74 68 6f 64 73 20 74 68 61 74  the methods that
5160: 20 63 61 6e 20 6f 70 65 72 61 74 65 20 6f 6e 20   can operate on 
5170: 61 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 66 69  an.** sqlite3_fi
5180: 6c 65 20 66 6f 72 20 6f 73 32 2e 0a 2a 2f 0a 73  le for os2..*/.s
5190: 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69  tatic const sqli
51a0: 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f  te3_io_methods o
51b0: 73 32 49 6f 4d 65 74 68 6f 64 20 3d 20 7b 0a 20  s2IoMethod = {. 
51c0: 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   1,             
51d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 56             /* iV
51e0: 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 6f 73 32 43  ersion */.  os2C
51f0: 6c 6f 73 65 2c 0a 20 20 6f 73 32 52 65 61 64 2c  lose,.  os2Read,
5200: 0a 20 20 6f 73 32 57 72 69 74 65 2c 0a 20 20 6f  .  os2Write,.  o
5210: 73 32 54 72 75 6e 63 61 74 65 2c 0a 20 20 6f 73  s2Truncate,.  os
5220: 32 53 79 6e 63 2c 0a 20 20 6f 73 32 46 69 6c 65  2Sync,.  os2File
5230: 53 69 7a 65 2c 0a 20 20 6f 73 32 4c 6f 63 6b 2c  Size,.  os2Lock,
5240: 0a 20 20 6f 73 32 55 6e 6c 6f 63 6b 2c 0a 20 20  .  os2Unlock,.  
5250: 6f 73 32 43 68 65 63 6b 52 65 73 65 72 76 65 64  os2CheckReserved
5260: 4c 6f 63 6b 2c 0a 20 20 6f 73 32 46 69 6c 65 43  Lock,.  os2FileC
5270: 6f 6e 74 72 6f 6c 2c 0a 20 20 6f 73 32 53 65 63  ontrol,.  os2Sec
5280: 74 6f 72 53 69 7a 65 2c 0a 20 20 6f 73 32 44 65  torSize,.  os2De
5290: 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
52a0: 69 63 73 0a 7d 3b 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  ics.};../*******
52b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
52c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
52d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
52e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
52f0: 2a 2a 2a 2a 0a 2a 2a 20 48 65 72 65 20 65 6e 64  ****.** Here end
5300: 73 20 74 68 65 20 49 2f 4f 20 6d 65 74 68 6f 64  s the I/O method
5310: 73 20 74 68 61 74 20 66 6f 72 6d 20 74 68 65 20  s that form the 
5320: 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
5330: 64 73 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a  ds object..**.**
5340: 20 54 68 65 20 6e 65 78 74 20 62 6c 6f 63 6b 20   The next block 
5350: 6f 66 20 63 6f 64 65 20 69 6d 70 6c 65 6d 65 6e  of code implemen
5360: 74 73 20 74 68 65 20 56 46 53 20 6d 65 74 68 6f  ts the VFS metho
5370: 64 73 2e 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ds..************
5380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5390: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
53a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
53b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
53c0: 2f 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  /../*.** Create 
53d0: 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
53e0: 20 6e 61 6d 65 20 69 6e 20 7a 42 75 66 2e 20 20   name in zBuf.  
53f0: 7a 42 75 66 20 6d 75 73 74 20 62 65 20 62 69 67  zBuf must be big
5400: 20 65 6e 6f 75 67 68 20 74 6f 0a 2a 2a 20 68 6f   enough to.** ho
5410: 6c 64 20 61 74 20 70 56 66 73 2d 3e 6d 78 50 61  ld at pVfs->mxPa
5420: 74 68 6e 61 6d 65 20 63 68 61 72 61 63 74 65 72  thname character
5430: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
5440: 20 67 65 74 54 65 6d 70 6e 61 6d 65 28 69 6e 74   getTempname(int
5450: 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75   nBuf, char *zBu
5460: 66 20 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f  f ){.  static co
5470: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
5480: 72 20 7a 43 68 61 72 73 5b 5d 20 3d 0a 20 20 20  r zChars[] =.   
5490: 20 22 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e   "abcdefghijklmn
54a0: 6f 70 71 72 73 74 75 76 77 78 79 7a 22 0a 20 20  opqrstuvwxyz".  
54b0: 20 20 22 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d    "ABCDEFGHIJKLM
54c0: 4e 4f 50 51 52 53 54 55 56 57 58 59 5a 22 0a 20  NOPQRSTUVWXYZ". 
54d0: 20 20 20 22 30 31 32 33 34 35 36 37 38 39 22 3b     "0123456789";
54e0: 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 63  .  int i, j;.  c
54f0: 68 61 72 20 7a 54 65 6d 70 50 61 74 68 42 75 66  har zTempPathBuf
5500: 5b 33 5d 3b 0a 20 20 50 53 5a 20 7a 54 65 6d 70  [3];.  PSZ zTemp
5510: 50 61 74 68 20 3d 20 28 50 53 5a 29 26 7a 54 65  Path = (PSZ)&zTe
5520: 6d 70 50 61 74 68 42 75 66 3b 0a 20 20 69 66 28  mpPathBuf;.  if(
5530: 20 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69   sqlite3_temp_di
5540: 72 65 63 74 6f 72 79 20 29 7b 0a 20 20 20 20 7a  rectory ){.    z
5550: 54 65 6d 70 50 61 74 68 20 3d 20 73 71 6c 69 74  TempPath = sqlit
5560: 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72  e3_temp_director
5570: 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  y;.  }else{.    
5580: 69 66 28 20 44 6f 73 53 63 61 6e 45 6e 76 28 20  if( DosScanEnv( 
5590: 28 50 53 5a 29 22 54 45 4d 50 22 2c 20 26 7a 54  (PSZ)"TEMP", &zT
55a0: 65 6d 70 50 61 74 68 20 29 20 29 7b 0a 20 20 20  empPath ) ){.   
55b0: 20 20 20 69 66 28 20 44 6f 73 53 63 61 6e 45 6e     if( DosScanEn
55c0: 76 28 20 28 50 53 5a 29 22 54 4d 50 22 2c 20 26  v( (PSZ)"TMP", &
55d0: 7a 54 65 6d 70 50 61 74 68 20 29 20 29 7b 0a 20  zTempPath ) ){. 
55e0: 20 20 20 20 20 20 20 69 66 28 20 44 6f 73 53 63         if( DosSc
55f0: 61 6e 45 6e 76 28 20 28 50 53 5a 29 22 54 4d 50  anEnv( (PSZ)"TMP
5600: 44 49 52 22 2c 20 26 7a 54 65 6d 70 50 61 74 68  DIR", &zTempPath
5610: 20 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20   ) ){.          
5620: 20 55 4c 4f 4e 47 20 75 6c 44 72 69 76 65 4e 75   ULONG ulDriveNu
5630: 6d 20 3d 20 30 2c 20 75 6c 44 72 69 76 65 4d 61  m = 0, ulDriveMa
5640: 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  p = 0;.         
5650: 20 20 44 6f 73 51 75 65 72 79 43 75 72 72 65 6e    DosQueryCurren
5660: 74 44 69 73 6b 28 20 26 75 6c 44 72 69 76 65 4e  tDisk( &ulDriveN
5670: 75 6d 2c 20 26 75 6c 44 72 69 76 65 4d 61 70 20  um, &ulDriveMap 
5680: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 73 70  );.           sp
5690: 72 69 6e 74 66 28 20 28 63 68 61 72 2a 29 7a 54  rintf( (char*)zT
56a0: 65 6d 70 50 61 74 68 2c 20 22 25 63 3a 22 2c 20  empPath, "%c:", 
56b0: 28 63 68 61 72 29 28 20 27 41 27 20 2b 20 75 6c  (char)( 'A' + ul
56c0: 44 72 69 76 65 4e 75 6d 20 2d 20 31 20 29 20 29  DriveNum - 1 ) )
56d0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
56e0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
56f0: 2f 2a 20 53 74 72 69 70 20 6f 66 66 20 61 20 74  /* Strip off a t
5700: 72 61 69 6c 69 6e 67 20 73 6c 61 73 68 65 73 20  railing slashes 
5710: 6f 72 20 62 61 63 6b 73 6c 61 73 68 65 73 2c 20  or backslashes, 
5720: 6f 74 68 65 72 77 69 73 65 20 77 65 20 77 6f 75  otherwise we wou
5730: 6c 64 20 67 65 74 20 2a 0a 20 20 20 2a 20 6d 75  ld get *.   * mu
5740: 6c 74 69 70 6c 65 20 28 62 61 63 6b 29 73 6c 61  ltiple (back)sla
5750: 73 68 65 73 20 77 68 69 63 68 20 63 61 75 73 65  shes which cause
5760: 73 20 44 6f 73 4f 70 65 6e 28 29 20 74 6f 20 66  s DosOpen() to f
5770: 61 69 6c 2e 20 20 20 20 20 20 20 20 20 20 20 20  ail.            
5780: 20 20 2a 0a 20 20 20 2a 20 54 72 61 69 6c 69 6e    *.   * Trailin
5790: 67 20 73 70 61 63 65 73 20 61 72 65 20 6e 6f 74  g spaces are not
57a0: 20 61 6c 6c 6f 77 65 64 2c 20 65 69 74 68 65 72   allowed, either
57b0: 2e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
57c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a               */.
57d0: 20 20 6a 20 3d 20 73 71 6c 69 74 65 33 53 74 72    j = sqlite3Str
57e0: 6c 65 6e 33 30 28 7a 54 65 6d 70 50 61 74 68 29  len30(zTempPath)
57f0: 3b 0a 20 20 77 68 69 6c 65 28 20 6a 20 3e 20 30  ;.  while( j > 0
5800: 20 26 26 20 28 20 7a 54 65 6d 70 50 61 74 68 5b   && ( zTempPath[
5810: 6a 2d 31 5d 20 3d 3d 20 27 5c 5c 27 20 7c 7c 20  j-1] == '\\' || 
5820: 7a 54 65 6d 70 50 61 74 68 5b 6a 2d 31 5d 20 3d  zTempPath[j-1] =
5830: 3d 20 27 2f 27 0a 20 20 20 20 20 20 20 20 20 20  = '/'.          
5840: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 7a 54 65            || zTe
5850: 6d 70 50 61 74 68 5b 6a 2d 31 5d 20 3d 3d 20 27  mpPath[j-1] == '
5860: 20 27 20 29 20 29 7b 0a 20 20 20 20 6a 2d 2d 3b   ' ) ){.    j--;
5870: 0a 20 20 7d 0a 20 20 7a 54 65 6d 70 50 61 74 68  .  }.  zTempPath
5880: 5b 6a 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 69 66  [j] = '\0';.  if
5890: 28 20 21 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f  ( !sqlite3_temp_
58a0: 64 69 72 65 63 74 6f 72 79 20 29 7b 0a 20 20 20  directory ){.   
58b0: 20 63 68 61 72 20 2a 7a 54 65 6d 70 50 61 74 68   char *zTempPath
58c0: 55 54 46 20 3d 20 63 6f 6e 76 65 72 74 43 70 50  UTF = convertCpP
58d0: 61 74 68 54 6f 55 74 66 38 28 20 7a 54 65 6d 70  athToUtf8( zTemp
58e0: 50 61 74 68 20 29 3b 0a 20 20 20 20 73 71 6c 69  Path );.    sqli
58f0: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 20 6e 42  te3_snprintf( nB
5900: 75 66 2d 33 30 2c 20 7a 42 75 66 2c 0a 20 20 20  uf-30, zBuf,.   
5910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5920: 20 20 20 22 25 73 5c 5c 22 53 51 4c 49 54 45 5f     "%s\\"SQLITE_
5930: 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49 58  TEMP_FILE_PREFIX
5940: 2c 20 7a 54 65 6d 70 50 61 74 68 55 54 46 20 29  , zTempPathUTF )
5950: 3b 0a 20 20 20 20 66 72 65 65 28 20 7a 54 65 6d  ;.    free( zTem
5960: 70 50 61 74 68 55 54 46 20 29 3b 0a 20 20 7d 65  pPathUTF );.  }e
5970: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
5980: 5f 73 6e 70 72 69 6e 74 66 28 20 6e 42 75 66 2d  _snprintf( nBuf-
5990: 33 30 2c 20 7a 42 75 66 2c 0a 20 20 20 20 20 20  30, zBuf,.      
59a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
59b0: 22 25 73 5c 5c 22 53 51 4c 49 54 45 5f 54 45 4d  "%s\\"SQLITE_TEM
59c0: 50 5f 46 49 4c 45 5f 50 52 45 46 49 58 2c 20 7a  P_FILE_PREFIX, z
59d0: 54 65 6d 70 50 61 74 68 20 29 3b 0a 20 20 7d 0a  TempPath );.  }.
59e0: 20 20 6a 20 3d 20 73 71 6c 69 74 65 33 53 74 72    j = sqlite3Str
59f0: 6c 65 6e 33 30 28 20 7a 42 75 66 20 29 3b 0a 20  len30( zBuf );. 
5a00: 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e   sqlite3_randomn
5a10: 65 73 73 28 20 32 30 2c 20 26 7a 42 75 66 5b 6a  ess( 20, &zBuf[j
5a20: 5d 20 29 3b 0a 20 20 66 6f 72 28 20 69 20 3d 20  ] );.  for( i = 
5a30: 30 3b 20 69 20 3c 20 32 30 3b 20 69 2b 2b 2c 20  0; i < 20; i++, 
5a40: 6a 2b 2b 20 29 7b 0a 20 20 20 20 7a 42 75 66 5b  j++ ){.    zBuf[
5a50: 6a 5d 20 3d 20 28 63 68 61 72 29 7a 43 68 61 72  j] = (char)zChar
5a60: 73 5b 20 28 28 75 6e 73 69 67 6e 65 64 20 63 68  s[ ((unsigned ch
5a70: 61 72 29 7a 42 75 66 5b 6a 5d 29 25 28 73 69 7a  ar)zBuf[j])%(siz
5a80: 65 6f 66 28 7a 43 68 61 72 73 29 2d 31 29 20 5d  eof(zChars)-1) ]
5a90: 3b 0a 20 20 7d 0a 20 20 7a 42 75 66 5b 6a 5d 20  ;.  }.  zBuf[j] 
5aa0: 3d 20 30 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  = 0;.  OSTRACE((
5ab0: 20 22 54 45 4d 50 20 46 49 4c 45 4e 41 4d 45 3a   "TEMP FILENAME:
5ac0: 20 25 73 5c 6e 22 2c 20 7a 42 75 66 20 29 29 3b   %s\n", zBuf ));
5ad0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
5ae0: 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  _OK;.}.../*.** T
5af0: 75 72 6e 20 61 20 72 65 6c 61 74 69 76 65 20 70  urn a relative p
5b00: 61 74 68 6e 61 6d 65 20 69 6e 74 6f 20 61 20 66  athname into a f
5b10: 75 6c 6c 20 70 61 74 68 6e 61 6d 65 2e 20 20 57  ull pathname.  W
5b20: 72 69 74 65 20 74 68 65 20 66 75 6c 6c 0a 2a 2a  rite the full.**
5b30: 20 70 61 74 68 6e 61 6d 65 20 69 6e 74 6f 20 7a   pathname into z
5b40: 46 75 6c 6c 5b 5d 2e 20 20 7a 46 75 6c 6c 5b 5d  Full[].  zFull[]
5b50: 20 77 69 6c 6c 20 62 65 20 61 74 20 6c 65 61 73   will be at leas
5b60: 74 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  t pVfs->mxPathna
5b70: 6d 65 0a 2a 2a 20 62 79 74 65 73 20 69 6e 20 73  me.** bytes in s
5b80: 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ize..*/.static i
5b90: 6e 74 20 6f 73 32 46 75 6c 6c 50 61 74 68 6e 61  nt os2FullPathna
5ba0: 6d 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  me(.  sqlite3_vf
5bb0: 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20  s *pVfs,        
5bc0: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
5bd0: 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  vfs object */.  
5be0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 65 6c  const char *zRel
5bf0: 61 74 69 76 65 2c 20 20 20 20 20 20 2f 2a 20 50  ative,      /* P
5c00: 6f 73 73 69 62 6c 79 20 72 65 6c 61 74 69 76 65  ossibly relative
5c10: 20 69 6e 70 75 74 20 70 61 74 68 20 2a 2f 0a 20   input path */. 
5c20: 20 69 6e 74 20 6e 46 75 6c 6c 2c 20 20 20 20 20   int nFull,     
5c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5c40: 53 69 7a 65 20 6f 66 20 6f 75 74 70 75 74 20 62  Size of output b
5c50: 75 66 66 65 72 20 69 6e 20 62 79 74 65 73 20 2a  uffer in bytes *
5c60: 2f 0a 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 20  /.  char *zFull 
5c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c80: 2f 2a 20 4f 75 74 70 75 74 20 62 75 66 66 65 72  /* Output buffer
5c90: 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a   */.){.  char *z
5ca0: 52 65 6c 61 74 69 76 65 43 70 20 3d 20 63 6f 6e  RelativeCp = con
5cb0: 76 65 72 74 55 74 66 38 50 61 74 68 54 6f 43 70  vertUtf8PathToCp
5cc0: 28 20 7a 52 65 6c 61 74 69 76 65 20 29 3b 0a 20  ( zRelative );. 
5cd0: 20 63 68 61 72 20 7a 46 75 6c 6c 43 70 5b 43 43   char zFullCp[CC
5ce0: 48 4d 41 58 50 41 54 48 5d 20 3d 20 22 5c 30 22  HMAXPATH] = "\0"
5cf0: 3b 0a 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 55  ;.  char *zFullU
5d00: 54 46 3b 0a 20 20 41 50 49 52 45 54 20 72 63 20  TF;.  APIRET rc 
5d10: 3d 20 44 6f 73 51 75 65 72 79 50 61 74 68 49 6e  = DosQueryPathIn
5d20: 66 6f 28 20 7a 52 65 6c 61 74 69 76 65 43 70 2c  fo( zRelativeCp,
5d30: 20 46 49 4c 5f 51 55 45 52 59 46 55 4c 4c 4e 41   FIL_QUERYFULLNA
5d40: 4d 45 2c 20 7a 46 75 6c 6c 43 70 2c 0a 20 20 20  ME, zFullCp,.   
5d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 43 43 48               CCH
5d70: 4d 41 58 50 41 54 48 20 29 3b 0a 20 20 66 72 65  MAXPATH );.  fre
5d80: 65 28 20 7a 52 65 6c 61 74 69 76 65 43 70 20 29  e( zRelativeCp )
5d90: 3b 0a 20 20 7a 46 75 6c 6c 55 54 46 20 3d 20 63  ;.  zFullUTF = c
5da0: 6f 6e 76 65 72 74 43 70 50 61 74 68 54 6f 55 74  onvertCpPathToUt
5db0: 66 38 28 20 7a 46 75 6c 6c 43 70 20 29 3b 0a 20  f8( zFullCp );. 
5dc0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
5dd0: 66 28 20 6e 46 75 6c 6c 2c 20 7a 46 75 6c 6c 2c  f( nFull, zFull,
5de0: 20 7a 46 75 6c 6c 55 54 46 20 29 3b 0a 20 20 66   zFullUTF );.  f
5df0: 72 65 65 28 20 7a 46 75 6c 6c 55 54 46 20 29 3b  ree( zFullUTF );
5e00: 0a 20 20 72 65 74 75 72 6e 20 72 63 20 3d 3d 20  .  return rc == 
5e10: 4e 4f 5f 45 52 52 4f 52 20 3f 20 53 51 4c 49 54  NO_ERROR ? SQLIT
5e20: 45 5f 4f 4b 20 3a 20 53 51 4c 49 54 45 5f 49 4f  E_OK : SQLITE_IO
5e30: 45 52 52 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4f  ERR;.}.../*.** O
5e40: 70 65 6e 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73  pen a file..*/.s
5e50: 74 61 74 69 63 20 69 6e 74 20 6f 73 32 4f 70 65  tatic int os2Ope
5e60: 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  n(.  sqlite3_vfs
5e70: 20 2a 70 56 66 73 2c 20 20 20 20 20 20 20 20 20   *pVfs,         
5e80: 20 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 2a     /* Not used *
5e90: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
5ea0: 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20  zName,          
5eb0: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
5ec0: 20 66 69 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74   file */.  sqlit
5ed0: 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 20 20 20  e3_file *id,    
5ee0: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
5ef0: 65 20 74 68 65 20 53 51 4c 69 74 65 20 66 69 6c  e the SQLite fil
5f00: 65 20 68 61 6e 64 6c 65 20 68 65 72 65 20 2a 2f  e handle here */
5f10: 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20  .  int flags,   
5f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5f30: 20 2f 2a 20 4f 70 65 6e 20 6d 6f 64 65 20 66 6c   /* Open mode fl
5f40: 61 67 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4f  ags */.  int *pO
5f50: 75 74 46 6c 61 67 73 20 20 20 20 20 20 20 20 20  utFlags         
5f60: 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74 75 73         /* Status
5f70: 20 72 65 74 75 72 6e 20 66 6c 61 67 73 20 2a 2f   return flags */
5f80: 0a 29 7b 0a 20 20 48 46 49 4c 45 20 68 3b 0a 20  .){.  HFILE h;. 
5f90: 20 55 4c 4f 4e 47 20 75 6c 46 69 6c 65 41 74 74   ULONG ulFileAtt
5fa0: 72 69 62 75 74 65 20 3d 20 46 49 4c 45 5f 4e 4f  ribute = FILE_NO
5fb0: 52 4d 41 4c 3b 0a 20 20 55 4c 4f 4e 47 20 75 6c  RMAL;.  ULONG ul
5fc0: 4f 70 65 6e 46 6c 61 67 73 20 3d 20 30 3b 0a 20  OpenFlags = 0;. 
5fd0: 20 55 4c 4f 4e 47 20 75 6c 4f 70 65 6e 4d 6f 64   ULONG ulOpenMod
5fe0: 65 20 3d 20 30 3b 0a 20 20 6f 73 32 46 69 6c 65  e = 0;.  os2File
5ff0: 20 2a 70 46 69 6c 65 20 3d 20 28 6f 73 32 46 69   *pFile = (os2Fi
6000: 6c 65 2a 29 69 64 3b 0a 20 20 41 50 49 52 45 54  le*)id;.  APIRET
6010: 20 72 63 20 3d 20 4e 4f 5f 45 52 52 4f 52 3b 0a   rc = NO_ERROR;.
6020: 20 20 55 4c 4f 4e 47 20 75 6c 41 63 74 69 6f 6e    ULONG ulAction
6030: 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 43  ;.  char *zNameC
6040: 70 3b 0a 20 20 63 68 61 72 20 7a 54 6d 70 6e 61  p;.  char zTmpna
6050: 6d 65 5b 43 43 48 4d 41 58 50 41 54 48 2b 31 5d  me[CCHMAXPATH+1]
6060: 3b 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74  ;    /* Buffer t
6070: 6f 20 68 6f 6c 64 20 6e 61 6d 65 20 6f 66 20 74  o hold name of t
6080: 65 6d 70 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 2f  emp file */..  /
6090: 2a 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20  * If the second 
60a0: 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73  argument to this
60b0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 4e 55 4c   function is NUL
60c0: 4c 2c 20 67 65 6e 65 72 61 74 65 20 61 20 0a 20  L, generate a . 
60d0: 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 66 69   ** temporary fi
60e0: 6c 65 20 6e 61 6d 65 20 74 6f 20 75 73 65 20 0a  le name to use .
60f0: 20 20 2a 2f 0a 20 20 69 66 28 20 21 7a 4e 61 6d    */.  if( !zNam
6100: 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 20  e ){.    int rc 
6110: 3d 20 67 65 74 54 65 6d 70 6e 61 6d 65 28 43 43  = getTempname(CC
6120: 48 4d 41 58 50 41 54 48 2b 31 2c 20 7a 54 6d 70  HMAXPATH+1, zTmp
6130: 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 72  name);.    if( r
6140: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
6150: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
6160: 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4e 61 6d 65  .    }.    zName
6170: 20 3d 20 7a 54 6d 70 6e 61 6d 65 3b 0a 20 20 7d   = zTmpname;.  }
6180: 0a 0a 0a 20 20 6d 65 6d 73 65 74 28 20 70 46 69  ...  memset( pFi
6190: 6c 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  le, 0, sizeof(*p
61a0: 46 69 6c 65 29 20 29 3b 0a 0a 20 20 4f 53 54 52  File) );..  OSTR
61b0: 41 43 45 28 20 22 4f 50 45 4e 20 77 61 6e 74 20  ACE( "OPEN want 
61c0: 25 64 5c 6e 22 2c 20 66 6c 61 67 73 20 29 29 3b  %d\n", flags ));
61d0: 0a 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20  ..  if( flags & 
61e0: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
61f0: 57 52 49 54 45 20 29 7b 0a 20 20 20 20 75 6c 4f  WRITE ){.    ulO
6200: 70 65 6e 4d 6f 64 65 20 7c 3d 20 4f 50 45 4e 5f  penMode |= OPEN_
6210: 41 43 43 45 53 53 5f 52 45 41 44 57 52 49 54 45  ACCESS_READWRITE
6220: 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 20  ;.    OSTRACE(( 
6230: 22 4f 50 45 4e 20 72 65 61 64 2f 77 72 69 74 65  "OPEN read/write
6240: 5c 6e 22 20 29 29 3b 0a 20 20 7d 65 6c 73 65 7b  \n" ));.  }else{
6250: 0a 20 20 20 20 75 6c 4f 70 65 6e 4d 6f 64 65 20  .    ulOpenMode 
6260: 7c 3d 20 4f 50 45 4e 5f 41 43 43 45 53 53 5f 52  |= OPEN_ACCESS_R
6270: 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 4f 53 54  EADONLY;.    OST
6280: 52 41 43 45 28 28 20 22 4f 50 45 4e 20 72 65 61  RACE(( "OPEN rea
6290: 64 20 6f 6e 6c 79 5c 6e 22 20 29 29 3b 0a 20 20  d only\n" ));.  
62a0: 7d 0a 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26  }..  if( flags &
62b0: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45   SQLITE_OPEN_CRE
62c0: 41 54 45 20 29 7b 0a 20 20 20 20 75 6c 4f 70 65  ATE ){.    ulOpe
62d0: 6e 46 6c 61 67 73 20 7c 3d 20 4f 50 45 4e 5f 41  nFlags |= OPEN_A
62e0: 43 54 49 4f 4e 5f 4f 50 45 4e 5f 49 46 5f 45 58  CTION_OPEN_IF_EX
62f0: 49 53 54 53 20 7c 20 4f 50 45 4e 5f 41 43 54 49  ISTS | OPEN_ACTI
6300: 4f 4e 5f 43 52 45 41 54 45 5f 49 46 5f 4e 45 57  ON_CREATE_IF_NEW
6310: 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 20  ;.    OSTRACE(( 
6320: 22 4f 50 45 4e 20 6f 70 65 6e 20 6e 65 77 2f 63  "OPEN open new/c
6330: 72 65 61 74 65 5c 6e 22 20 29 29 3b 0a 20 20 7d  reate\n" ));.  }
6340: 65 6c 73 65 7b 0a 20 20 20 20 75 6c 4f 70 65 6e  else{.    ulOpen
6350: 46 6c 61 67 73 20 7c 3d 20 4f 50 45 4e 5f 41 43  Flags |= OPEN_AC
6360: 54 49 4f 4e 5f 4f 50 45 4e 5f 49 46 5f 45 58 49  TION_OPEN_IF_EXI
6370: 53 54 53 20 7c 20 4f 50 45 4e 5f 41 43 54 49 4f  STS | OPEN_ACTIO
6380: 4e 5f 46 41 49 4c 5f 49 46 5f 4e 45 57 3b 0a 20  N_FAIL_IF_NEW;. 
6390: 20 20 20 4f 53 54 52 41 43 45 28 28 20 22 4f 50     OSTRACE(( "OP
63a0: 45 4e 20 6f 70 65 6e 20 65 78 69 73 74 69 6e 67  EN open existing
63b0: 5c 6e 22 20 29 29 3b 0a 20 20 7d 0a 0a 20 20 69  \n" ));.  }..  i
63c0: 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54  f( flags & SQLIT
63d0: 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29  E_OPEN_MAIN_DB )
63e0: 7b 0a 20 20 20 20 75 6c 4f 70 65 6e 4d 6f 64 65  {.    ulOpenMode
63f0: 20 7c 3d 20 4f 50 45 4e 5f 53 48 41 52 45 5f 44   |= OPEN_SHARE_D
6400: 45 4e 59 4e 4f 4e 45 3b 0a 20 20 20 20 4f 53 54  ENYNONE;.    OST
6410: 52 41 43 45 28 28 20 22 4f 50 45 4e 20 73 68 61  RACE(( "OPEN sha
6420: 72 65 20 72 65 61 64 2f 77 72 69 74 65 5c 6e 22  re read/write\n"
6430: 20 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   ));.  }else{.  
6440: 20 20 75 6c 4f 70 65 6e 4d 6f 64 65 20 7c 3d 20    ulOpenMode |= 
6450: 4f 50 45 4e 5f 53 48 41 52 45 5f 44 45 4e 59 57  OPEN_SHARE_DENYW
6460: 52 49 54 45 3b 0a 20 20 20 20 4f 53 54 52 41 43  RITE;.    OSTRAC
6470: 45 28 28 20 22 4f 50 45 4e 20 73 68 61 72 65 20  E(( "OPEN share 
6480: 72 65 61 64 20 6f 6e 6c 79 5c 6e 22 20 29 29 3b  read only\n" ));
6490: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 66 6c 61 67  .  }..  if( flag
64a0: 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
64b0: 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 29 7b  DELETEONCLOSE ){
64c0: 0a 20 20 20 20 63 68 61 72 20 70 61 74 68 55 74  .    char pathUt
64d0: 66 38 5b 43 43 48 4d 41 58 50 41 54 48 5d 3b 0a  f8[CCHMAXPATH];.
64e0: 23 69 66 64 65 66 20 4e 44 45 42 55 47 20 2f 2a  #ifdef NDEBUG /*
64f0: 20 77 68 65 6e 20 64 65 62 75 67 67 69 6e 67 20   when debugging 
6500: 77 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20  we want to make 
6510: 73 75 72 65 20 69 74 20 69 73 20 64 65 6c 65 74  sure it is delet
6520: 65 64 20 2a 2f 0a 20 20 20 20 75 6c 46 69 6c 65  ed */.    ulFile
6530: 41 74 74 72 69 62 75 74 65 20 3d 20 46 49 4c 45  Attribute = FILE
6540: 5f 48 49 44 44 45 4e 3b 0a 23 65 6e 64 69 66 0a  _HIDDEN;.#endif.
6550: 20 20 20 20 6f 73 32 46 75 6c 6c 50 61 74 68 6e      os2FullPathn
6560: 61 6d 65 28 20 70 56 66 73 2c 20 7a 4e 61 6d 65  ame( pVfs, zName
6570: 2c 20 43 43 48 4d 41 58 50 41 54 48 2c 20 70 61  , CCHMAXPATH, pa
6580: 74 68 55 74 66 38 20 29 3b 0a 20 20 20 20 70 46  thUtf8 );.    pF
6590: 69 6c 65 2d 3e 70 61 74 68 54 6f 44 65 6c 20 3d  ile->pathToDel =
65a0: 20 63 6f 6e 76 65 72 74 55 74 66 38 50 61 74 68   convertUtf8Path
65b0: 54 6f 43 70 28 20 70 61 74 68 55 74 66 38 20 29  ToCp( pathUtf8 )
65c0: 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 20  ;.    OSTRACE(( 
65d0: 22 4f 50 45 4e 20 68 69 64 64 65 6e 2f 64 65 6c  "OPEN hidden/del
65e0: 65 74 65 20 6f 6e 20 63 6c 6f 73 65 20 66 69 6c  ete on close fil
65f0: 65 20 61 74 74 72 69 62 75 74 65 73 5c 6e 22 20  e attributes\n" 
6600: 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ));.  }else{.   
6610: 20 70 46 69 6c 65 2d 3e 70 61 74 68 54 6f 44 65   pFile->pathToDe
6620: 6c 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 4f 53  l = NULL;.    OS
6630: 54 52 41 43 45 28 28 20 22 4f 50 45 4e 20 6e 6f  TRACE(( "OPEN no
6640: 72 6d 61 6c 20 66 69 6c 65 20 61 74 74 72 69 62  rmal file attrib
6650: 75 74 65 5c 6e 22 20 29 29 3b 0a 20 20 7d 0a 0a  ute\n" ));.  }..
6660: 20 20 2f 2a 20 61 6c 77 61 79 73 20 6f 70 65 6e    /* always open
6670: 20 69 6e 20 72 61 6e 64 6f 6d 20 61 63 63 65 73   in random acces
6680: 73 20 6d 6f 64 65 20 66 6f 72 20 70 6f 73 73 69  s mode for possi
6690: 62 6c 79 20 62 65 74 74 65 72 20 73 70 65 65 64  bly better speed
66a0: 20 2a 2f 0a 20 20 75 6c 4f 70 65 6e 4d 6f 64 65   */.  ulOpenMode
66b0: 20 7c 3d 20 4f 50 45 4e 5f 46 4c 41 47 53 5f 52   |= OPEN_FLAGS_R
66c0: 41 4e 44 4f 4d 3b 0a 20 20 75 6c 4f 70 65 6e 4d  ANDOM;.  ulOpenM
66d0: 6f 64 65 20 7c 3d 20 4f 50 45 4e 5f 46 4c 41 47  ode |= OPEN_FLAG
66e0: 53 5f 46 41 49 4c 5f 4f 4e 5f 45 52 52 4f 52 3b  S_FAIL_ON_ERROR;
66f0: 0a 20 20 75 6c 4f 70 65 6e 4d 6f 64 65 20 7c 3d  .  ulOpenMode |=
6700: 20 4f 50 45 4e 5f 46 4c 41 47 53 5f 4e 4f 49 4e   OPEN_FLAGS_NOIN
6710: 48 45 52 49 54 3b 0a 0a 20 20 7a 4e 61 6d 65 43  HERIT;..  zNameC
6720: 70 20 3d 20 63 6f 6e 76 65 72 74 55 74 66 38 50  p = convertUtf8P
6730: 61 74 68 54 6f 43 70 28 20 7a 4e 61 6d 65 20 29  athToCp( zName )
6740: 3b 0a 20 20 72 63 20 3d 20 44 6f 73 4f 70 65 6e  ;.  rc = DosOpen
6750: 28 20 28 50 53 5a 29 7a 4e 61 6d 65 43 70 2c 0a  ( (PSZ)zNameCp,.
6760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6770: 26 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  &h,.            
6780: 20 20 20 20 26 75 6c 41 63 74 69 6f 6e 2c 0a 20      &ulAction,. 
6790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
67a0: 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  L,.             
67b0: 20 20 20 75 6c 46 69 6c 65 41 74 74 72 69 62 75     ulFileAttribu
67c0: 74 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  te,.            
67d0: 20 20 20 20 75 6c 4f 70 65 6e 46 6c 61 67 73 2c      ulOpenFlags,
67e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
67f0: 20 75 6c 4f 70 65 6e 4d 6f 64 65 2c 0a 20 20 20   ulOpenMode,.   
6800: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 50 45               (PE
6810: 41 4f 50 32 29 4e 55 4c 4c 20 29 3b 0a 20 20 66  AOP2)NULL );.  f
6820: 72 65 65 28 20 7a 4e 61 6d 65 43 70 20 29 3b 0a  ree( zNameCp );.
6830: 20 20 69 66 28 20 72 63 20 21 3d 20 4e 4f 5f 45    if( rc != NO_E
6840: 52 52 4f 52 20 29 7b 0a 20 20 20 20 4f 53 54 52  RROR ){.    OSTR
6850: 41 43 45 28 28 20 22 4f 50 45 4e 20 49 6e 76 61  ACE(( "OPEN Inva
6860: 6c 69 64 20 68 61 6e 64 6c 65 20 72 63 3d 25 64  lid handle rc=%d
6870: 3a 20 7a 4e 61 6d 65 3d 25 73 2c 20 75 6c 41 63  : zName=%s, ulAc
6880: 74 69 6f 6e 3d 25 23 6c 78 2c 20 75 6c 41 74 74  tion=%#lx, ulAtt
6890: 72 3d 25 23 6c 78 2c 20 75 6c 46 6c 61 67 73 3d  r=%#lx, ulFlags=
68a0: 25 23 6c 78 2c 20 75 6c 4d 6f 64 65 3d 25 23 6c  %#lx, ulMode=%#l
68b0: 78 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  x\n",.          
68c0: 20 20 20 20 72 63 2c 20 7a 4e 61 6d 65 2c 20 75      rc, zName, u
68d0: 6c 41 63 74 69 6f 6e 2c 20 75 6c 46 69 6c 65 41  lAction, ulFileA
68e0: 74 74 72 69 62 75 74 65 2c 20 75 6c 4f 70 65 6e  ttribute, ulOpen
68f0: 46 6c 61 67 73 2c 20 75 6c 4f 70 65 6e 4d 6f 64  Flags, ulOpenMod
6900: 65 20 29 29 3b 0a 20 20 20 20 69 66 28 20 70 46  e ));.    if( pF
6910: 69 6c 65 2d 3e 70 61 74 68 54 6f 44 65 6c 20 29  ile->pathToDel )
6920: 0a 20 20 20 20 20 20 66 72 65 65 28 20 70 46 69  .      free( pFi
6930: 6c 65 2d 3e 70 61 74 68 54 6f 44 65 6c 20 29 3b  le->pathToDel );
6940: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 70 61 74 68  .    pFile->path
6950: 54 6f 44 65 6c 20 3d 20 4e 55 4c 4c 3b 0a 20 20  ToDel = NULL;.  
6960: 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51    if( flags & SQ
6970: 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
6980: 49 54 45 20 29 7b 0a 20 20 20 20 20 20 4f 53 54  ITE ){.      OST
6990: 52 41 43 45 28 28 20 22 4f 50 45 4e 20 25 64 20  RACE(( "OPEN %d 
69a0: 49 6e 76 61 6c 69 64 20 68 61 6e 64 6c 65 5c 6e  Invalid handle\n
69b0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
69c0: 20 20 20 28 28 66 6c 61 67 73 20 7c 20 53 51 4c     ((flags | SQL
69d0: 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
69e0: 59 29 20 26 20 7e 53 51 4c 49 54 45 5f 4f 50 45  Y) & ~SQLITE_OPE
69f0: 4e 5f 52 45 41 44 57 52 49 54 45 29 20 29 29 3b  N_READWRITE) ));
6a00: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 6f 73  .      return os
6a10: 32 4f 70 65 6e 28 20 70 56 66 73 2c 20 7a 4e 61  2Open( pVfs, zNa
6a20: 6d 65 2c 20 69 64 2c 0a 20 20 20 20 20 20 20 20  me, id,.        
6a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28                ((
6a40: 66 6c 61 67 73 20 7c 20 53 51 4c 49 54 45 5f 4f  flags | SQLITE_O
6a50: 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 20 26 20  PEN_READONLY) & 
6a60: 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  ~SQLITE_OPEN_REA
6a70: 44 57 52 49 54 45 29 2c 0a 20 20 20 20 20 20 20  DWRITE),.       
6a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
6a90: 4f 75 74 46 6c 61 67 73 20 29 3b 0a 20 20 20 20  OutFlags );.    
6aa0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74  }else{.      ret
6ab0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  urn SQLITE_CANTO
6ac0: 50 45 4e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  PEN;.    }.  }..
6ad0: 20 20 69 66 28 20 70 4f 75 74 46 6c 61 67 73 20    if( pOutFlags 
6ae0: 29 7b 0a 20 20 20 20 2a 70 4f 75 74 46 6c 61 67  ){.    *pOutFlag
6af0: 73 20 3d 20 66 6c 61 67 73 20 26 20 53 51 4c 49  s = flags & SQLI
6b00: 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
6b10: 45 20 3f 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  E ? SQLITE_OPEN_
6b20: 52 45 41 44 57 52 49 54 45 20 3a 20 53 51 4c 49  READWRITE : SQLI
6b30: 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
6b40: 3b 0a 20 20 7d 0a 0a 20 20 70 46 69 6c 65 2d 3e  ;.  }..  pFile->
6b50: 70 4d 65 74 68 6f 64 20 3d 20 26 6f 73 32 49 6f  pMethod = &os2Io
6b60: 4d 65 74 68 6f 64 3b 0a 20 20 70 46 69 6c 65 2d  Method;.  pFile-
6b70: 3e 68 20 3d 20 68 3b 0a 20 20 4f 70 65 6e 43 6f  >h = h;.  OpenCo
6b80: 75 6e 74 65 72 28 2b 31 29 3b 0a 20 20 4f 53 54  unter(+1);.  OST
6b90: 52 41 43 45 28 28 20 22 4f 50 45 4e 20 25 64 20  RACE(( "OPEN %d 
6ba0: 70 4f 75 74 46 6c 61 67 73 3d 25 64 5c 6e 22 2c  pOutFlags=%d\n",
6bb0: 20 70 46 69 6c 65 2d 3e 68 2c 20 70 4f 75 74 46   pFile->h, pOutF
6bc0: 6c 61 67 73 20 29 29 3b 0a 20 20 72 65 74 75 72  lags ));.  retur
6bd0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
6be0: 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65  /*.** Delete the
6bf0: 20 6e 61 6d 65 64 20 66 69 6c 65 2e 0a 2a 2f 0a   named file..*/.
6c00: 73 74 61 74 69 63 20 69 6e 74 20 6f 73 32 44 65  static int os2De
6c10: 6c 65 74 65 28 0a 20 20 73 71 6c 69 74 65 33 5f  lete(.  sqlite3_
6c20: 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20  vfs *pVfs,      
6c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6c40: 2a 20 4e 6f 74 20 75 73 65 64 20 6f 6e 20 6f 73  * Not used on os
6c50: 32 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  2 */.  const cha
6c60: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20  r *zFilename,   
6c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6c80: 20 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f   Name of file to
6c90: 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 69 6e 74   delete */.  int
6ca0: 20 73 79 6e 63 44 69 72 20 20 20 20 20 20 20 20   syncDir        
6cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6cc0: 20 20 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20      /* Not used 
6cd0: 6f 6e 20 6f 73 32 20 2a 2f 0a 29 7b 0a 20 20 41  on os2 */.){.  A
6ce0: 50 49 52 45 54 20 72 63 20 3d 20 4e 4f 5f 45 52  PIRET rc = NO_ER
6cf0: 52 4f 52 3b 0a 20 20 63 68 61 72 20 2a 7a 46 69  ROR;.  char *zFi
6d00: 6c 65 6e 61 6d 65 43 70 20 3d 20 63 6f 6e 76 65  lenameCp = conve
6d10: 72 74 55 74 66 38 50 61 74 68 54 6f 43 70 28 20  rtUtf8PathToCp( 
6d20: 7a 46 69 6c 65 6e 61 6d 65 20 29 3b 0a 20 20 53  zFilename );.  S
6d30: 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
6d40: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
6d50: 45 52 52 5f 44 45 4c 45 54 45 20 29 3b 0a 20 20  ERR_DELETE );.  
6d60: 72 63 20 3d 20 44 6f 73 44 65 6c 65 74 65 28 20  rc = DosDelete( 
6d70: 28 50 53 5a 29 7a 46 69 6c 65 6e 61 6d 65 43 70  (PSZ)zFilenameCp
6d80: 20 29 3b 0a 20 20 66 72 65 65 28 20 7a 46 69 6c   );.  free( zFil
6d90: 65 6e 61 6d 65 43 70 20 29 3b 0a 20 20 4f 53 54  enameCp );.  OST
6da0: 52 41 43 45 28 28 20 22 44 45 4c 45 54 45 20 5c  RACE(( "DELETE \
6db0: 22 25 73 5c 22 5c 6e 22 2c 20 7a 46 69 6c 65 6e  "%s\"\n", zFilen
6dc0: 61 6d 65 20 29 29 3b 0a 20 20 72 65 74 75 72 6e  ame ));.  return
6dd0: 20 72 63 20 3d 3d 20 4e 4f 5f 45 52 52 4f 52 20   rc == NO_ERROR 
6de0: 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51  ? SQLITE_OK : SQ
6df0: 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54  LITE_IOERR_DELET
6e00: 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  E;.}../*.** Chec
6e10: 6b 20 74 68 65 20 65 78 69 73 74 61 6e 63 65 20  k the existance 
6e20: 61 6e 64 20 73 74 61 74 75 73 20 6f 66 20 61 20  and status of a 
6e30: 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
6e40: 69 6e 74 20 6f 73 32 41 63 63 65 73 73 28 0a 20  int os2Access(. 
6e50: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
6e60: 66 73 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f  fs,        /* No
6e70: 74 20 75 73 65 64 20 6f 6e 20 6f 73 32 20 2a 2f  t used on os2 */
6e80: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
6e90: 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20 2f 2a 20  Filename,    /* 
6ea0: 4e 61 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f 20  Name of file to 
6eb0: 63 68 65 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 66  check */.  int f
6ec0: 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
6ed0: 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66 20       /* Type of 
6ee0: 74 65 73 74 20 74 6f 20 6d 61 6b 65 20 6f 6e 20  test to make on 
6ef0: 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 69  this file */.  i
6f00: 6e 74 20 2a 70 4f 75 74 20 20 20 20 20 20 20 20  nt *pOut        
6f10: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
6f20: 65 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a  e results here *
6f30: 2f 0a 29 7b 0a 20 20 46 49 4c 45 53 54 41 54 55  /.){.  FILESTATU
6f40: 53 33 20 66 73 74 73 33 43 6f 6e 66 69 67 49 6e  S3 fsts3ConfigIn
6f50: 66 6f 3b 0a 20 20 41 50 49 52 45 54 20 72 63 20  fo;.  APIRET rc 
6f60: 3d 20 4e 4f 5f 45 52 52 4f 52 3b 0a 20 20 63 68  = NO_ERROR;.  ch
6f70: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 43 70 20  ar *zFilenameCp 
6f80: 3d 20 63 6f 6e 76 65 72 74 55 74 66 38 50 61 74  = convertUtf8Pat
6f90: 68 54 6f 43 70 28 20 7a 46 69 6c 65 6e 61 6d 65  hToCp( zFilename
6fa0: 20 29 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 20 26   );..  memset( &
6fb0: 66 73 74 73 33 43 6f 6e 66 69 67 49 6e 66 6f 2c  fsts3ConfigInfo,
6fc0: 20 30 2c 20 73 69 7a 65 6f 66 28 66 73 74 73 33   0, sizeof(fsts3
6fd0: 43 6f 6e 66 69 67 49 6e 66 6f 29 20 29 3b 0a 20  ConfigInfo) );. 
6fe0: 20 72 63 20 3d 20 44 6f 73 51 75 65 72 79 50 61   rc = DosQueryPa
6ff0: 74 68 49 6e 66 6f 28 20 28 50 53 5a 29 7a 46 69  thInfo( (PSZ)zFi
7000: 6c 65 6e 61 6d 65 43 70 2c 20 46 49 4c 5f 53 54  lenameCp, FIL_ST
7010: 41 4e 44 41 52 44 2c 0a 20 20 20 20 20 20 20 20  ANDARD,.        
7020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7030: 20 26 66 73 74 73 33 43 6f 6e 66 69 67 49 6e 66   &fsts3ConfigInf
7040: 6f 2c 20 73 69 7a 65 6f 66 28 46 49 4c 45 53 54  o, sizeof(FILEST
7050: 41 54 55 53 33 29 20 29 3b 0a 20 20 66 72 65 65  ATUS3) );.  free
7060: 28 20 7a 46 69 6c 65 6e 61 6d 65 43 70 20 29 3b  ( zFilenameCp );
7070: 0a 20 20 4f 53 54 52 41 43 45 28 28 20 22 41 43  .  OSTRACE(( "AC
7080: 43 45 53 53 20 66 73 74 73 33 43 6f 6e 66 69 67  CESS fsts3Config
7090: 49 6e 66 6f 2e 61 74 74 72 46 69 6c 65 3d 25 64  Info.attrFile=%d
70a0: 20 66 6c 61 67 73 3d 25 64 20 72 63 3d 25 64 5c   flags=%d rc=%d\
70b0: 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
70c0: 66 73 74 73 33 43 6f 6e 66 69 67 49 6e 66 6f 2e  fsts3ConfigInfo.
70d0: 61 74 74 72 46 69 6c 65 2c 20 66 6c 61 67 73 2c  attrFile, flags,
70e0: 20 72 63 20 29 29 3b 0a 20 20 73 77 69 74 63 68   rc ));.  switch
70f0: 28 20 66 6c 61 67 73 20 29 7b 0a 20 20 20 20 63  ( flags ){.    c
7100: 61 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53  ase SQLITE_ACCES
7110: 53 5f 52 45 41 44 3a 0a 20 20 20 20 63 61 73 65  S_READ:.    case
7120: 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45   SQLITE_ACCESS_E
7130: 58 49 53 54 53 3a 0a 20 20 20 20 20 20 72 63 20  XISTS:.      rc 
7140: 3d 20 28 72 63 20 3d 3d 20 4e 4f 5f 45 52 52 4f  = (rc == NO_ERRO
7150: 52 29 3b 0a 20 20 20 20 20 20 4f 53 54 52 41 43  R);.      OSTRAC
7160: 45 28 28 20 22 41 43 43 45 53 53 20 25 73 20 61  E(( "ACCESS %s a
7170: 63 63 65 73 73 20 6f 66 20 72 65 61 64 20 61 6e  ccess of read an
7180: 64 20 65 78 69 73 74 73 20 20 72 63 3d 25 64 5c  d exists  rc=%d\
7190: 6e 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 72  n", zFilename, r
71a0: 63 29 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  c));.      break
71b0: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
71c0: 45 5f 41 43 43 45 53 53 5f 52 45 41 44 57 52 49  E_ACCESS_READWRI
71d0: 54 45 3a 0a 20 20 20 20 20 20 72 63 20 3d 20 28  TE:.      rc = (
71e0: 72 63 20 3d 3d 20 4e 4f 5f 45 52 52 4f 52 29 20  rc == NO_ERROR) 
71f0: 26 26 20 28 20 28 66 73 74 73 33 43 6f 6e 66 69  && ( (fsts3Confi
7200: 67 49 6e 66 6f 2e 61 74 74 72 46 69 6c 65 20 26  gInfo.attrFile &
7210: 20 46 49 4c 45 5f 52 45 41 44 4f 4e 4c 59 29 20   FILE_READONLY) 
7220: 3d 3d 20 30 20 29 3b 0a 20 20 20 20 20 20 4f 53  == 0 );.      OS
7230: 54 52 41 43 45 28 28 20 22 41 43 43 45 53 53 20  TRACE(( "ACCESS 
7240: 25 73 20 61 63 63 65 73 73 20 6f 66 20 72 65 61  %s access of rea
7250: 64 2f 77 72 69 74 65 20 20 72 63 3d 25 64 5c 6e  d/write  rc=%d\n
7260: 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 72 63  ", zFilename, rc
7270: 20 29 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   ));.      break
7280: 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20  ;.    default:. 
7290: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 22 49       assert( !"I
72a0: 6e 76 61 6c 69 64 20 66 6c 61 67 73 20 61 72 67  nvalid flags arg
72b0: 75 6d 65 6e 74 22 20 29 3b 0a 20 20 7d 0a 20 20  ument" );.  }.  
72c0: 2a 70 4f 75 74 20 3d 20 72 63 3b 0a 20 20 72 65  *pOut = rc;.  re
72d0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
72e0: 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  }...#ifndef SQLI
72f0: 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54  TE_OMIT_LOAD_EXT
7300: 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a 2a 20 49 6e 74  ENSION./*.** Int
7310: 65 72 66 61 63 65 73 20 66 6f 72 20 6f 70 65 6e  erfaces for open
7320: 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c 69 62  ing a shared lib
7330: 72 61 72 79 2c 20 66 69 6e 64 69 6e 67 20 65 6e  rary, finding en
7340: 74 72 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 77 69  try points.** wi
7350: 74 68 69 6e 20 74 68 65 20 73 68 61 72 65 64 20  thin the shared 
7360: 6c 69 62 72 61 72 79 2c 20 61 6e 64 20 63 6c 6f  library, and clo
7370: 73 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20  sing the shared 
7380: 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 2f 2a 0a 2a  library..*/./*.*
7390: 2a 20 49 6e 74 65 72 66 61 63 65 73 20 66 6f 72  * Interfaces for
73a0: 20 6f 70 65 6e 69 6e 67 20 61 20 73 68 61 72 65   opening a share
73b0: 64 20 6c 69 62 72 61 72 79 2c 20 66 69 6e 64 69  d library, findi
73c0: 6e 67 20 65 6e 74 72 79 20 70 6f 69 6e 74 73 0a  ng entry points.
73d0: 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 73 68  ** within the sh
73e0: 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20 61 6e  ared library, an
73f0: 64 20 63 6c 6f 73 69 6e 67 20 74 68 65 20 73 68  d closing the sh
7400: 61 72 65 64 20 6c 69 62 72 61 72 79 2e 0a 2a 2f  ared library..*/
7410: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 6f 73  .static void *os
7420: 32 44 6c 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f  2DlOpen(sqlite3_
7430: 76 66 73 20 2a 70 56 66 73 2c 20 63 6f 6e 73 74  vfs *pVfs, const
7440: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
7450: 29 7b 0a 20 20 55 43 48 41 52 20 6c 6f 61 64 45  ){.  UCHAR loadE
7460: 72 72 5b 32 35 36 5d 3b 0a 20 20 48 4d 4f 44 55  rr[256];.  HMODU
7470: 4c 45 20 68 6d 6f 64 3b 0a 20 20 41 50 49 52 45  LE hmod;.  APIRE
7480: 54 20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 46  T rc;.  char *zF
7490: 69 6c 65 6e 61 6d 65 43 70 20 3d 20 63 6f 6e 76  ilenameCp = conv
74a0: 65 72 74 55 74 66 38 50 61 74 68 54 6f 43 70 28  ertUtf8PathToCp(
74b0: 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 72 63  zFilename);.  rc
74c0: 20 3d 20 44 6f 73 4c 6f 61 64 4d 6f 64 75 6c 65   = DosLoadModule
74d0: 28 28 50 53 5a 29 6c 6f 61 64 45 72 72 2c 20 73  ((PSZ)loadErr, s
74e0: 69 7a 65 6f 66 28 6c 6f 61 64 45 72 72 29 2c 20  izeof(loadErr), 
74f0: 7a 46 69 6c 65 6e 61 6d 65 43 70 2c 20 26 68 6d  zFilenameCp, &hm
7500: 6f 64 29 3b 0a 20 20 66 72 65 65 28 7a 46 69 6c  od);.  free(zFil
7510: 65 6e 61 6d 65 43 70 29 3b 0a 20 20 72 65 74 75  enameCp);.  retu
7520: 72 6e 20 72 63 20 21 3d 20 4e 4f 5f 45 52 52 4f  rn rc != NO_ERRO
7530: 52 20 3f 20 30 20 3a 20 28 76 6f 69 64 2a 29 68  R ? 0 : (void*)h
7540: 6d 6f 64 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 41 20 6e  mod;.}./*.** A n
7550: 6f 2d 6f 70 20 73 69 6e 63 65 20 74 68 65 20 65  o-op since the e
7560: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
7570: 75 72 6e 65 64 20 6f 6e 20 74 68 65 20 44 6f 73  urned on the Dos
7580: 4c 6f 61 64 4d 6f 64 75 6c 65 20 63 61 6c 6c 2e  LoadModule call.
7590: 0a 2a 2a 20 6f 73 32 44 6c 6f 70 65 6e 20 72 65  .** os2Dlopen re
75a0: 74 75 72 6e 73 20 7a 65 72 6f 20 69 66 20 44 6f  turns zero if Do
75b0: 73 4c 6f 61 64 4d 6f 64 75 6c 65 20 69 73 20 6e  sLoadModule is n
75c0: 6f 74 20 73 75 63 63 65 73 73 66 75 6c 2e 0a 2a  ot successful..*
75d0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6f 73  /.static void os
75e0: 32 44 6c 45 72 72 6f 72 28 73 71 6c 69 74 65 33  2DlError(sqlite3
75f0: 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20  _vfs *pVfs, int 
7600: 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66  nBuf, char *zBuf
7610: 4f 75 74 29 7b 0a 2f 2a 20 6e 6f 2d 6f 70 20 2a  Out){./* no-op *
7620: 2f 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  /.}.static void 
7630: 2a 6f 73 32 44 6c 53 79 6d 28 73 71 6c 69 74 65  *os2DlSym(sqlite
7640: 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 76 6f 69  3_vfs *pVfs, voi
7650: 64 20 2a 70 48 61 6e 64 6c 65 2c 20 63 6f 6e 73  d *pHandle, cons
7660: 74 20 63 68 61 72 20 2a 7a 53 79 6d 62 6f 6c 29  t char *zSymbol)
7670: 7b 0a 20 20 50 46 4e 20 70 66 6e 3b 0a 20 20 41  {.  PFN pfn;.  A
7680: 50 49 52 45 54 20 72 63 3b 0a 20 20 72 63 20 3d  PIRET rc;.  rc =
7690: 20 44 6f 73 51 75 65 72 79 50 72 6f 63 41 64 64   DosQueryProcAdd
76a0: 72 28 28 48 4d 4f 44 55 4c 45 29 70 48 61 6e 64  r((HMODULE)pHand
76b0: 6c 65 2c 20 30 4c 2c 20 7a 53 79 6d 62 6f 6c 2c  le, 0L, zSymbol,
76c0: 20 26 70 66 6e 29 3b 0a 20 20 69 66 28 20 72 63   &pfn);.  if( rc
76d0: 20 21 3d 20 4e 4f 5f 45 52 52 4f 52 20 29 7b 0a   != NO_ERROR ){.
76e0: 20 20 20 20 2f 2a 20 69 66 20 74 68 65 20 73 79      /* if the sy
76f0: 6d 62 6f 6c 20 69 74 73 65 6c 66 20 77 61 73 20  mbol itself was 
7700: 6e 6f 74 20 66 6f 75 6e 64 2c 20 73 65 61 72 63  not found, searc
7710: 68 20 61 67 61 69 6e 20 66 6f 72 20 74 68 65 20  h again for the 
7720: 73 61 6d 65 0a 20 20 20 20 20 2a 20 73 79 6d 62  same.     * symb
7730: 6f 6c 20 77 69 74 68 20 61 6e 20 65 78 74 72 61  ol with an extra
7740: 20 75 6e 64 65 72 73 63 6f 72 65 2c 20 74 68 61   underscore, tha
7750: 74 20 6d 69 67 68 74 20 62 65 20 6e 65 65 64 65  t might be neede
7760: 64 20 64 65 70 65 6e 64 69 6e 67 0a 20 20 20 20  d depending.    
7770: 20 2a 20 6f 6e 20 74 68 65 20 63 61 6c 6c 69 6e   * on the callin
7780: 67 20 63 6f 6e 76 65 6e 74 69 6f 6e 20 2a 2f 0a  g convention */.
7790: 20 20 20 20 63 68 61 72 20 5f 7a 53 79 6d 62 6f      char _zSymbo
77a0: 6c 5b 32 35 36 5d 20 3d 20 22 5f 22 3b 0a 20 20  l[256] = "_";.  
77b0: 20 20 73 74 72 6e 63 61 74 28 5f 7a 53 79 6d 62    strncat(_zSymb
77c0: 6f 6c 2c 20 7a 53 79 6d 62 6f 6c 2c 20 32 35 35  ol, zSymbol, 255
77d0: 29 3b 0a 20 20 20 20 72 63 20 3d 20 44 6f 73 51  );.    rc = DosQ
77e0: 75 65 72 79 50 72 6f 63 41 64 64 72 28 28 48 4d  ueryProcAddr((HM
77f0: 4f 44 55 4c 45 29 70 48 61 6e 64 6c 65 2c 20 30  ODULE)pHandle, 0
7800: 4c 2c 20 5f 7a 53 79 6d 62 6f 6c 2c 20 26 70 66  L, _zSymbol, &pf
7810: 6e 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  n);.  }.  return
7820: 20 72 63 20 21 3d 20 4e 4f 5f 45 52 52 4f 52 20   rc != NO_ERROR 
7830: 3f 20 30 20 3a 20 28 76 6f 69 64 2a 29 70 66 6e  ? 0 : (void*)pfn
7840: 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
7850: 6f 73 32 44 6c 43 6c 6f 73 65 28 73 71 6c 69 74  os2DlClose(sqlit
7860: 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 76 6f  e3_vfs *pVfs, vo
7870: 69 64 20 2a 70 48 61 6e 64 6c 65 29 7b 0a 20 20  id *pHandle){.  
7880: 44 6f 73 46 72 65 65 4d 6f 64 75 6c 65 28 28 48  DosFreeModule((H
7890: 4d 4f 44 55 4c 45 29 70 48 61 6e 64 6c 65 29 3b  MODULE)pHandle);
78a0: 0a 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 53  .}.#else /* if S
78b0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f  QLITE_OMIT_LOAD_
78c0: 45 58 54 45 4e 53 49 4f 4e 20 69 73 20 64 65 66  EXTENSION is def
78d0: 69 6e 65 64 3a 20 2a 2f 0a 20 20 23 64 65 66 69  ined: */.  #defi
78e0: 6e 65 20 6f 73 32 44 6c 4f 70 65 6e 20 30 0a 20  ne os2DlOpen 0. 
78f0: 20 23 64 65 66 69 6e 65 20 6f 73 32 44 6c 45 72   #define os2DlEr
7900: 72 6f 72 20 30 0a 20 20 23 64 65 66 69 6e 65 20  ror 0.  #define 
7910: 6f 73 32 44 6c 53 79 6d 20 30 0a 20 20 23 64 65  os2DlSym 0.  #de
7920: 66 69 6e 65 20 6f 73 32 44 6c 43 6c 6f 73 65 20  fine os2DlClose 
7930: 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  0.#endif.../*.**
7940: 20 57 72 69 74 65 20 75 70 20 74 6f 20 6e 42 75   Write up to nBu
7950: 66 20 62 79 74 65 73 20 6f 66 20 72 61 6e 64 6f  f bytes of rando
7960: 6d 6e 65 73 73 20 69 6e 74 6f 20 7a 42 75 66 2e  mness into zBuf.
7970: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f  .*/.static int o
7980: 73 32 52 61 6e 64 6f 6d 6e 65 73 73 28 73 71 6c  s2Randomness(sql
7990: 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
79a0: 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a  int nBuf, char *
79b0: 7a 42 75 66 20 29 7b 0a 20 20 69 6e 74 20 6e 20  zBuf ){.  int n 
79c0: 3d 20 30 3b 0a 23 69 66 20 64 65 66 69 6e 65 64  = 0;.#if defined
79d0: 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 20 20  (SQLITE_TEST).  
79e0: 6e 20 3d 20 6e 42 75 66 3b 0a 20 20 6d 65 6d 73  n = nBuf;.  mems
79f0: 65 74 28 7a 42 75 66 2c 20 30 2c 20 6e 42 75 66  et(zBuf, 0, nBuf
7a00: 29 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 73  );.#else.  int s
7a10: 69 7a 65 6f 66 55 4c 6f 6e 67 20 3d 20 73 69 7a  izeofULong = siz
7a20: 65 6f 66 28 55 4c 4f 4e 47 29 3b 0a 20 20 69 66  eof(ULONG);.  if
7a30: 28 20 28 69 6e 74 29 73 69 7a 65 6f 66 28 44 41  ( (int)sizeof(DA
7a40: 54 45 54 49 4d 45 29 20 3c 3d 20 6e 42 75 66 20  TETIME) <= nBuf 
7a50: 2d 20 6e 20 29 7b 0a 20 20 20 20 44 41 54 45 54  - n ){.    DATET
7a60: 49 4d 45 20 78 3b 0a 20 20 20 20 44 6f 73 47 65  IME x;.    DosGe
7a70: 74 44 61 74 65 54 69 6d 65 28 26 78 29 3b 0a 20  tDateTime(&x);. 
7a80: 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b     memcpy(&zBuf[
7a90: 6e 5d 2c 20 26 78 2c 20 73 69 7a 65 6f 66 28 78  n], &x, sizeof(x
7aa0: 29 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 73 69 7a  ));.    n += siz
7ab0: 65 6f 66 28 78 29 3b 0a 20 20 7d 0a 0a 20 20 69  eof(x);.  }..  i
7ac0: 66 28 20 73 69 7a 65 6f 66 55 4c 6f 6e 67 20 3c  f( sizeofULong <
7ad0: 3d 20 6e 42 75 66 20 2d 20 6e 20 29 7b 0a 20 20  = nBuf - n ){.  
7ae0: 20 20 50 50 49 42 20 70 70 69 62 3b 0a 20 20 20    PPIB ppib;.   
7af0: 20 44 6f 73 47 65 74 49 6e 66 6f 42 6c 6f 63 6b   DosGetInfoBlock
7b00: 73 28 4e 55 4c 4c 2c 20 26 70 70 69 62 29 3b 0a  s(NULL, &ppib);.
7b10: 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66      memcpy(&zBuf
7b20: 5b 6e 5d 2c 20 26 70 70 69 62 2d 3e 70 69 62 5f  [n], &ppib->pib_
7b30: 75 6c 70 69 64 2c 20 73 69 7a 65 6f 66 55 4c 6f  ulpid, sizeofULo
7b40: 6e 67 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 73 69  ng);.    n += si
7b50: 7a 65 6f 66 55 4c 6f 6e 67 3b 0a 20 20 7d 0a 0a  zeofULong;.  }..
7b60: 20 20 69 66 28 20 73 69 7a 65 6f 66 55 4c 6f 6e    if( sizeofULon
7b70: 67 20 3c 3d 20 6e 42 75 66 20 2d 20 6e 20 29 7b  g <= nBuf - n ){
7b80: 0a 20 20 20 20 50 54 49 42 20 70 74 69 62 3b 0a  .    PTIB ptib;.
7b90: 20 20 20 20 44 6f 73 47 65 74 49 6e 66 6f 42 6c      DosGetInfoBl
7ba0: 6f 63 6b 73 28 26 70 74 69 62 2c 20 4e 55 4c 4c  ocks(&ptib, NULL
7bb0: 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 7a  );.    memcpy(&z
7bc0: 42 75 66 5b 6e 5d 2c 20 26 70 74 69 62 2d 3e 74  Buf[n], &ptib->t
7bd0: 69 62 5f 70 74 69 62 32 2d 3e 74 69 62 32 5f 75  ib_ptib2->tib2_u
7be0: 6c 74 69 64 2c 20 73 69 7a 65 6f 66 55 4c 6f 6e  ltid, sizeofULon
7bf0: 67 29 3b 0a 20 20 20 20 6e 20 2b 3d 20 73 69 7a  g);.    n += siz
7c00: 65 6f 66 55 4c 6f 6e 67 3b 0a 20 20 7d 0a 0a 20  eofULong;.  }.. 
7c10: 20 2f 2a 20 69 66 20 77 65 20 73 74 69 6c 6c 20   /* if we still 
7c20: 68 61 76 65 6e 27 74 20 66 69 6c 6c 65 64 20 74  haven't filled t
7c30: 68 65 20 62 75 66 66 65 72 20 79 65 74 20 74 68  he buffer yet th
7c40: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 69 6c 6c  e following will
7c50: 20 2a 2f 0a 20 20 2f 2a 20 67 72 61 62 20 65 76   */.  /* grab ev
7c60: 65 72 79 74 68 69 6e 67 20 6f 6e 63 65 20 69 6e  erything once in
7c70: 73 74 65 61 64 20 6f 66 20 6d 61 6b 69 6e 67 20  stead of making 
7c80: 73 65 76 65 72 61 6c 20 63 61 6c 6c 73 20 66 6f  several calls fo
7c90: 72 20 61 20 73 69 6e 67 6c 65 20 69 74 65 6d 20  r a single item 
7ca0: 2a 2f 0a 20 20 69 66 28 20 73 69 7a 65 6f 66 55  */.  if( sizeofU
7cb0: 4c 6f 6e 67 20 3c 3d 20 6e 42 75 66 20 2d 20 6e  Long <= nBuf - n
7cc0: 20 29 7b 0a 20 20 20 20 55 4c 4f 4e 47 20 75 6c   ){.    ULONG ul
7cd0: 53 79 73 49 6e 66 6f 5b 51 53 56 5f 4d 41 58 5d  SysInfo[QSV_MAX]
7ce0: 3b 0a 20 20 20 20 44 6f 73 51 75 65 72 79 53 79  ;.    DosQuerySy
7cf0: 73 49 6e 66 6f 28 31 4c 2c 20 51 53 56 5f 4d 41  sInfo(1L, QSV_MA
7d00: 58 2c 20 75 6c 53 79 73 49 6e 66 6f 2c 20 73 69  X, ulSysInfo, si
7d10: 7a 65 6f 66 55 4c 6f 6e 67 20 2a 20 51 53 56 5f  zeofULong * QSV_
7d20: 4d 41 58 29 3b 0a 0a 20 20 20 20 6d 65 6d 63 70  MAX);..    memcp
7d30: 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 75 6c 53  y(&zBuf[n], &ulS
7d40: 79 73 49 6e 66 6f 5b 51 53 56 5f 4d 53 5f 43 4f  ysInfo[QSV_MS_CO
7d50: 55 4e 54 20 2d 20 31 5d 2c 20 73 69 7a 65 6f 66  UNT - 1], sizeof
7d60: 55 4c 6f 6e 67 29 3b 0a 20 20 20 20 6e 20 2b 3d  ULong);.    n +=
7d70: 20 73 69 7a 65 6f 66 55 4c 6f 6e 67 3b 0a 0a 20   sizeofULong;.. 
7d80: 20 20 20 69 66 28 20 73 69 7a 65 6f 66 55 4c 6f     if( sizeofULo
7d90: 6e 67 20 3c 3d 20 6e 42 75 66 20 2d 20 6e 20 29  ng <= nBuf - n )
7da0: 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26  {.      memcpy(&
7db0: 7a 42 75 66 5b 6e 5d 2c 20 26 75 6c 53 79 73 49  zBuf[n], &ulSysI
7dc0: 6e 66 6f 5b 51 53 56 5f 54 49 4d 45 52 5f 49 4e  nfo[QSV_TIMER_IN
7dd0: 54 45 52 56 41 4c 20 2d 20 31 5d 2c 20 73 69 7a  TERVAL - 1], siz
7de0: 65 6f 66 55 4c 6f 6e 67 29 3b 0a 20 20 20 20 20  eofULong);.     
7df0: 20 6e 20 2b 3d 20 73 69 7a 65 6f 66 55 4c 6f 6e   n += sizeofULon
7e00: 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  g;.    }.    if(
7e10: 20 73 69 7a 65 6f 66 55 4c 6f 6e 67 20 3c 3d 20   sizeofULong <= 
7e20: 6e 42 75 66 20 2d 20 6e 20 29 7b 0a 20 20 20 20  nBuf - n ){.    
7e30: 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 6e    memcpy(&zBuf[n
7e40: 5d 2c 20 26 75 6c 53 79 73 49 6e 66 6f 5b 51 53  ], &ulSysInfo[QS
7e50: 56 5f 54 49 4d 45 5f 4c 4f 57 20 2d 20 31 5d 2c  V_TIME_LOW - 1],
7e60: 20 73 69 7a 65 6f 66 55 4c 6f 6e 67 29 3b 0a 20   sizeofULong);. 
7e70: 20 20 20 20 20 6e 20 2b 3d 20 73 69 7a 65 6f 66       n += sizeof
7e80: 55 4c 6f 6e 67 3b 0a 20 20 20 20 7d 0a 20 20 20  ULong;.    }.   
7e90: 20 69 66 28 20 73 69 7a 65 6f 66 55 4c 6f 6e 67   if( sizeofULong
7ea0: 20 3c 3d 20 6e 42 75 66 20 2d 20 6e 20 29 7b 0a   <= nBuf - n ){.
7eb0: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 42        memcpy(&zB
7ec0: 75 66 5b 6e 5d 2c 20 26 75 6c 53 79 73 49 6e 66  uf[n], &ulSysInf
7ed0: 6f 5b 51 53 56 5f 54 49 4d 45 5f 48 49 47 48 20  o[QSV_TIME_HIGH 
7ee0: 2d 20 31 5d 2c 20 73 69 7a 65 6f 66 55 4c 6f 6e  - 1], sizeofULon
7ef0: 67 29 3b 0a 20 20 20 20 20 20 6e 20 2b 3d 20 73  g);.      n += s
7f00: 69 7a 65 6f 66 55 4c 6f 6e 67 3b 0a 20 20 20 20  izeofULong;.    
7f10: 7d 0a 20 20 20 20 69 66 28 20 73 69 7a 65 6f 66  }.    if( sizeof
7f20: 55 4c 6f 6e 67 20 3c 3d 20 6e 42 75 66 20 2d 20  ULong <= nBuf - 
7f30: 6e 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70  n ){.      memcp
7f40: 79 28 26 7a 42 75 66 5b 6e 5d 2c 20 26 75 6c 53  y(&zBuf[n], &ulS
7f50: 79 73 49 6e 66 6f 5b 51 53 56 5f 54 4f 54 41 56  ysInfo[QSV_TOTAV
7f60: 41 49 4c 4d 45 4d 20 2d 20 31 5d 2c 20 73 69 7a  AILMEM - 1], siz
7f70: 65 6f 66 55 4c 6f 6e 67 29 3b 0a 20 20 20 20 20  eofULong);.     
7f80: 20 6e 20 2b 3d 20 73 69 7a 65 6f 66 55 4c 6f 6e   n += sizeofULon
7f90: 67 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  g;.    }.  }.#en
7fa0: 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 6e 3b  dif..  return n;
7fb0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20  .}../*.** Sleep 
7fc0: 66 6f 72 20 61 20 6c 69 74 74 6c 65 20 77 68 69  for a little whi
7fd0: 6c 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  le.  Return the 
7fe0: 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65 20 73  amount of time s
7ff0: 6c 65 70 74 2e 0a 2a 2a 20 54 68 65 20 61 72 67  lept..** The arg
8000: 75 6d 65 6e 74 20 69 73 20 74 68 65 20 6e 75 6d  ument is the num
8010: 62 65 72 20 6f 66 20 6d 69 63 72 6f 73 65 63 6f  ber of microseco
8020: 6e 64 73 20 77 65 20 77 61 6e 74 20 74 6f 20 73  nds we want to s
8030: 6c 65 65 70 2e 0a 2a 2a 20 54 68 65 20 72 65 74  leep..** The ret
8040: 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65  urn value is the
8050: 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 63 72 6f   number of micro
8060: 73 65 63 6f 6e 64 73 20 6f 66 20 73 6c 65 65 70  seconds of sleep
8070: 20 61 63 74 75 61 6c 6c 79 0a 2a 2a 20 72 65 71   actually.** req
8080: 75 65 73 74 65 64 20 66 72 6f 6d 20 74 68 65 20  uested from the 
8090: 75 6e 64 65 72 6c 79 69 6e 67 20 6f 70 65 72 61  underlying opera
80a0: 74 69 6e 67 20 73 79 73 74 65 6d 2c 20 61 20 6e  ting system, a n
80b0: 75 6d 62 65 72 20 77 68 69 63 68 0a 2a 2a 20 6d  umber which.** m
80c0: 69 67 68 74 20 62 65 20 67 72 65 61 74 65 72 20  ight be greater 
80d0: 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
80e0: 20 74 68 65 20 61 72 67 75 6d 65 6e 74 2c 20 62   the argument, b
80f0: 75 74 20 6e 6f 74 20 6c 65 73 73 0a 2a 2a 20 74  ut not less.** t
8100: 68 61 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74  han the argument
8110: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
8120: 6f 73 32 53 6c 65 65 70 28 20 73 71 6c 69 74 65  os2Sleep( sqlite
8130: 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74  3_vfs *pVfs, int
8140: 20 6d 69 63 72 6f 73 65 63 20 29 7b 0a 20 20 44   microsec ){.  D
8150: 6f 73 53 6c 65 65 70 28 20 28 6d 69 63 72 6f 73  osSleep( (micros
8160: 65 63 2f 31 30 30 30 29 20 29 3b 0a 20 20 72 65  ec/1000) );.  re
8170: 74 75 72 6e 20 6d 69 63 72 6f 73 65 63 3b 0a 7d  turn microsec;.}
8180: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
8190: 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65 2c 20  owing variable, 
81a0: 69 66 20 73 65 74 20 74 6f 20 61 20 6e 6f 6e 2d  if set to a non-
81b0: 7a 65 72 6f 20 76 61 6c 75 65 2c 20 62 65 63 6f  zero value, beco
81c0: 6d 65 73 20 74 68 65 20 72 65 73 75 6c 74 0a 2a  mes the result.*
81d0: 2a 20 72 65 74 75 72 6e 65 64 20 66 72 6f 6d 20  * returned from 
81e0: 73 71 6c 69 74 65 33 4f 73 43 75 72 72 65 6e 74  sqlite3OsCurrent
81f0: 54 69 6d 65 28 29 2e 20 20 54 68 69 73 20 69 73  Time().  This is
8200: 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e   used for testin
8210: 67 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  g..*/.#ifdef SQL
8220: 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c  ITE_TEST.int sql
8230: 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d  ite3_current_tim
8240: 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f  e = 0;.#endif../
8250: 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 75  *.** Find the cu
8260: 72 72 65 6e 74 20 74 69 6d 65 20 28 69 6e 20 55  rrent time (in U
8270: 6e 69 76 65 72 73 61 6c 20 43 6f 6f 72 64 69 6e  niversal Coordin
8280: 61 74 65 64 20 54 69 6d 65 29 2e 20 20 57 72 69  ated Time).  Wri
8290: 74 65 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e  te the.** curren
82a0: 74 20 74 69 6d 65 20 61 6e 64 20 64 61 74 65 20  t time and date 
82b0: 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20  as a Julian Day 
82c0: 6e 75 6d 62 65 72 20 69 6e 74 6f 20 2a 70 72 4e  number into *prN
82d0: 6f 77 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e  ow and.** return
82e0: 20 30 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66   0.  Return 1 if
82f0: 20 74 68 65 20 74 69 6d 65 20 61 6e 64 20 64 61   the time and da
8300: 74 65 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75  te cannot be fou
8310: 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 6f 73 32 43 75  nd..*/.int os2Cu
8320: 72 72 65 6e 74 54 69 6d 65 28 20 73 71 6c 69 74  rrentTime( sqlit
8330: 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 64 6f  e3_vfs *pVfs, do
8340: 75 62 6c 65 20 2a 70 72 4e 6f 77 20 29 7b 0a 20  uble *prNow ){. 
8350: 20 64 6f 75 62 6c 65 20 6e 6f 77 3b 0a 20 20 53   double now;.  S
8360: 48 4f 52 54 20 6d 69 6e 75 74 65 3b 20 2f 2a 20  HORT minute; /* 
8370: 6e 65 65 64 73 20 74 6f 20 62 65 20 61 62 6c 65  needs to be able
8380: 20 74 6f 20 63 6f 70 65 20 77 69 74 68 20 6e 65   to cope with ne
8390: 67 61 74 69 76 65 20 74 69 6d 65 7a 6f 6e 65 20  gative timezone 
83a0: 6f 66 66 73 65 74 20 2a 2f 0a 20 20 55 53 48 4f  offset */.  USHO
83b0: 52 54 20 73 65 63 6f 6e 64 2c 20 68 6f 75 72 2c  RT second, hour,
83c0: 0a 20 20 20 20 20 20 20 20 20 64 61 79 2c 20 6d  .         day, m
83d0: 6f 6e 74 68 2c 20 79 65 61 72 3b 0a 20 20 44 41  onth, year;.  DA
83e0: 54 45 54 49 4d 45 20 64 74 3b 0a 20 20 44 6f 73  TETIME dt;.  Dos
83f0: 47 65 74 44 61 74 65 54 69 6d 65 28 20 26 64 74  GetDateTime( &dt
8400: 20 29 3b 0a 20 20 73 65 63 6f 6e 64 20 3d 20 28   );.  second = (
8410: 55 53 48 4f 52 54 29 64 74 2e 73 65 63 6f 6e 64  USHORT)dt.second
8420: 73 3b 0a 20 20 6d 69 6e 75 74 65 20 3d 20 28 53  s;.  minute = (S
8430: 48 4f 52 54 29 64 74 2e 6d 69 6e 75 74 65 73 20  HORT)dt.minutes 
8440: 2b 20 64 74 2e 74 69 6d 65 7a 6f 6e 65 3b 0a 20  + dt.timezone;. 
8450: 20 68 6f 75 72 20 3d 20 28 55 53 48 4f 52 54 29   hour = (USHORT)
8460: 64 74 2e 68 6f 75 72 73 3b 0a 20 20 64 61 79 20  dt.hours;.  day 
8470: 3d 20 28 55 53 48 4f 52 54 29 64 74 2e 64 61 79  = (USHORT)dt.day
8480: 3b 0a 20 20 6d 6f 6e 74 68 20 3d 20 28 55 53 48  ;.  month = (USH
8490: 4f 52 54 29 64 74 2e 6d 6f 6e 74 68 3b 0a 20 20  ORT)dt.month;.  
84a0: 79 65 61 72 20 3d 20 28 55 53 48 4f 52 54 29 64  year = (USHORT)d
84b0: 74 2e 79 65 61 72 3b 0a 0a 20 20 2f 2a 20 43 61  t.year;..  /* Ca
84c0: 6c 63 75 6c 61 74 69 6f 6e 73 20 66 72 6f 6d 20  lculations from 
84d0: 68 74 74 70 3a 2f 2f 77 77 77 2e 61 73 74 72 6f  http://www.astro
84e0: 2e 6b 65 65 6c 65 2e 61 63 2e 75 6b 2f 7e 72 6e  .keele.ac.uk/~rn
84f0: 6f 2f 41 73 74 72 6f 6e 6f 6d 79 2f 68 6a 64 2e  o/Astronomy/hjd.
8500: 68 74 6d 6c 0a 20 20 20 20 20 68 74 74 70 3a 2f  html.     http:/
8510: 2f 77 77 77 2e 61 73 74 72 6f 2e 6b 65 65 6c 65  /www.astro.keele
8520: 2e 61 63 2e 75 6b 2f 7e 72 6e 6f 2f 41 73 74 72  .ac.uk/~rno/Astr
8530: 6f 6e 6f 6d 79 2f 68 6a 64 2d 30 2e 31 2e 63 20  onomy/hjd-0.1.c 
8540: 2a 2f 0a 20 20 2f 2a 20 43 61 6c 63 75 6c 61 74  */.  /* Calculat
8550: 65 20 74 68 65 20 4a 75 6c 69 61 6e 20 64 61 79  e the Julian day
8560: 73 20 2a 2f 0a 20 20 6e 6f 77 20 3d 20 64 61 79  s */.  now = day
8570: 20 2d 20 33 32 30 37 36 20 2b 0a 20 20 20 20 31   - 32076 +.    1
8580: 34 36 31 2a 28 79 65 61 72 20 2b 20 34 38 30 30  461*(year + 4800
8590: 20 2b 20 28 6d 6f 6e 74 68 20 2d 20 31 34 29 2f   + (month - 14)/
85a0: 31 32 29 2f 34 20 2b 0a 20 20 20 20 33 36 37 2a  12)/4 +.    367*
85b0: 28 6d 6f 6e 74 68 20 2d 20 32 20 2d 20 28 6d 6f  (month - 2 - (mo
85c0: 6e 74 68 20 2d 20 31 34 29 2f 31 32 2a 31 32 29  nth - 14)/12*12)
85d0: 2f 31 32 20 2d 0a 20 20 20 20 33 2a 28 28 79 65  /12 -.    3*((ye
85e0: 61 72 20 2b 20 34 39 30 30 20 2b 20 28 6d 6f 6e  ar + 4900 + (mon
85f0: 74 68 20 2d 20 31 34 29 2f 31 32 29 2f 31 30 30  th - 14)/12)/100
8600: 29 2f 34 3b 0a 0a 20 20 2f 2a 20 41 64 64 20 74  )/4;..  /* Add t
8610: 68 65 20 66 72 61 63 74 69 6f 6e 61 6c 20 68 6f  he fractional ho
8620: 75 72 73 2c 20 6d 69 6e 73 20 61 6e 64 20 73 65  urs, mins and se
8630: 63 6f 6e 64 73 20 2a 2f 0a 20 20 6e 6f 77 20 2b  conds */.  now +
8640: 3d 20 28 68 6f 75 72 20 2b 20 31 32 2e 30 29 2f  = (hour + 12.0)/
8650: 32 34 2e 30 3b 0a 20 20 6e 6f 77 20 2b 3d 20 6d  24.0;.  now += m
8660: 69 6e 75 74 65 2f 31 34 34 30 2e 30 3b 0a 20 20  inute/1440.0;.  
8670: 6e 6f 77 20 2b 3d 20 73 65 63 6f 6e 64 2f 38 36  now += second/86
8680: 34 30 30 2e 30 3b 0a 20 20 2a 70 72 4e 6f 77 20  400.0;.  *prNow 
8690: 3d 20 6e 6f 77 3b 0a 23 69 66 64 65 66 20 53 51  = now;.#ifdef SQ
86a0: 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28 20  LITE_TEST.  if( 
86b0: 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f  sqlite3_current_
86c0: 74 69 6d 65 20 29 7b 0a 20 20 20 20 2a 70 72 4e  time ){.    *prN
86d0: 6f 77 20 3d 20 73 71 6c 69 74 65 33 5f 63 75 72  ow = sqlite3_cur
86e0: 72 65 6e 74 5f 74 69 6d 65 2f 38 36 34 30 30 2e  rent_time/86400.
86f0: 30 20 2b 20 32 34 34 30 35 38 37 2e 35 3b 0a 20  0 + 2440587.5;. 
8700: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75   }.#endif.  retu
8710: 72 6e 20 30 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  rn 0;.}..static 
8720: 69 6e 74 20 6f 73 32 47 65 74 4c 61 73 74 45 72  int os2GetLastEr
8730: 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ror(sqlite3_vfs 
8740: 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 75 66 2c  *pVfs, int nBuf,
8750: 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20   char *zBuf){.  
8760: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
8770: 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e  ** Initialize an
8780: 64 20 64 65 69 6e 69 74 69 61 6c 69 7a 65 20 74  d deinitialize t
8790: 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  he operating sys
87a0: 74 65 6d 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a  tem interface..*
87b0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73  /.int sqlite3_os
87c0: 5f 69 6e 69 74 28 76 6f 69 64 29 7b 0a 20 20 73  _init(void){.  s
87d0: 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 76 66  tatic sqlite3_vf
87e0: 73 20 6f 73 32 56 66 73 20 3d 20 7b 0a 20 20 20  s os2Vfs = {.   
87f0: 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   1,             
8800: 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20      /* iVersion 
8810: 2a 2f 0a 20 20 20 20 73 69 7a 65 6f 66 28 6f 73  */.    sizeof(os
8820: 32 46 69 6c 65 29 2c 20 20 20 2f 2a 20 73 7a 4f  2File),   /* szO
8830: 73 46 69 6c 65 20 2a 2f 0a 20 20 20 20 43 43 48  sFile */.    CCH
8840: 4d 41 58 50 41 54 48 2c 20 20 20 20 20 20 20 20  MAXPATH,        
8850: 2f 2a 20 6d 78 50 61 74 68 6e 61 6d 65 20 2a 2f  /* mxPathname */
8860: 0a 20 20 20 20 30 2c 20 20 20 20 20 20 20 20 20  .    0,         
8870: 20 20 20 20 20 20 20 20 2f 2a 20 70 4e 65 78 74          /* pNext
8880: 20 2a 2f 0a 20 20 20 20 22 6f 73 32 22 2c 20 20   */.    "os2",  
8890: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 4e             /* zN
88a0: 61 6d 65 20 2a 2f 0a 20 20 20 20 30 2c 20 20 20  ame */.    0,   
88b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
88c0: 20 70 41 70 70 44 61 74 61 20 2a 2f 0a 0a 20 20   pAppData */..  
88d0: 20 20 6f 73 32 4f 70 65 6e 2c 20 20 20 20 20 20    os2Open,      
88e0: 20 20 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2a 2f       /* xOpen */
88f0: 0a 20 20 20 20 6f 73 32 44 65 6c 65 74 65 2c 20  .    os2Delete, 
8900: 20 20 20 20 20 20 20 20 2f 2a 20 78 44 65 6c 65          /* xDele
8910: 74 65 20 2a 2f 0a 20 20 20 20 6f 73 32 41 63 63  te */.    os2Acc
8920: 65 73 73 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ess,         /* 
8930: 78 41 63 63 65 73 73 20 2a 2f 0a 20 20 20 20 6f  xAccess */.    o
8940: 73 32 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20  s2FullPathname, 
8950: 20 20 2f 2a 20 78 46 75 6c 6c 50 61 74 68 6e 61    /* xFullPathna
8960: 6d 65 20 2a 2f 0a 20 20 20 20 6f 73 32 44 6c 4f  me */.    os2DlO
8970: 70 65 6e 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  pen,         /* 
8980: 78 44 6c 4f 70 65 6e 20 2a 2f 0a 20 20 20 20 6f  xDlOpen */.    o
8990: 73 32 44 6c 45 72 72 6f 72 2c 20 20 20 20 20 20  s2DlError,      
89a0: 20 20 2f 2a 20 78 44 6c 45 72 72 6f 72 20 2a 2f    /* xDlError */
89b0: 0a 20 20 20 20 6f 73 32 44 6c 53 79 6d 2c 20 20  .    os2DlSym,  
89c0: 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 53 79          /* xDlSy
89d0: 6d 20 2a 2f 0a 20 20 20 20 6f 73 32 44 6c 43 6c  m */.    os2DlCl
89e0: 6f 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 78  ose,        /* x
89f0: 44 6c 43 6c 6f 73 65 20 2a 2f 0a 20 20 20 20 6f  DlClose */.    o
8a00: 73 32 52 61 6e 64 6f 6d 6e 65 73 73 2c 20 20 20  s2Randomness,   
8a10: 20 20 2f 2a 20 78 52 61 6e 64 6f 6d 6e 65 73 73    /* xRandomness
8a20: 20 2a 2f 0a 20 20 20 20 6f 73 32 53 6c 65 65 70   */.    os2Sleep
8a30: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53  ,          /* xS
8a40: 6c 65 65 70 20 2a 2f 0a 20 20 20 20 6f 73 32 43  leep */.    os2C
8a50: 75 72 72 65 6e 74 54 69 6d 65 2c 20 20 20 20 2f  urrentTime,    /
8a60: 2a 20 78 43 75 72 72 65 6e 74 54 69 6d 65 20 2a  * xCurrentTime *
8a70: 2f 0a 20 20 20 20 6f 73 32 47 65 74 4c 61 73 74  /.    os2GetLast
8a80: 45 72 72 6f 72 2c 20 20 20 2f 2a 20 78 47 65 74  Error,   /* xGet
8a90: 4c 61 73 74 45 72 72 6f 72 20 2a 2f 0a 20 20 7d  LastError */.  }
8aa0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  ;.  sqlite3_vfs_
8ab0: 72 65 67 69 73 74 65 72 28 26 6f 73 32 56 66 73  register(&os2Vfs
8ac0: 2c 20 31 29 3b 0a 20 20 69 6e 69 74 55 63 6f 6e  , 1);.  initUcon
8ad0: 76 4f 62 6a 65 63 74 73 28 29 3b 0a 20 20 72 65  vObjects();.  re
8ae0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
8af0: 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 73  }.int sqlite3_os
8b00: 5f 65 6e 64 28 76 6f 69 64 29 7b 0a 20 20 66 72  _end(void){.  fr
8b10: 65 65 55 63 6f 6e 76 4f 62 6a 65 63 74 73 28 29  eeUconvObjects()
8b20: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
8b30: 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20  E_OK;.}..#endif 
8b40: 2f 2a 20 53 51 4c 49 54 45 5f 4f 53 5f 4f 53 32  /* SQLITE_OS_OS2
8b50: 20 2a 2f 0a                                       */.