⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 os_win.c

📁 sqlite 嵌入式数据库的源码
💻 C
📖 第 1 页 / 共 2 页
字号:
/*** 2004 May 22**** The author disclaims copyright to this source code.  In place of** a legal notice, here is a blessing:****    May you do good and not evil.**    May you find forgiveness for yourself and forgive others.**    May you share freely, never taking more than you give.************************************************************************************ This file contains code that is specific to windows.*/#include "sqliteInt.h"#include "os.h"#if OS_WIN               /* This file is used for windows only */#include <winbase.h>#ifdef __CYGWIN__# include <sys/cygwin.h>#endif/*** Macros used to determine whether or not to use threads.*/#if defined(THREADSAFE) && THREADSAFE# define SQLITE_W32_THREADS 1#endif/*** Include code that is common to all os_*.c files*/#include "os_common.h"/*** Do not include any of the File I/O interface procedures if the** SQLITE_OMIT_DISKIO macro is defined (indicating that there database** will be in-memory only)*/#ifndef SQLITE_OMIT_DISKIO/*** Delete the named file*/int sqlite3OsDelete(const char *zFilename){  DeleteFileA(zFilename);  TRACE2("DELETE \"%s\"\n", zFilename);  return SQLITE_OK;}/*** Return TRUE if the named file exists.*/int sqlite3OsFileExists(const char *zFilename){  return GetFileAttributesA(zFilename) != 0xffffffff;}/*** Attempt to open a file for both reading and writing.  If that** fails, try opening it read-only.  If the file does not exist,** try to create it.**** On success, a handle for the open file is written to *id** and *pReadonly is set to 0 if the file was opened for reading and** writing or 1 if the file was opened read-only.  The function returns** SQLITE_OK.**** On failure, the function returns SQLITE_CANTOPEN and leaves** *id and *pReadonly unchanged.*/int sqlite3OsOpenReadWrite(  const char *zFilename,  OsFile *id,  int *pReadonly){  HANDLE h;  assert( !id->isOpen );  h = CreateFileA(zFilename,     GENERIC_READ | GENERIC_WRITE,     FILE_SHARE_READ | FILE_SHARE_WRITE,     NULL,     OPEN_ALWAYS,     FILE_ATTRIBUTE_NORMAL | FILE_FLAG_RANDOM_ACCESS,     NULL  );  if( h==INVALID_HANDLE_VALUE ){    h = CreateFileA(zFilename,       GENERIC_READ,       FILE_SHARE_READ,       NULL,       OPEN_ALWAYS,       FILE_ATTRIBUTE_NORMAL | FILE_FLAG_RANDOM_ACCESS,       NULL    );    if( h==INVALID_HANDLE_VALUE ){      return SQLITE_CANTOPEN;    }    *pReadonly = 1;  }else{    *pReadonly = 0;  }  id->h = h;  id->locktype = NO_LOCK;  id->sharedLockByte = 0;  id->isOpen = 1;  OpenCounter(+1);  TRACE3("OPEN R/W %d \"%s\"\n", h, zFilename);  return SQLITE_OK;}/*** Attempt to open a new file for exclusive access by this process.** The file will be opened for both reading and writing.  To avoid** a potential security problem, we do not allow the file to have** previously existed.  Nor do we allow the file to be a symbolic** link.**** If delFlag is true, then make arrangements to automatically delete** the file when it is closed.**** On success, write the file handle into *id and return SQLITE_OK.**** On failure, return SQLITE_CANTOPEN.*/int sqlite3OsOpenExclusive(const char *zFilename, OsFile *id, int delFlag){  HANDLE h;  int fileflags;  assert( !id->isOpen );  if( delFlag ){    fileflags = FILE_ATTRIBUTE_TEMPORARY | FILE_FLAG_RANDOM_ACCESS                      | FILE_FLAG_DELETE_ON_CLOSE;  }else{    fileflags = FILE_FLAG_RANDOM_ACCESS;  }  h = CreateFileA(zFilename,     GENERIC_READ | GENERIC_WRITE,     0,     NULL,     CREATE_ALWAYS,     fileflags,     NULL  );  if( h==INVALID_HANDLE_VALUE ){    return SQLITE_CANTOPEN;  }  id->h = h;  id->locktype = NO_LOCK;  id->sharedLockByte = 0;  id->isOpen = 1;  OpenCounter(+1);  TRACE3("OPEN EX %d \"%s\"\n", h, zFilename);  return SQLITE_OK;}/*** Attempt to open a new file for read-only access.**** On success, write the file handle into *id and return SQLITE_OK.**** On failure, return SQLITE_CANTOPEN.*/int sqlite3OsOpenReadOnly(const char *zFilename, OsFile *id){  HANDLE h;  assert( !id->isOpen );  h = CreateFileA(zFilename,     GENERIC_READ,     0,     NULL,     OPEN_EXISTING,     FILE_ATTRIBUTE_NORMAL | FILE_FLAG_RANDOM_ACCESS,     NULL  );  if( h==INVALID_HANDLE_VALUE ){    return SQLITE_CANTOPEN;  }  id->h = h;  id->locktype = NO_LOCK;  id->sharedLockByte = 0;  id->isOpen = 1;  OpenCounter(+1);  TRACE3("OPEN RO %d \"%s\"\n", h, zFilename);  return SQLITE_OK;}/*** Attempt to open a file descriptor for the directory that contains a** file.  This file descriptor can be used to fsync() the directory** in order to make sure the creation of a new file is actually written** to disk.**** This routine is only meaningful for Unix.  It is a no-op under** windows since windows does not support hard links.**** On success, a handle for a previously open file is at *id is** updated with the new directory file descriptor and SQLITE_OK is** returned.**** On failure, the function returns SQLITE_CANTOPEN and leaves** *id unchanged.*/int sqlite3OsOpenDirectory(  const char *zDirname,  OsFile *id){  return SQLITE_OK;}/*** If the following global variable points to a string which is the** name of a directory, then that directory will be used to store** temporary files.*/char *sqlite3_temp_directory = 0;/*** Create a temporary file name in zBuf.  zBuf must be big enough to** hold at least SQLITE_TEMPNAME_SIZE characters.*/int sqlite3OsTempFileName(char *zBuf){  static char zChars[] =    "abcdefghijklmnopqrstuvwxyz"    "ABCDEFGHIJKLMNOPQRSTUVWXYZ"    "0123456789";  int i, j;  char zTempPath[SQLITE_TEMPNAME_SIZE];  if( sqlite3_temp_directory ){    strncpy(zTempPath, sqlite3_temp_directory, SQLITE_TEMPNAME_SIZE-30);    zTempPath[SQLITE_TEMPNAME_SIZE-30] = 0;  }else{    GetTempPathA(SQLITE_TEMPNAME_SIZE-30, zTempPath);  }  for(i=strlen(zTempPath); i>0 && zTempPath[i-1]=='\\'; i--){}  zTempPath[i] = 0;  for(;;){    sprintf(zBuf, "%s\\"TEMP_FILE_PREFIX, zTempPath);    j = strlen(zBuf);    sqlite3Randomness(15, &zBuf[j]);    for(i=0; i<15; i++, j++){      zBuf[j] = (char)zChars[ ((unsigned char)zBuf[j])%(sizeof(zChars)-1) ];    }    zBuf[j] = 0;    if( !sqlite3OsFileExists(zBuf) ) break;  }  TRACE2("TEMP FILENAME: %s\n", zBuf);  return SQLITE_OK; }/*** Close a file.*/int sqlite3OsClose(OsFile *id){  if( id->isOpen ){    TRACE2("CLOSE %d\n", id->h);    CloseHandle(id->h);    OpenCounter(-1);    id->isOpen = 0;  }  return SQLITE_OK;}/*** Read data from a file into a buffer.  Return SQLITE_OK if all** bytes were read successfully and SQLITE_IOERR if anything goes** wrong.*/int sqlite3OsRead(OsFile *id, void *pBuf, int amt){  DWORD got;  assert( id->isOpen );  SimulateIOError(SQLITE_IOERR);  TRACE3("READ %d lock=%d\n", id->h, id->locktype);  if( !ReadFile(id->h, pBuf, amt, &got, 0) ){    got = 0;  }  if( got==(DWORD)amt ){    return SQLITE_OK;  }else{    return SQLITE_IOERR;  }}/*** Write data from a buffer into a file.  Return SQLITE_OK on success** or some other error code on failure.*/int sqlite3OsWrite(OsFile *id, const void *pBuf, int amt){  int rc = 0;  DWORD wrote;  assert( id->isOpen );  SimulateIOError(SQLITE_IOERR);  SimulateDiskfullError;  TRACE3("WRITE %d lock=%d\n", id->h, id->locktype);  assert( amt>0 );  while( amt>0 && (rc = WriteFile(id->h, pBuf, amt, &wrote, 0))!=0 && wrote>0 ){    amt -= wrote;    pBuf = &((char*)pBuf)[wrote];  }  if( !rc || amt>(int)wrote ){    return SQLITE_FULL;  }  return SQLITE_OK;}/*** Move the read/write pointer in a file.*/int sqlite3OsSeek(OsFile *id, i64 offset){  LONG upperBits = offset>>32;  LONG lowerBits = offset & 0xffffffff;  DWORD rc;  assert( id->isOpen );  SEEK(offset/1024 + 1);  rc = SetFilePointer(id->h, lowerBits, &upperBits, FILE_BEGIN);  TRACE3("SEEK %d %lld\n", id->h, offset);  return SQLITE_OK;}/*** Make sure all writes to a particular file are committed to disk.*/int sqlite3OsSync(OsFile *id){  assert( id->isOpen );  TRACE3("SYNC %d lock=%d\n", id->h, id->locktype);  if( FlushFileBuffers(id->h) ){    return SQLITE_OK;  }else{    return SQLITE_IOERR;  }}/*** Sync the directory zDirname. This is a no-op on operating systems other** than UNIX.*/int sqlite3OsSyncDirectory(const char *zDirname){  SimulateIOError(SQLITE_IOERR);  return SQLITE_OK;}/*** Truncate an open file to a specified size*/int sqlite3OsTruncate(OsFile *id, i64 nByte){  LONG upperBits = nByte>>32;  assert( id->isOpen );  TRACE3("TRUNCATE %d %lld\n", id->h, nByte);  SimulateIOError(SQLITE_IOERR);  SetFilePointer(id->h, nByte, &upperBits, FILE_BEGIN);  SetEndOfFile(id->h);  return SQLITE_OK;}/*** Determine the current size of a file in bytes*/int sqlite3OsFileSize(OsFile *id, i64 *pSize){  DWORD upperBits, lowerBits;  assert( id->isOpen );  SimulateIOError(SQLITE_IOERR);  lowerBits = GetFileSize(id->h, &upperBits);  *pSize = (((i64)upperBits)<<32) + lowerBits;  return SQLITE_OK;}/*** Return true (non-zero) if we are running under WinNT, Win2K or WinXP.** Return false (zero) for Win95, Win98, or WinME.**** Here is an interesting observation:  Win95, Win98, and WinME lack** the LockFileEx() API.  But we can still statically link against that** API as long as we don't call it win running Win95/98/ME.  A call to** this routine is used to determine if the host is Win95/98/ME or** WinNT/2K/XP so that we will know whether or not we can safely call** the LockFileEx() API.*/static int isNT(void){  static int osType = 0;   /* 0=unknown 1=win95 2=winNT */  if( osType==0 ){    OSVERSIONINFO sInfo;    sInfo.dwOSVersionInfoSize = sizeof(sInfo);    GetVersionEx(&sInfo);    osType = sInfo.dwPlatformId==VER_PLATFORM_WIN32_NT ? 2 : 1;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -