Files
mars-flaim/sql/src/filesys.h
dsandersoremutah ffe3cb6975 Changed Id property
git-svn-id: https://svn.code.sf.net/p/flaim/code/trunk@482 0109f412-320b-0410-ab79-c3e0c5ffbbe6
2006-05-30 22:00:45 +00:00

412 lines
10 KiB
C

//------------------------------------------------------------------------------
// Desc: Various macros, prototypes, structures.
//
// Tabs: 3
//
// Copyright (c) 1990-1993, 1995-2006 Novell, Inc. All Rights Reserved.
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of version 2 of the GNU General Public
// License as published by the Free Software Foundation.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, contact Novell, Inc.
//
// To contact Novell about this file by physical or electronic mail,
// you may find current contact information at www.novell.com
//
// $Id$
//------------------------------------------------------------------------------
#ifndef FILESYS_H
#define FILESYS_H
/***************************************************************
**
** Defined Constants that the File system cares about
**
****************************************************************/
#define MAX_DATA_BLOCK_FILE_NUMBER 0x7FF
#define FIRST_LOG_BLOCK_FILE_NUMBER (MAX_DATA_BLOCK_FILE_NUMBER + 1)
#define MAX_LOG_BLOCK_FILE_NUMBER 0xFFF
#define FSGetFileNumber( uiBlkAddr) ((uiBlkAddr) & MAX_LOG_BLOCK_FILE_NUMBER)
#define FSGetFileOffset( udBlkAddr) ((udBlkAddr) & 0xFFFFF000)
#define FSBlkAddress( iFileNum, udFileOfs) ((udFileOfs) + (iFileNum))
// Max file size and log threshold.
#define LOG_THRESHOLD_SIZE ((FLMUINT) 0x40000)
// very large threshhold is the size we will allow the physical
// log to grow to before we force a truncation. At the low end,
// it is about 10 megabytes. At the high end it is about
// 1 gigabyte.
#define LOW_VERY_LARGE_LOG_THRESHOLD_SIZE ((FLMUINT)0xA00000)
#define HIGH_VERY_LARGE_LOG_THRESHOLD_SIZE ((FLMUINT) 0x40000000)
// RFL_TRUNCATE_SIZE is the size we will let an RFL file grow to
// before we truncate it back. RFL files are only truncated if
// we are configured to delete old RFL files.
#define RFL_TRUNCATE_SIZE ((FLMUINT)1024 * (FLMUINT)1024 * (FLMUINT)10)
/*============================================================================
Shared Cache Routines
============================================================================*/
RCODE flmPrepareBlockForUse(
FLMUINT uiBlockSize,
F_BLK_HDR * pBlkHdr);
RCODE flmPrepareBlockToWrite(
FLMUINT uiBlockSize,
F_BLK_HDR * pBlkHdr);
void ScaUseCache(
F_CachedBlock * pSCache,
FLMBOOL bMutexAlreadyLocked);
void ScaReleaseCache(
F_CachedBlock * pSCache,
FLMBOOL bMutexAlreadyLocked);
/*============================================================================
File system Btree Cache Routines
============================================================================*/
FLMUINT SENNextVal(
FLMBYTE ** senPtrRV );
FLMUINT FSGetDomain(
FLMBYTE ** curElmRV,
FLMUINT uiElmOvhd);
RCODE dbLock(
F_Db * pDb,
FLMUINT uiMaxLockWait );
RCODE dbUnlock(
F_Db * pDb);
FINLINE void FSLFileIn(
FLMBYTE * pucBuf,
LFILE * pLFile,
FLMUINT uiBlkAddress,
FLMUINT uiOffsetInBlk)
{
F_LF_HDR * pLfHdr = (F_LF_HDR *)pucBuf;
pLFile->uiBlkAddress = uiBlkAddress;
pLFile->uiOffsetInBlk= uiOffsetInBlk;
if ((pLFile->eLfType = (eLFileType)pLfHdr->ui32LfType) != SFLM_LF_INVALID)
{
pLFile->uiLfNum = (FLMUINT)pLfHdr->ui32LfNum;
pLFile->uiEncDefNum = (FLMUINT)pLfHdr->ui32EncDefNum;
pLFile->uiRootBlk = (FLMUINT)pLfHdr->ui32RootBlkAddr;
if (pLFile->eLfType == SFLM_LF_TABLE)
{
pLFile->ui64NextRowId = pLfHdr->ui64NextRowId;
}
else
{
flmAssert( pLFile->eLfType == SFLM_LF_INDEX);
pLFile->ui64NextRowId = 0;
}
}
pLFile->bNeedToWriteOut = FALSE;
}
void lgSetSyncCheckpoint(
F_Database * pDatabase,
FLMUINT uiCheckpoint,
FLMUINT uiBlkAddress);
FLMUINT32 calcBlkCRC(
F_BLK_HDR * pBlkHdr,
FLMUINT uiBlkEnd);
FLMUINT32 calcDbHdrCRC(
SFLM_DB_HDR * pDbHdr);
FLMUINT flmAdjustBlkSize(
FLMUINT uiBlkSize);
void flmInitDbHdr(
SFLM_CREATE_OPTS * pCreateOpts,
FLMBOOL bCreatingDatabase,
FLMBOOL bTempDb,
SFLM_DB_HDR * pDbHdr);
RCODE flmCreateLckFile(
const char * pszFilePath,
IF_FileHdl ** ppLockFileHdl);
RCODE flmAllocHashTbl(
FLMUINT uiHashTblSize,
FBUCKET ** ppHashTblRV);
RCODE flmWaitNotifyReq(
F_MUTEX hMutex,
F_SEM hSem,
FNOTIFY ** ppNotifyListRV,
void * pvUserData);
RCODE flmReadAndVerifyHdrInfo(
SFLM_DB_STATS * pDbStats,
IF_FileHdl * pFileHdl,
SFLM_DB_HDR * pDbHdr,
FLMUINT32 * pui32CalcCRC = NULL);
void flmDoEventCallback(
eEventCategory eCategory,
eEventType eEvent,
F_Db * pDb,
FLMUINT uiThreadId,
FLMUINT64 ui64TransID,
FLMUINT uiIndexOrTable,
FLMUINT64 ui64RowId,
RCODE rc);
void flmLogError(
RCODE rc,
const char * pszDoing,
const char * pszFileName = NULL,
FLMINT iLineNumber = 0);
RCODE flmCollation2Number(
FLMUINT uiBufLen,
const FLMBYTE * pucBuf,
FLMUINT64 * pui64Num,
FLMBOOL * pbNeg,
FLMUINT * puiBytesProcessed);
RCODE flmStorageNum2CollationNum(
const FLMBYTE * pucStorageBuf,
FLMUINT uiStorageLen,
FLMBYTE * pucCollBuf,
FLMUINT * puiCollLen);
RCODE flmCollationNum2StorageNum(
const FLMBYTE * pucCollBuf,
FLMUINT uiCollLen,
FLMBYTE * pucStorageBuf,
FLMUINT * puiStorageLen);
RCODE flmStorageNum2StorageText(
const FLMBYTE * pucNum,
FLMUINT uiNumLen,
FLMBYTE * pucBuffer,
FLMUINT * puiBufLen);
RCODE flmStorageNumberToNumber(
const FLMBYTE * pucNumBuf,
FLMUINT uiNumBufLen,
FLMUINT64 * pui64Number,
FLMBOOL * pbNeg);
RCODE KYCollateValue(
FLMBYTE * pucDest,
FLMUINT * puiDestLen,
IF_PosIStream * pIStream,
FLMUINT uiDataType,
FLMUINT uiFlags,
FLMUINT uiCompareRules,
FLMUINT uiLimit,
FLMUINT * puiCollationLen,
FLMUINT * puiLuLen,
FLMUINT uiLanguage,
FLMBOOL bFirstSubstring,
FLMBOOL bDataTruncated,
FLMBOOL * pbDataTruncated,
FLMBOOL * pbOriginalCharsLost);
#define UNDF_CHR 0x0000 // Undefined char - ignore for now
#define IGNR_CHR 0x0001 // Ignore this char
#define SDWD_CHR 0x0002 // Space delimited word chr
#define DELI_CHR 0x0040 // Delimiter
#define WDJN_CHR 0x0080 // Word Joining chr ".,/-_"
// Implement later
#define KATA_CHR 0x0004 // Katakana word chr
#define HANG_CHR 0x0008 // Hangul word chr
#define CJK_CHR 0x0010 // CJK word chr
RCODE KYSubstringParse(
IF_PosIStream * pIStream,
FLMUINT * puiCompareRules,
FLMUINT uiLimit,
FLMBYTE * pucSubstrBuf,
FLMUINT * puiSubstrBytes,
FLMUINT * puiSubstrChars);
RCODE KYEachWordParse(
IF_PosIStream * pIStream,
FLMUINT * puiCompareRules,
FLMUINT uiLimit,
FLMBYTE * pucWordBuf,
FLMUINT * puiWordLen);
RCODE fdictGetState(
const char * pszState,
FLMUINT * puiState);
RCODE fdictGetIndexState(
const char * pszState,
FLMUINT * puiState);
#define FLM_BACKGROUND_LOCK_PRIORITY -100
void flmLogIndexingProgress(
FLMUINT uiIndexNum,
FLMUINT64 ui64LastDocumentId);
F_BKGND_IX * flmBackgroundIndexGet(
F_Database * pDatabase,
FLMUINT uiValue,
FLMBOOL bMutexLocked,
FLMUINT * puiThreadId = NULL);
RCODE flmGetHdrInfo(
F_SuperFileHdl * pSFileHdl,
SFLM_DB_HDR * pDbHdr,
FLMUINT32 * pui32CalcCRC = NULL);
void convert64(
FLMUINT64 * pui64Num);
void convert32(
FLMUINT32 * pui32Num);
void convert16(
FLMUINT16 * pui16Num);
void convertDbHdr(
SFLM_DB_HDR * pDbHdr);
void convertBlkHdr(
F_BLK_HDR * pBlkHdr);
void convertBlk(
FLMUINT uiBlockSize,
F_BLK_HDR * pBlkHdr);
void convertLfHdr(
F_LF_HDR * pLfHdr);
/*--------------------------------------------------------
** Inline Functions
**-------------------------------------------------------*/
/**************************************************************************
Desc: Returns TRUE if a block address is less than another block address.
**************************************************************************/
FINLINE FLMBOOL FSAddrIsBelow(
FLMUINT uiAddress1,
FLMUINT uiAddress2)
{
if( FSGetFileNumber( uiAddress1) == FSGetFileNumber( uiAddress2))
{
if( FSGetFileOffset( uiAddress1) >= FSGetFileOffset( uiAddress2))
{
return FALSE;
}
}
else if( FSGetFileNumber( uiAddress1) > FSGetFileNumber( uiAddress2))
{
return FALSE;
}
return TRUE;
}
/**************************************************************************
Desc: Returns TRUE if a block address is less than or equal another
block address.
**************************************************************************/
FINLINE FLMBOOL FSAddrIsAtOrBelow(
FLMUINT uiAddress1,
FLMUINT uiAddress2)
{
if( FSGetFileNumber( uiAddress1) == FSGetFileNumber( uiAddress2))
{
if( FSGetFileOffset( uiAddress1) > FSGetFileOffset( uiAddress2))
{
return FALSE;
}
}
else if( FSGetFileNumber( uiAddress1) > FSGetFileNumber( uiAddress2))
{
return FALSE;
}
return TRUE;
}
/****************************************************************************
Desc: Get the total bytes represented by a particular block address.
****************************************************************************/
FINLINE FLMUINT64 FSGetSizeInBytes(
FLMUINT uiMaxFileSize,
FLMUINT uiBlkAddress)
{
FLMUINT uiFileNum;
FLMUINT uiFileOffset;
FLMUINT64 ui64Size;
uiFileNum = FSGetFileNumber( uiBlkAddress);
uiFileOffset = FSGetFileOffset( uiBlkAddress);
if( uiFileNum > 1)
{
ui64Size = (FLMUINT64)(((FLMUINT64)uiFileNum - (FLMUINT64)1) *
(FLMUINT64)uiMaxFileSize +
(FLMUINT64)uiFileOffset);
}
else
{
ui64Size = (FLMUINT64)uiFileOffset;
}
return( ui64Size);
}
/**************************************************************************
Desc: Calculate the significant bits in a block size.
**************************************************************************/
FINLINE FLMUINT calcSigBits(
FLMUINT uiBlockSize
)
{
FLMUINT uiSigBitsInBlkSize = 0;
while (!(uiBlockSize & 1))
{
uiSigBitsInBlkSize++;
uiBlockSize >>= 1;
}
return( uiSigBitsInBlkSize);
}
/**************************************************************************
Desc: Outputs an update event callback.
**************************************************************************/
FINLINE void flmTransEventCallback(
eEventType eEventType,
F_Db * pDb,
RCODE rc,
FLMUINT64 ui64TransId)
{
flmDoEventCallback( SFLM_EVENT_UPDATES, eEventType, pDb,
f_threadId(), ui64TransId, 0, 0, rc);
}
#endif // FILESYS_H