/ Hex Artifact Content
Login

Artifact 59f05de8c5777c34876607114a2fbe55ae578235:


0000: 2f 2a 0a 2a 2a 20 32 30 30 35 20 4e 6f 76 65 6d  /*.** 2005 Novem
0010: 62 65 72 20 32 39 0a 2a 2a 0a 2a 2a 20 54 68 65  ber 29.**.** The
0020: 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d   author disclaim
0030: 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74  s copyright to t
0040: 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e  his source code.
0050: 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a    In place of.**
0060: 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c   a legal notice,
0070: 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73   here is a bless
0080: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61  ing:.**.**    Ma
0090: 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e  y you do good an
00a0: 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20  d not evil..**  
00b0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66    May you find f
00c0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79  orgiveness for y
00d0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67  ourself and forg
00e0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20  ive others..**  
00f0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
0100: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
0110: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0120: 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a  ou give..**.****
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  **********.**.**
0180: 20 54 68 69 73 20 66 69 6c 65 20 63 6f 6e 74 61   This file conta
0190: 69 6e 73 20 4f 53 20 69 6e 74 65 72 66 61 63 65  ins OS interface
01a0: 20 63 6f 64 65 20 74 68 61 74 20 69 73 20 63 6f   code that is co
01b0: 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 0a 2a 2a 20 61  mmon to all.** a
01c0: 72 63 68 69 74 65 63 74 75 72 65 73 2e 0a 2a 2f  rchitectures..*/
01d0: 0a 23 64 65 66 69 6e 65 20 5f 53 51 4c 49 54 45  .#define _SQLITE
01e0: 5f 4f 53 5f 43 5f 20 31 0a 23 69 6e 63 6c 75 64  _OS_C_ 1.#includ
01f0: 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a  e "sqliteInt.h".
0200: 23 69 6e 63 6c 75 64 65 20 22 6f 73 2e 68 22 0a  #include "os.h".
0210: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
0220: 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 61 72  wing routines ar
0230: 65 20 63 6f 6e 76 65 6e 69 65 6e 63 65 20 77 72  e convenience wr
0240: 61 70 70 65 72 73 20 61 72 6f 75 6e 64 20 6d 65  appers around me
0250: 74 68 6f 64 73 0a 2a 2a 20 6f 66 20 74 68 65 20  thods.** of the 
0260: 4f 73 46 69 6c 65 20 6f 62 6a 65 63 74 2e 20 20  OsFile object.  
0270: 54 68 69 73 20 69 73 20 6d 6f 73 74 6c 79 20 6a  This is mostly j
0280: 75 73 74 20 73 79 6e 74 61 63 74 69 63 20 73 75  ust syntactic su
0290: 67 61 72 2e 20 20 41 6c 6c 0a 2a 2a 20 6f 66 20  gar.  All.** of 
02a0: 74 68 69 73 20 77 6f 75 6c 64 20 62 65 20 63 6f  this would be co
02b0: 6d 70 6c 65 74 65 6c 79 20 61 75 74 6f 6d 61 74  mpletely automat
02c0: 69 63 20 69 66 20 53 51 4c 69 74 65 20 77 65 72  ic if SQLite wer
02d0: 65 20 63 6f 64 65 64 20 75 73 69 6e 67 0a 2a 2a  e coded using.**
02e0: 20 43 2b 2b 20 69 6e 73 74 65 61 64 20 6f 66 20   C++ instead of 
02f0: 70 6c 61 69 6e 20 6f 6c 64 20 43 2e 0a 2a 2f 0a  plain old C..*/.
0300: 69 6e 74 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f  int sqlite3OsClo
0310: 73 65 28 4f 73 46 69 6c 65 20 2a 2a 70 49 64 29  se(OsFile **pId)
0320: 7b 0a 20 20 4f 73 46 69 6c 65 20 2a 69 64 3b 0a  {.  OsFile *id;.
0330: 20 20 69 66 28 20 70 49 64 21 3d 30 20 26 26 20    if( pId!=0 && 
0340: 28 69 64 20 3d 20 2a 70 49 64 29 21 3d 30 20 29  (id = *pId)!=0 )
0350: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 69 64 2d  {.    return id-
0360: 3e 70 4d 65 74 68 6f 64 2d 3e 78 43 6c 6f 73 65  >pMethod->xClose
0370: 28 70 49 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  (pId);.  }else{.
0380: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
0390: 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 69 6e 74 20  E_OK;.  }.}.int 
03a0: 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 44 69 72  sqlite3OsOpenDir
03b0: 65 63 74 6f 72 79 28 4f 73 46 69 6c 65 20 2a 69  ectory(OsFile *i
03c0: 64 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  d, const char *z
03d0: 4e 61 6d 65 29 7b 0a 20 20 72 65 74 75 72 6e 20  Name){.  return 
03e0: 69 64 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 4f 70  id->pMethod->xOp
03f0: 65 6e 44 69 72 65 63 74 6f 72 79 28 69 64 2c 20  enDirectory(id, 
0400: 7a 4e 61 6d 65 29 3b 0a 7d 0a 69 6e 74 20 73 71  zName);.}.int sq
0410: 6c 69 74 65 33 4f 73 52 65 61 64 28 4f 73 46 69  lite3OsRead(OsFi
0420: 6c 65 20 2a 69 64 2c 20 76 6f 69 64 20 2a 70 42  le *id, void *pB
0430: 75 66 2c 20 69 6e 74 20 61 6d 74 29 7b 0a 20 20  uf, int amt){.  
0440: 72 65 74 75 72 6e 20 69 64 2d 3e 70 4d 65 74 68  return id->pMeth
0450: 6f 64 2d 3e 78 52 65 61 64 28 69 64 2c 20 70 42  od->xRead(id, pB
0460: 75 66 2c 20 61 6d 74 29 3b 0a 7d 0a 69 6e 74 20  uf, amt);.}.int 
0470: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 4f  sqlite3OsWrite(O
0480: 73 46 69 6c 65 20 2a 69 64 2c 20 63 6f 6e 73 74  sFile *id, const
0490: 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e 74   void *pBuf, int
04a0: 20 61 6d 74 29 7b 0a 20 20 72 65 74 75 72 6e 20   amt){.  return 
04b0: 69 64 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 57 72  id->pMethod->xWr
04c0: 69 74 65 28 69 64 2c 20 70 42 75 66 2c 20 61 6d  ite(id, pBuf, am
04d0: 74 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  t);.}.int sqlite
04e0: 33 4f 73 53 65 65 6b 28 4f 73 46 69 6c 65 20 2a  3OsSeek(OsFile *
04f0: 69 64 2c 20 69 36 34 20 6f 66 66 73 65 74 29 7b  id, i64 offset){
0500: 0a 20 20 72 65 74 75 72 6e 20 69 64 2d 3e 70 4d  .  return id->pM
0510: 65 74 68 6f 64 2d 3e 78 53 65 65 6b 28 69 64 2c  ethod->xSeek(id,
0520: 20 6f 66 66 73 65 74 29 3b 0a 7d 0a 69 6e 74 20   offset);.}.int 
0530: 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74  sqlite3OsTruncat
0540: 65 28 4f 73 46 69 6c 65 20 2a 69 64 2c 20 69 36  e(OsFile *id, i6
0550: 34 20 73 69 7a 65 29 7b 0a 20 20 72 65 74 75 72  4 size){.  retur
0560: 6e 20 69 64 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78  n id->pMethod->x
0570: 54 72 75 6e 63 61 74 65 28 69 64 2c 20 73 69 7a  Truncate(id, siz
0580: 65 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  e);.}.int sqlite
0590: 33 4f 73 53 79 6e 63 28 4f 73 46 69 6c 65 20 2a  3OsSync(OsFile *
05a0: 69 64 2c 20 69 6e 74 20 66 75 6c 6c 73 79 6e 63  id, int fullsync
05b0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 69 64 2d 3e  ){.  return id->
05c0: 70 4d 65 74 68 6f 64 2d 3e 78 53 79 6e 63 28 69  pMethod->xSync(i
05d0: 64 2c 20 66 75 6c 6c 73 79 6e 63 29 3b 0a 7d 0a  d, fullsync);.}.
05e0: 76 6f 69 64 20 73 71 6c 69 74 65 33 4f 73 53 65  void sqlite3OsSe
05f0: 74 46 75 6c 6c 53 79 6e 63 28 4f 73 46 69 6c 65  tFullSync(OsFile
0600: 20 2a 69 64 2c 20 69 6e 74 20 76 61 6c 75 65 29   *id, int value)
0610: 7b 0a 20 20 69 64 2d 3e 70 4d 65 74 68 6f 64 2d  {.  id->pMethod-
0620: 3e 78 53 65 74 46 75 6c 6c 53 79 6e 63 28 69 64  >xSetFullSync(id
0630: 2c 20 76 61 6c 75 65 29 3b 0a 7d 0a 23 69 66 20  , value);.}.#if 
0640: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
0650: 45 53 54 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  EST) || defined(
0660: 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a  SQLITE_DEBUG)./*
0670: 20 54 68 69 73 20 6d 65 74 68 6f 64 20 69 73 20   This method is 
0680: 63 75 72 72 65 6e 74 6c 79 20 6f 6e 6c 79 20 75  currently only u
0690: 73 65 64 20 77 68 69 6c 65 20 69 6e 74 65 72 61  sed while intera
06a0: 63 74 69 76 65 6c 79 20 64 65 62 75 67 67 69 6e  ctively debuggin
06b0: 67 20 74 68 65 20 0a 2a 2a 20 70 61 67 65 72 2e  g the .** pager.
06c0: 20 4d 6f 72 65 20 73 70 65 63 69 66 69 63 6c 79   More specificly
06d0: 2c 20 69 74 20 63 61 6e 20 6f 6e 6c 79 20 62 65  , it can only be
06e0: 20 75 73 65 64 20 77 68 65 6e 20 73 71 6c 69 74   used when sqlit
06f0: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 29 20  e3DebugPrintf() 
0700: 69 73 0a 2a 2a 20 69 6e 63 6c 75 64 65 64 20 69  is.** included i
0710: 6e 20 74 68 65 20 62 75 69 6c 64 2e 20 2a 2f 0a  n the build. */.
0720: 69 6e 74 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  int sqlite3OsFil
0730: 65 48 61 6e 64 6c 65 28 4f 73 46 69 6c 65 20 2a  eHandle(OsFile *
0740: 69 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 69 64  id){.  return id
0750: 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 46 69 6c 65  ->pMethod->xFile
0760: 48 61 6e 64 6c 65 28 69 64 29 3b 0a 7d 0a 23 65  Handle(id);.}.#e
0770: 6e 64 69 66 0a 69 6e 74 20 73 71 6c 69 74 65 33  ndif.int sqlite3
0780: 4f 73 46 69 6c 65 53 69 7a 65 28 4f 73 46 69 6c  OsFileSize(OsFil
0790: 65 20 2a 69 64 2c 20 69 36 34 20 2a 70 53 69 7a  e *id, i64 *pSiz
07a0: 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 69 64 2d  e){.  return id-
07b0: 3e 70 4d 65 74 68 6f 64 2d 3e 78 46 69 6c 65 53  >pMethod->xFileS
07c0: 69 7a 65 28 69 64 2c 20 70 53 69 7a 65 29 3b 0a  ize(id, pSize);.
07d0: 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 4f 73 4c  }.int sqlite3OsL
07e0: 6f 63 6b 28 4f 73 46 69 6c 65 20 2a 69 64 2c 20  ock(OsFile *id, 
07f0: 69 6e 74 20 6c 6f 63 6b 54 79 70 65 29 7b 0a 20  int lockType){. 
0800: 20 72 65 74 75 72 6e 20 69 64 2d 3e 70 4d 65 74   return id->pMet
0810: 68 6f 64 2d 3e 78 4c 6f 63 6b 28 69 64 2c 20 6c  hod->xLock(id, l
0820: 6f 63 6b 54 79 70 65 29 3b 0a 7d 0a 69 6e 74 20  ockType);.}.int 
0830: 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
0840: 4f 73 46 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  OsFile *id, int 
0850: 6c 6f 63 6b 54 79 70 65 29 7b 0a 20 20 72 65 74  lockType){.  ret
0860: 75 72 6e 20 69 64 2d 3e 70 4d 65 74 68 6f 64 2d  urn id->pMethod-
0870: 3e 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 6c 6f 63  >xUnlock(id, loc
0880: 6b 54 79 70 65 29 3b 0a 7d 0a 69 6e 74 20 73 71  kType);.}.int sq
0890: 6c 69 74 65 33 4f 73 4c 6f 63 6b 53 74 61 74 65  lite3OsLockState
08a0: 28 4f 73 46 69 6c 65 20 2a 69 64 29 7b 0a 20 20  (OsFile *id){.  
08b0: 72 65 74 75 72 6e 20 69 64 2d 3e 70 4d 65 74 68  return id->pMeth
08c0: 6f 64 2d 3e 78 4c 6f 63 6b 53 74 61 74 65 28 69  od->xLockState(i
08d0: 64 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  d);.}.int sqlite
08e0: 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65 64  3OsCheckReserved
08f0: 4c 6f 63 6b 28 4f 73 46 69 6c 65 20 2a 69 64 29  Lock(OsFile *id)
0900: 7b 0a 20 20 72 65 74 75 72 6e 20 69 64 2d 3e 70  {.  return id->p
0910: 4d 65 74 68 6f 64 2d 3e 78 43 68 65 63 6b 52 65  Method->xCheckRe
0920: 73 65 72 76 65 64 4c 6f 63 6b 28 69 64 29 3b 0a  servedLock(id);.
0930: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
0940: 5f 45 4e 41 42 4c 45 5f 52 45 44 45 46 5f 49 4f  _ENABLE_REDEF_IO
0950: 0a 2f 2a 0a 2a 2a 20 41 20 66 75 6e 63 74 69 6f  ./*.** A functio
0960: 6e 20 74 6f 20 72 65 74 75 72 6e 20 61 20 70 6f  n to return a po
0970: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 76 69 72  inter to the vir
0980: 74 75 61 6c 20 66 75 6e 63 74 69 6f 6e 20 74 61  tual function ta
0990: 62 6c 65 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ble..** This rou
09a0: 74 69 6e 65 20 72 65 61 6c 6c 79 20 64 6f 65 73  tine really does
09b0: 20 6e 6f 74 20 61 63 63 6f 6d 70 6c 69 73 68 20   not accomplish 
09c0: 76 65 72 79 20 6d 75 63 68 20 73 69 6e 63 65 20  very much since 
09d0: 74 68 65 0a 2a 2a 20 76 69 72 74 75 61 6c 20 66  the.** virtual f
09e0: 75 6e 63 74 69 6f 6e 20 74 61 62 6c 65 20 69 73  unction table is
09f0: 20 61 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62   a global variab
0a00: 6c 65 20 61 6e 64 20 61 6e 79 62 6f 64 79 20 77  le and anybody w
0a10: 68 6f 0a 2a 2a 20 63 61 6e 20 63 61 6c 6c 20 74  ho.** can call t
0a20: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e  his function can
0a30: 20 6a 75 73 74 20 61 73 20 65 61 73 69 6c 79 20   just as easily 
0a40: 61 63 63 65 73 73 20 74 68 65 20 76 61 72 69 61  access the varia
0a50: 62 6c 65 0a 2a 2a 20 66 6f 72 20 74 68 65 6d 73  ble.** for thems
0a60: 65 6c 76 65 73 2e 20 20 4e 65 76 65 72 74 68 65  elves.  Neverthe
0a70: 6c 65 73 73 2c 20 77 65 20 69 6e 63 6c 75 64 65  less, we include
0a80: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66 6f   this routine fo
0a90: 72 0a 2a 2a 20 62 61 63 6b 77 61 72 64 73 20 63  r.** backwards c
0aa0: 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 77 69 74  ompatibility wit
0ab0: 68 20 61 6e 20 65 61 72 6c 69 65 72 20 72 65 64  h an earlier red
0ac0: 65 66 69 6e 61 62 6c 65 20 49 2f 4f 0a 2a 2a 20  efinable I/O.** 
0ad0: 69 6e 74 65 72 66 61 63 65 20 64 65 73 69 67 6e  interface design
0ae0: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 73 71 6c 69  ..*/.struct sqli
0af0: 74 65 33 4f 73 56 74 62 6c 20 2a 73 71 6c 69 74  te3OsVtbl *sqlit
0b00: 65 33 5f 6f 73 5f 73 77 69 74 63 68 28 76 6f 69  e3_os_switch(voi
0b10: 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 26 73 71  d){.  return &sq
0b20: 6c 69 74 65 33 4f 73 3b 0a 7d 0a 23 65 6e 64 69  lite3Os;.}.#endi
0b30: 66 0a                                            f.