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

📄 os_os2.c

📁 最新的sqlite3.6.2源代码
💻 C
📖 第 1 页 / 共 3 页
字号:
    UnlockArea.lRange = 0L;    res = DosSetFileLocks( pFile->h, &UnlockArea, &LockArea, LOCK_TIMEOUT, 0L );    if( res == NO_ERROR ){      newLocktype = EXCLUSIVE_LOCK;    }else{      OSTRACE2( "OS/2 error-code = %d\n", res );      getReadLock(pFile);    }    OSTRACE3( "LOCK %d acquire exclusive lock.  res=%d\n", pFile->h, res );  }  /* If we are holding a PENDING lock that ought to be released, then  ** release it now.  */  if( gotPendingLock && locktype==SHARED_LOCK ){    int r;    LockArea.lOffset = 0L;    LockArea.lRange = 0L;    UnlockArea.lOffset = PENDING_BYTE;    UnlockArea.lRange = 1L;    r = DosSetFileLocks( pFile->h, &UnlockArea, &LockArea, LOCK_TIMEOUT, 0L );    OSTRACE3( "LOCK %d unlocking pending/is shared. r=%d\n", pFile->h, r );  }  /* Update the state of the lock has held in the file descriptor then  ** return the appropriate result code.  */  if( res == NO_ERROR ){    rc = SQLITE_OK;  }else{    OSTRACE4( "LOCK FAILED %d trying for %d but got %d\n", pFile->h,              locktype, newLocktype );    rc = SQLITE_BUSY;  }  pFile->locktype = newLocktype;  OSTRACE3( "LOCK %d now %d\n", pFile->h, pFile->locktype );  return rc;}/*** This routine checks if there is a RESERVED lock held on the specified** file by this or any other process. If such a lock is held, return** non-zero, otherwise zero.*/static int os2CheckReservedLock( sqlite3_file *id, int *pOut ){  int r = 0;  os2File *pFile = (os2File*)id;  assert( pFile!=0 );  if( pFile->locktype>=RESERVED_LOCK ){    r = 1;    OSTRACE3( "TEST WR-LOCK %d %d (local)\n", pFile->h, r );  }else{    FILELOCK  LockArea,              UnlockArea;    APIRET rc = NO_ERROR;    memset(&LockArea, 0, sizeof(LockArea));    memset(&UnlockArea, 0, sizeof(UnlockArea));    LockArea.lOffset = RESERVED_BYTE;    LockArea.lRange = 1L;    UnlockArea.lOffset = 0L;    UnlockArea.lRange = 0L;    rc = DosSetFileLocks( pFile->h, &UnlockArea, &LockArea, LOCK_TIMEOUT, 0L );    OSTRACE3( "TEST WR-LOCK %d lock reserved byte rc=%d\n", pFile->h, rc );    if( rc == NO_ERROR ){      APIRET rcu = NO_ERROR; /* return code for unlocking */      LockArea.lOffset = 0L;      LockArea.lRange = 0L;      UnlockArea.lOffset = RESERVED_BYTE;      UnlockArea.lRange = 1L;      rcu = DosSetFileLocks( pFile->h, &UnlockArea, &LockArea, LOCK_TIMEOUT, 0L );      OSTRACE3( "TEST WR-LOCK %d unlock reserved byte r=%d\n", pFile->h, rcu );    }    r = !(rc == NO_ERROR);    OSTRACE3( "TEST WR-LOCK %d %d (remote)\n", pFile->h, r );  }  *pOut = r;  return SQLITE_OK;}/*** Lower the locking level on file descriptor id to locktype.  locktype** must be either NO_LOCK or SHARED_LOCK.**** If the locking level of the file descriptor is already at or below** the requested locking level, this routine is a no-op.**** It is not possible for this routine to fail if the second argument** is NO_LOCK.  If the second argument is SHARED_LOCK then this routine** might return SQLITE_IOERR;*/static int os2Unlock( sqlite3_file *id, int locktype ){  int type;  os2File *pFile = (os2File*)id;  APIRET rc = SQLITE_OK;  APIRET res = NO_ERROR;  FILELOCK  LockArea,            UnlockArea;  memset(&LockArea, 0, sizeof(LockArea));  memset(&UnlockArea, 0, sizeof(UnlockArea));  assert( pFile!=0 );  assert( locktype<=SHARED_LOCK );  OSTRACE4( "UNLOCK %d to %d was %d\n", pFile->h, locktype, pFile->locktype );  type = pFile->locktype;  if( type>=EXCLUSIVE_LOCK ){    LockArea.lOffset = 0L;    LockArea.lRange = 0L;    UnlockArea.lOffset = SHARED_FIRST;    UnlockArea.lRange = SHARED_SIZE;    res = DosSetFileLocks( pFile->h, &UnlockArea, &LockArea, LOCK_TIMEOUT, 0L );    OSTRACE3( "UNLOCK %d exclusive lock res=%d\n", pFile->h, res );    if( locktype==SHARED_LOCK && getReadLock(pFile) != NO_ERROR ){      /* This should never happen.  We should always be able to      ** reacquire the read lock */      OSTRACE3( "UNLOCK %d to %d getReadLock() failed\n", pFile->h, locktype );      rc = SQLITE_IOERR_UNLOCK;    }  }  if( type>=RESERVED_LOCK ){    LockArea.lOffset = 0L;    LockArea.lRange = 0L;    UnlockArea.lOffset = RESERVED_BYTE;    UnlockArea.lRange = 1L;    res = DosSetFileLocks( pFile->h, &UnlockArea, &LockArea, LOCK_TIMEOUT, 0L );    OSTRACE3( "UNLOCK %d reserved res=%d\n", pFile->h, res );  }  if( locktype==NO_LOCK && type>=SHARED_LOCK ){    res = unlockReadLock(pFile);    OSTRACE5( "UNLOCK %d is %d want %d res=%d\n", pFile->h, type, locktype, res );  }  if( type>=PENDING_LOCK ){    LockArea.lOffset = 0L;    LockArea.lRange = 0L;    UnlockArea.lOffset = PENDING_BYTE;    UnlockArea.lRange = 1L;    res = DosSetFileLocks( pFile->h, &UnlockArea, &LockArea, LOCK_TIMEOUT, 0L );    OSTRACE3( "UNLOCK %d pending res=%d\n", pFile->h, res );  }  pFile->locktype = locktype;  OSTRACE3( "UNLOCK %d now %d\n", pFile->h, pFile->locktype );  return rc;}/*** Control and query of the open file handle.*/static int os2FileControl(sqlite3_file *id, int op, void *pArg){  switch( op ){    case SQLITE_FCNTL_LOCKSTATE: {      *(int*)pArg = ((os2File*)id)->locktype;      OSTRACE3( "FCNTL_LOCKSTATE %d lock=%d\n", ((os2File*)id)->h, ((os2File*)id)->locktype );      return SQLITE_OK;    }  }  return SQLITE_ERROR;}/*** Return the sector size in bytes of the underlying block device for** the specified file. This is almost always 512 bytes, but may be** larger for some devices.**** SQLite code assumes this function cannot fail. It also assumes that** if two files are created in the same file-system directory (i.e.** a database and its journal file) that the sector size will be the** same for both.*/static int os2SectorSize(sqlite3_file *id){  return SQLITE_DEFAULT_SECTOR_SIZE;}/*** Return a vector of device characteristics.*/static int os2DeviceCharacteristics(sqlite3_file *id){  return 0;}/*** Character set conversion objects used by conversion routines.*/static UconvObject ucUtf8 = NULL; /* convert between UTF-8 and UCS-2 */static UconvObject uclCp = NULL;  /* convert between local codepage and UCS-2 *//*** Helper function to initialize the conversion objects from and to UTF-8.*/static void initUconvObjects( void ){  if( UniCreateUconvObject( UTF_8, &ucUtf8 ) != ULS_SUCCESS )    ucUtf8 = NULL;  if ( UniCreateUconvObject( (UniChar *)L"@path=yes", &uclCp ) != ULS_SUCCESS )    uclCp = NULL;}/*** Helper function to free the conversion objects from and to UTF-8.*/static void freeUconvObjects( void ){  if ( ucUtf8 )    UniFreeUconvObject( ucUtf8 );  if ( uclCp )    UniFreeUconvObject( uclCp );  ucUtf8 = NULL;  uclCp = NULL;}/*** Helper function to convert UTF-8 filenames to local OS/2 codepage.** The two-step process: first convert the incoming UTF-8 string** into UCS-2 and then from UCS-2 to the current codepage.** The returned char pointer has to be freed.*/static char *convertUtf8PathToCp( const char *in ){  UniChar tempPath[CCHMAXPATH];  char *out = (char *)calloc( CCHMAXPATH, 1 );  if( !out )    return NULL;  if( !ucUtf8 || !uclCp )    initUconvObjects();  /* determine string for the conversion of UTF-8 which is CP1208 */  if( UniStrToUcs( ucUtf8, tempPath, (char *)in, CCHMAXPATH ) != ULS_SUCCESS )    return out; /* if conversion fails, return the empty string */  /* conversion for current codepage which can be used for paths */  UniStrFromUcs( uclCp, out, tempPath, CCHMAXPATH );  return out;}/*** Helper function to convert filenames from local codepage to UTF-8.** The two-step process: first convert the incoming codepage-specific** string into UCS-2 and then from UCS-2 to the codepage of UTF-8.** The returned char pointer has to be freed.**** This function is non-static to be able to use this in shell.c and** similar applications that take command line arguments.*/char *convertCpPathToUtf8( const char *in ){  UniChar tempPath[CCHMAXPATH];  char *out = (char *)calloc( CCHMAXPATH, 1 );  if( !out )    return NULL;  if( !ucUtf8 || !uclCp )    initUconvObjects();  /* conversion for current codepage which can be used for paths */  if( UniStrToUcs( uclCp, tempPath, (char *)in, CCHMAXPATH ) != ULS_SUCCESS )    return out; /* if conversion fails, return the empty string */  /* determine string for the conversion of UTF-8 which is CP1208 */  UniStrFromUcs( ucUtf8, out, tempPath, CCHMAXPATH );  return out;}/*** This vector defines all the methods that can operate on an** sqlite3_file for os2.*/static const sqlite3_io_methods os2IoMethod = {  1,                        /* iVersion */  os2Close,  os2Read,  os2Write,  os2Truncate,  os2Sync,  os2FileSize,  os2Lock,  os2Unlock,  os2CheckReservedLock,  os2FileControl,  os2SectorSize,  os2DeviceCharacteristics};/***************************************************************************** Here ends the I/O methods that form the sqlite3_io_methods object.**** The next block of code implements the VFS methods.****************************************************************************//*** Create a temporary file name in zBuf.  zBuf must be big enough to** hold at pVfs->mxPathname characters.*/static int getTempname(int nBuf, char *zBuf ){  static const unsigned char zChars[] =    "abcdefghijklmnopqrstuvwxyz"    "ABCDEFGHIJKLMNOPQRSTUVWXYZ"    "0123456789";  int i, j;  char zTempPathBuf[3];  PSZ zTempPath = (PSZ)&zTempPathBuf;  if( sqlite3_temp_directory ){    zTempPath = sqlite3_temp_directory;  }else{    if( DosScanEnv( (PSZ)"TEMP", &zTempPath ) ){      if( DosScanEnv( (PSZ)"TMP", &zTempPath ) ){        if( DosScanEnv( (PSZ)"TMPDIR", &zTempPath ) ){           ULONG ulDriveNum = 0, ulDriveMap = 0;           DosQueryCurrentDisk( &ulDriveNum, &ulDriveMap );           sprintf( (char*)zTempPath, "%c:", (char)( 'A' + ulDriveNum - 1 ) );        }      }    }  }  /* Strip off a trailing slashes or backslashes, otherwise we would get *   * multiple (back)slashes which causes DosOpen() to fail.              *   * Trailing spaces are not allowed, either.                            */  j = strlen(zTempPath);  while( j > 0 && ( zTempPath[j-1] == '\\' || zTempPath[j-1] == '/'                    || zTempPath[j-1] == ' ' ) ){    j--;  }  zTempPath[j] = '\0';  if( !sqlite3_temp_directory ){    char *zTempPathUTF = convertCpPathToUtf8( zTempPath );    sqlite3_snprintf( nBuf-30, zBuf,                      "%s\\"SQLITE_TEMP_FILE_PREFIX, zTempPathUTF );    free( zTempPathUTF );  }else{    sqlite3_snprintf( nBuf-30, zBuf,                      "%s\\"SQLITE_TEMP_FILE_PREFIX, zTempPath );  }  j = strlen( zBuf );  sqlite3_randomness( 20, &zBuf[j] );  for( i = 0; i < 20; i++, j++ ){    zBuf[j] = (char)zChars[ ((unsigned char)zBuf[j])%(sizeof(zChars)-1) ];  }  zBuf[j] = 0;  OSTRACE2( "TEMP FILENAME: %s\n", zBuf );  return SQLITE_OK;}/*** Turn a relative pathname into a full pathname.  Write the full** pathname into zFull[].  zFull[] will be at least pVfs->mxPathname** bytes in size.*/static int os2FullPathname(  sqlite3_vfs *pVfs,          /* Pointer to vfs object */  const char *zRelative,      /* Possibly relative input path */  int nFull,                  /* Size of output buffer in bytes */  char *zFull                 /* Output buffer */){  char *zRelativeCp = convertUtf8PathToCp( zRelative );  char zFullCp[CCHMAXPATH] = "\0";  char *zFullUTF;  APIRET rc = DosQueryPathInfo( zRelativeCp, FIL_QUERYFULLNAME, zFullCp,                                CCHMAXPATH );  free( zRelativeCp );  zFullUTF = convertCpPathToUtf8( zFullCp );  sqlite3_snprintf( nFull, zFull, zFullUTF );  free( zFullUTF );  return rc == NO_ERROR ? SQLITE_OK : SQLITE_IOERR;}/*** Open a file.*/static int os2Open(  sqlite3_vfs *pVfs,            /* Not used */  const char *zName,            /* Name of the file */  sqlite3_file *id,             /* Write the SQLite file handle here */

⌨️ 快捷键说明

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