git-svn-id: https://svn.code.sf.net/p/flaim/code/trunk@482 0109f412-320b-0410-ab79-c3e0c5ffbbe6
412 lines
10 KiB
C
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
|
|
|