diff --git a/ftk/src/ftk.h b/ftk/src/ftk.h index 12faec1..689cc63 100644 --- a/ftk/src/ftk.h +++ b/ftk/src/ftk.h @@ -143,7 +143,9 @@ #elif defined( FLM_32BIT) #error Cannot define both FLM_32BIT and FLM_64BIT #endif - + + #define FSTATIC static + // Debug or release build? #ifndef FLM_DEBUG @@ -611,33 +613,6 @@ typedef RCODE (* F_THREAD_FUNC)(IF_Thread *); - /**************************************************************************** - Desc: DOM - ****************************************************************************/ - typedef enum - { - INVALID_NODE = 0x00, - DOCUMENT_NODE = 0x01, - ELEMENT_NODE = 0x02, - DATA_NODE = 0x03, - COMMENT_NODE = 0x04, - CDATA_SECTION_NODE = 0x05, - ANNOTATION_NODE = 0x06, - PROCESSING_INSTRUCTION_NODE = 0x07, - ATTRIBUTE_NODE = 0x08, - ANY_NODE_TYPE = 0xFFFF - } eDomNodeType; - - typedef enum - { - FLM_ROOT = 0, - FLM_FIRST_CHILD, - FLM_LAST_CHILD, - FLM_PREV_SIB, - FLM_NEXT_SIB, - FLM_ATTRIBUTE - } eNodeInsertLoc; - /**************************************************************************** Desc: Startup and shutdown ****************************************************************************/ @@ -703,7 +678,7 @@ virtual ~F_Base() { } - + void * operator new( FLMSIZET uiSize, const char * pszFile, @@ -728,6 +703,72 @@ int line); }; + /**************************************************************************** + Desc: Internal base class + ****************************************************************************/ + class F_OSBase + { + public: + + F_OSBase() + { + m_refCnt = 1; + } + + virtual ~F_OSBase() + { + } + + void * operator new( + FLMSIZET uiSize, + const char * pszFile, + int iLine); + + void * operator new[]( + FLMSIZET uiSize, + const char * pszFile, + int iLine); + + void operator delete( + void * ptr); + + void operator delete( + void * ptr, + const char * file, + int line); + + void operator delete[]( + void * ptr, + const char * file, + int line); + + virtual FINLINE FLMINT FLMAPI AddRef( void) + { + return( ++m_refCnt); + } + + virtual FINLINE FLMINT FLMAPI Release( void) + { + FLMINT iRefCnt = --m_refCnt; + + if( !iRefCnt) + { + delete this; + } + + return( iRefCnt); + } + + FINLINE FLMUINT getRefCount( void) + { + return( m_refCnt); + } + + protected: + + FLMATOMIC m_refCnt; + }; + /**************************************************************************** Desc: Errors ****************************************************************************/ @@ -834,7 +875,16 @@ RCODE FLMAPI FlmAllocBufferIStream( IF_BufferIStream ** ppIStream); + + RCODE FLMAPI FlmAllocBase64EncoderIStream( + IF_IStream * pSourceIStream, + FLMBOOL bLineBreaks, + IF_IStream ** ppIStream); + RCODE FLMAPI FlmAllocBase64DecoderIStream( + IF_IStream * pSourceIStream, + IF_IStream ** ppIStream); + /**************************************************************************** Desc: ****************************************************************************/ @@ -1004,6 +1054,37 @@ RCODE FLMAPI FlmGetFileSystem( IF_FileSystem ** ppFileSystem); + /*************************************************************************** + Desc: + ***************************************************************************/ + flminterface IF_FileHdlMgr : public F_RefCount + { + virtual void FLMAPI setOpenThreshold( + FLMUINT uiOpenThreshold) = 0; + + virtual void FLMAPI setMaxAvailTime( + FLMUINT uiMaxAvailTime) = 0; + + virtual FLMUINT FLMAPI getUniqueId( void) = 0; + + virtual void FLMAPI findAvail( + FLMUINT uiFileId, + FLMBOOL bReadOnlyFlag, + IF_FileHdl ** ppFileHdl) = 0; + + virtual void FLMAPI removeFileHdls( + FLMUINT uiFileId) = 0; + + virtual void FLMAPI checkAgedFileHdls( + FLMUINT uiMinSecondsOpened) = 0; + + virtual FLMUINT FLMAPI getOpenThreshold( void) = 0; + + virtual FLMUINT FLMAPI getOpenedFiles( void) = 0; + + virtual FLMUINT FLMAPI getMaxAvailTime( void) = 0; + }; + /**************************************************************************** Desc: ****************************************************************************/ @@ -1065,7 +1146,16 @@ virtual void FLMAPI setBlockSize( FLMUINT uiBlockSize) = 0; + virtual FLMUINT FLMAPI getBlockSize( void) = 0; + + virtual FLMUINT FLMAPI getSectorSize( void) = 0; + virtual FLMBOOL FLMAPI isReadOnly( void) = 0; + + virtual void FLMAPI setFileId( + FLMUINT uiFileId) = 0; + + virtual FLMUINT FLMAPI getFileId( void) = 0; }; /**************************************************************************** @@ -1140,6 +1230,9 @@ virtual FLMBOOL FLMAPI haveUsed( void) = 0; }; + + RCODE FLMAPI FlmAllocIOBufferMgr( + IF_IOBufferMgr ** ppBufferMgr); /**************************************************************************** Desc: @@ -1305,6 +1398,85 @@ virtual RCODE FLMAPI flushToFile( void) = 0; }; + + RCODE FLMAPI FlmAllocResultSet( + IF_ResultSet ** ppResultSet); + + /***************************************************************************** + Desc: + *****************************************************************************/ + flminterface IF_BtResultSet : public F_RefCount + { + virtual RCODE FLMAPI setupResultSet( + const char * pszPath, + IF_ResultSetCompare * pCompare) = 0; + + virtual void FLMAPI setSortStatus( + IF_ResultSetSortStatus * pSortStatus) = 0; + + virtual RCODE FLMAPI addEntry( + FLMBYTE * pucKey, + FLMUINT uiKeyLength, + FLMBYTE * pucEntry, + FLMUINT uiEntryLength) = 0; + + virtual RCODE FLMAPI modifyEntry( + FLMBYTE * pucKey, + FLMUINT uiKeyLength, + FLMBYTE * pucEntry, + FLMUINT uiEntryLength) = 0; + + virtual RCODE FLMAPI getCurrent( + FLMBYTE * pucKey, + FLMUINT uiKeyLength, + FLMBYTE * pucEntry, + FLMUINT uiEntryLength, + FLMUINT * puiReturnLength) = 0; + + virtual RCODE FLMAPI getNext( + FLMBYTE * pucKey, + FLMUINT uiKeyBufLen, + FLMUINT * puiKeylen, + FLMBYTE * pucBuffer, + FLMUINT uiBufferLength, + FLMUINT * puiReturnLength) = 0; + + virtual RCODE FLMAPI getPrev( + FLMBYTE * pucKey, + FLMUINT uiKeyBufLen, + FLMUINT * puiKeylen, + FLMBYTE * pucBuffer, + FLMUINT uiBufferLength, + FLMUINT * puiReturnLength) = 0; + + virtual RCODE FLMAPI getFirst( + FLMBYTE * pucKey, + FLMUINT uiKeyBufLen, + FLMUINT * puiKeylen, + FLMBYTE * pucBuffer, + FLMUINT uiBufferLength, + FLMUINT * puiReturnLength) = 0; + + virtual RCODE FLMAPI getLast( + FLMBYTE * pucKey, + FLMUINT uiKeyBufLen, + FLMUINT * puiKeylen, + FLMBYTE * pucBuffer, + FLMUINT uiBufferLength, + FLMUINT * puiReturnLength) = 0; + + virtual RCODE FLMAPI findEntry( + FLMBYTE * pucKey, + FLMUINT uiKeyBufLen, + FLMUINT * puiKeylen, + FLMBYTE * pucBuffer, + FLMUINT uiBufferLength, + FLMUINT * puiReturnLength) = 0; + + virtual RCODE FLMAPI deleteEntry( + FLMBYTE * pucKey, + FLMUINT uiKeyLength) = 0; + }; /**************************************************************************** Desc: Pool memory allocator @@ -1384,7 +1556,7 @@ virtual FLMINT32 FLMAPI getSeed( void) = 0; - virtual FLMINT32 FLMAPI getInt32( + virtual FLMINT32 FLMAPI getINT32( FLMINT32 i32Low = FLM_MIN_INT32, FLMINT32 i32High = FLM_MAX_INT32) = 0; @@ -2019,7 +2191,7 @@ return( ui64Val); } - FINLINE void f_UIN16ToByte( + FINLINE void f_UINT16ToByte( FLMUINT16 ui16Num, FLMBYTE * pucBuf) { @@ -2027,7 +2199,7 @@ pucBuf[ 1] = (FLMBYTE) (ui16Num); } - FINLINE void f_UIN32ToByte( + FINLINE void f_UINT32ToByte( FLMUINT32 ui32Num, FLMBYTE * pucBuf) { @@ -2037,7 +2209,7 @@ pucBuf[ 3] = (FLMBYTE) (ui32Num); } - FINLINE void f_UIN64ToByte( + FINLINE void f_UINT64ToByte( FLMUINT64 ui64Num, FLMBYTE * pucBuf) { @@ -2147,6 +2319,20 @@ (*((FLMUINT64 *)(fbp)) = ((FLMUINT64) (uw))) #endif + + #ifdef FLM_BIG_ENDIAN + #define LO( wrd) \ + (*((FLMUINT8 *)&wrd + 1)) + + #define HI( wrd) \ + (*(FLMUINT8 *)&wrd) + #else + #define LO(wrd) \ + (*(FLMUINT8 *)&wrd) + + #define HI(wrd) \ + (*((FLMUINT8 *)&wrd + 1)) + #endif /**************************************************************************** Desc: File path functions and macros @@ -2254,7 +2440,25 @@ { return( uiSeconds + f_timeGetLocalOffset()); } + + FLMUINT FLMAPI FLM_GET_TIMER( void); + + FLMUINT FLMAPI FLM_ELAPSED_TIME( + FLMUINT uiLaterTime, + FLMUINT uiEarlierTime); + FLMUINT FLMAPI FLM_SECS_TO_TIMER_UNITS( + FLMUINT uiSeconds); + + FLMUINT FLMAPI FLM_TIMER_UNITS_TO_SECS( + FLMUINT uiTU); + + FLMUINT FLM_TIMER_UNITS_TO_MILLI( + FLMUINT uiTU); + + FLMUINT FLM_MILLI_TO_TIMER_UNITS( + FLMUINT uiMilliSeconds); + /**************************************************************************** Desc: Quick sort ****************************************************************************/ @@ -2428,7 +2632,7 @@ int iLine); #define f_alloc(s,p) \ - f_allocImp( (s), (void **)p, FALSE, __FILE__, __LINE__) + f_allocImp( (s), (void **)(p), FALSE, __FILE__, __LINE__) RCODE FLMAPI f_callocImp( FLMUINT uiSize, @@ -2437,7 +2641,7 @@ int iLine); #define f_calloc(s,p) \ - f_callocImp( (s), (void **)p, __FILE__, __LINE__) + f_callocImp( (s), (void **)(p), __FILE__, __LINE__) RCODE FLMAPI f_reallocImp( FLMUINT uiSize, @@ -2446,7 +2650,7 @@ int iLine); #define f_realloc(s,p) \ - f_reallocImp( (s), (void **)p, __FILE__, __LINE__) + f_reallocImp( (s), (void **)(p), __FILE__, __LINE__) RCODE FLMAPI f_recallocImp( FLMUINT uiSize, @@ -2455,7 +2659,7 @@ int iLine); #define f_recalloc(s,p) \ - f_recallocImp( (s), (void **)p, __FILE__, __LINE__) + f_recallocImp( (s), (void **)(p), __FILE__, __LINE__) #define f_new \ new( __FILE__, __LINE__) @@ -2465,7 +2669,25 @@ FLMBOOL bFromDelOp); #define f_free(p) \ - f_freeImp( (void **)p, FALSE) + f_freeImp( (void **)(p), FALSE) + + void f_resetStackInfoImp( + void * pvPtr, + const char * pszFileName, + int iLineNumber); + + #define f_resetStackInfo(p) \ + f_resetStackInfoImp( (p), __FILE__, __LINE__) + + FLMUINT f_msize( + void * pvPtr); + + RCODE FLMAPI f_allocAlignedBuffer( + FLMUINT uiMinSize, + void ** ppvAlloc); + + void FLMAPI f_freeAlignedBuffer( + void ** ppvAlloc); /**************************************************************************** Desc: Logging @@ -2700,6 +2922,9 @@ virtual FLMUINT FLMAPI availSlabs( void) = 0; }; + + RCODE FLMAPI FlmAllocSlabManager( + IF_SlabManager ** ppSlabManager); /**************************************************************************** Desc: Class to provide an efficient means of providing many allocations @@ -2766,6 +2991,8 @@ FLMUINT uiSize, FLMBYTE * pucBuffer) = 0; + virtual FLMUINT FLMAPI getMaxCellSize( void) = 0; + virtual void FLMAPI defragmentMemory( void) = 0; }; @@ -2799,11 +3026,155 @@ virtual FLMUINT FLMAPI getTrueSize( FLMBYTE * pucBuffer) = 0; + virtual FLMUINT FLMAPI getMaxCellSize( void) = 0; + virtual void FLMAPI lockMutex( void) = 0; virtual void FLMAPI unlockMutex( void) = 0; }; + /**************************************************************************** + Desc: B-Tree + ****************************************************************************/ + + flminterface IF_Btree : public F_RefCount + { + virtual RCODE FLMAPI btCreate( + IF_BlockMgr * pBlockMgr, + FLMUINT16 ui16BtreeId, + FLMBOOL bCounts, + FLMBOOL bData, + FLMUINT * puiRootBlkAddr) = 0; + + virtual RCODE FLMAPI btOpen( + IF_BlockMgr * pBlockMgr, + FLMUINT uiRootBlkAddr, + FLMBOOL bCounts, + FLMBOOL bData, + IF_ResultSetCompare * pCompare = NULL) = 0; + + virtual void FLMAPI btClose( void) = 0; + + virtual RCODE FLMAPI btDeleteTree( + IF_DeleteStatus * ifpDeleteStatus) = 0; + + virtual RCODE FLMAPI btGetBlockChains( + FLMUINT * puiBlockChains, + FLMUINT * puiNumLevels) = 0; + + virtual RCODE FLMAPI btRemoveEntry( + const FLMBYTE * pucKey, + FLMUINT uiKeyBufSize, + FLMUINT uiKeyLen) = 0; + + virtual RCODE FLMAPI btInsertEntry( + const FLMBYTE * pucKey, + FLMUINT uiKeyBufSize, + FLMUINT uiKeyLen, + const FLMBYTE * pucData, + FLMUINT uiDataLen, + FLMBOOL bFirst, + FLMBOOL bLast, + FLMUINT32 * pui32BlkAddr = NULL, + FLMUINT * puiOffsetIndex = NULL) = 0; + + virtual RCODE FLMAPI btReplaceEntry( + const FLMBYTE * pucKey, + FLMUINT uiKeyBufSize, + FLMUINT uiKeyLen, + const FLMBYTE * pucData, + FLMUINT uiDataLen, + FLMBOOL bFirst, + FLMBOOL bLast, + FLMBOOL bTruncate = TRUE, + FLMUINT32 * pui32BlkAddr = NULL, + FLMUINT * puiOffsetIndex = NULL) = 0; + + virtual RCODE FLMAPI btLocateEntry( + FLMBYTE * pucKey, + FLMUINT uiKeyBufSize, + FLMUINT * puiKeyLen, + FLMUINT uiMatch, + FLMUINT * puiPosition = NULL, + FLMUINT * puiDataLength = NULL, + FLMUINT32 * pui32BlkAddr = NULL, + FLMUINT * puiOffsetIndex = NULL) = 0; + + virtual RCODE FLMAPI btGetEntry( + FLMBYTE * pucKey, + FLMUINT uiKeyLen, + FLMBYTE * pucData, + FLMUINT uiDataBufSize, + FLMUINT * puiDataLen) = 0; + + virtual RCODE FLMAPI btNextEntry( + FLMBYTE * pucKey, + FLMUINT uiKeyBufSize, + FLMUINT * puiKeyLen, + FLMUINT * puiDataLength = NULL, + FLMUINT32 * pui32BlkAddr = NULL, + FLMUINT * puiOffsetIndex = NULL) = 0; + + virtual RCODE FLMAPI btPrevEntry( + FLMBYTE * pucKey, + FLMUINT uiKeyBufSize, + FLMUINT * puiKeyLen, + FLMUINT * puiDataLength = NULL, + FLMUINT32 * pui32BlkAddr = NULL, + FLMUINT * puiOffsetIndex = NULL) = 0; + + virtual RCODE FLMAPI btFirstEntry( + FLMBYTE * pucKey, + FLMUINT uiKeyBufSize, + FLMUINT * puiKeyLen, + FLMUINT * puiDataLength = NULL, + FLMUINT32 * pui32BlkAddr = NULL, + FLMUINT * puiOffsetIndex = NULL) = 0; + + virtual RCODE FLMAPI btLastEntry( + FLMBYTE * pucKey, + FLMUINT uiKeyBufSize, + FLMUINT * puiKeyLen, + FLMUINT * puiDataLength = NULL, + FLMUINT32 * pui32BlkAddr = NULL, + FLMUINT * puiOffsetIndex = NULL) = 0; + + virtual RCODE FLMAPI btSetReadPosition( + FLMBYTE * pucKey, + FLMUINT uiKeyLen, + FLMUINT uiPosition) = 0; + + virtual RCODE FLMAPI btGetReadPosition( + FLMUINT * puiPosition) = 0; + + virtual RCODE FLMAPI btPositionTo( + FLMUINT uiPosition, + FLMBYTE * pucKey, + FLMUINT uiKeyBufSize, + FLMUINT * puiKeyLen) = 0; + + virtual RCODE FLMAPI btGetPosition( + FLMUINT * puiPosition) = 0; + + virtual RCODE FLMAPI btRewind( void) = 0; + + virtual RCODE FLMAPI btComputeCounts( + IF_Btree * pUntilBtree, + FLMUINT * puiBlkCount, + FLMUINT * puiKeyCount, + FLMBOOL * pbTotalsEstimated, + FLMUINT uiAvgBlkFullness) = 0; + + virtual FLMBOOL FLMAPI btHasCounts( void) = 0; + + virtual FLMBOOL FLMAPI btHasData( void) = 0; + + virtual void FLMAPI btResetBtree( void) = 0; + }; + + RCODE FLMAPI FlmAllocBtree( + IF_Btree ** ppBtree); + /**************************************************************************** Desc: Misc. ****************************************************************************/ @@ -3461,4 +3832,12 @@ #define NE_FLM_STREAM_TOO_MANY_FILES FTK_ERROR_BASE( 0x403) // Too many files in input stream. #define NE_FLM_LAST_STREAM_ERROR FTK_ERROR_BASE( 0x404) // NOTE: This is not an error code - do not document + /**************************************************************************** + Desc: Stream Errors + ****************************************************************************/ + + RCODE f_mapPlatformError( + FLMINT iError, + RCODE defaultRc); + #endif // FTK_H diff --git a/ftk/src/ftkbtree.cpp b/ftk/src/ftkbtree.cpp index 83f6889..94037ce 100644 --- a/ftk/src/ftkbtree.cpp +++ b/ftk/src/ftkbtree.cpp @@ -37,8 +37,6 @@ FSTATIC RCODE btGetEntryData( FLMUINT uiBufferSize, FLMUINT * puiLenDataRV); -#define FLM_MAX_KEY_SIZE 1024 - typedef struct FlmBlockHdrTag { FLMUINT32 ui32BlkAddr; @@ -78,8 +76,6 @@ typedef struct FlmBTreeBlkHdr FLMUINT16 ui16BtreeId; FLMUINT16 ui16NumKeys; FLMUINT8 ui8BlkLevel; - #define BH_MAX_LEVELS 8 - #define MAX_LEVELS BH_MAX_LEVELS FLMUINT8 ui8BTreeFlags; #define BLK_IS_ROOT 0x01 #define BLK_IS_INDEX 0x02 @@ -93,46 +89,6 @@ typedef struct FlmBTreeBlkHdr #define F_BTREE_BLK_HDR_ui8BTreeFlags_OFFSET 37 #define F_BTREE_BLK_HDR_ui16HeapSize_OFFSET 38 -enum BTREE_ERR_TYPE -{ - NO_ERR = 0, // FYI: Visual Studio already defines NOERROR - BT_HEADER, - KEY_ORDER, - DUPLICATE_KEYS, - INFINITY_MARKER, - CHILD_BLOCK_ADDRESS, - SCA_GET_BLOCK_FAILED, - MISSING_OVERALL_DATA_LENGTH, - NOT_DATA_ONLY_BLOCK, - BAD_DO_BLOCK_LENGTHS, - BAD_COUNTS, - CATASTROPHIC_FAILURE = 999 -}; - -typedef struct -{ - FLMUINT uiKeyCnt; - FLMUINT uiFirstKeyCnt; - FLMUINT uiBlkCnt; - FLMUINT uiBytesUsed; - FLMUINT uiDOBlkCnt; - FLMUINT uiDOBytesUsed; -} BTREE_LEVEL_STATS; - -typedef struct -{ - FLMUINT uiBlkAddr; - FLMUINT uiBlockSize; - FLMUINT uiBlocksChecked; - FLMUINT uiAvgFreeSpace; - FLMUINT uiLevels; - FLMUINT uiNumKeys; - FLMUINT64 ui64FreeSpace; - BTREE_LEVEL_STATS LevelStats[ BH_MAX_LEVELS]; - char szMsg[ 64]; - BTREE_ERR_TYPE type; -} BTREE_ERR_STRUCT; - typedef struct { FLMUINT uiParentLevel; @@ -170,6 +126,47 @@ typedef enum ELM_DONE } F_ELM_UPD_ACTION; +enum BTREE_ERR_TYPE +{ + NO_ERR = 0, + BT_HEADER, + KEY_ORDER, + DUPLICATE_KEYS, + INFINITY_MARKER, + CHILD_BLOCK_ADDRESS, + SCA_GET_BLOCK_FAILED, + MISSING_OVERALL_DATA_LENGTH, + NOT_DATA_ONLY_BLOCK, + BAD_DO_BLOCK_LENGTHS, + BAD_COUNTS, + CATASTROPHIC_FAILURE = 999 +}; + +typedef struct +{ + FLMUINT uiKeyCnt; + FLMUINT uiFirstKeyCnt; + FLMUINT uiBlkCnt; + FLMUINT uiBytesUsed; + FLMUINT uiDOBlkCnt; + FLMUINT uiDOBytesUsed; +} BTREE_LEVEL_STATS; + +typedef struct +{ + FLMUINT uiBlkAddr; + FLMUINT uiBlockSize; + FLMUINT uiBlocksChecked; + FLMUINT uiAvgFreeSpace; + FLMUINT uiLevels; + FLMUINT uiNumKeys; + FLMUINT64 ui64FreeSpace; +#define FLM_MAX_BTREE_LEVELS 8 + BTREE_LEVEL_STATS LevelStats[ FLM_MAX_BTREE_LEVELS]; + char szMsg[ 64]; + BTREE_ERR_TYPE type; +} BTREE_ERR_STRUCT; + // Represent the maximum size for data & key before needing two bytes to // store the length. @@ -214,7 +211,7 @@ typedef enum /**************************************************************************** Desc: ****************************************************************************/ -class F_Btree : public F_RefCount, public F_Base +class F_Btree : public IF_Btree, public F_Base { public: @@ -222,36 +219,35 @@ public: virtual ~F_Btree( void); - RCODE btCreate( + RCODE FLMAPI btCreate( IF_BlockMgr * pBlockMgr, FLMUINT16 ui16BtreeId, FLMBOOL bCounts, FLMBOOL bData, FLMUINT * puiRootBlkAddr); - - RCODE btOpen( + RCODE FLMAPI btOpen( IF_BlockMgr * pBlockMgr, FLMUINT uiRootBlkAddr, FLMBOOL bCounts, FLMBOOL bData, IF_ResultSetCompare * pCompare = NULL); - void btClose( void); + void FLMAPI btClose( void); - RCODE btDeleteTree( + RCODE FLMAPI btDeleteTree( IF_DeleteStatus * ifpDeleteStatus); - RCODE btGetBlockChains( + RCODE FLMAPI btGetBlockChains( FLMUINT * puiBlockChains, FLMUINT * puiNumLevels); - RCODE btRemoveEntry( + RCODE FLMAPI btRemoveEntry( const FLMBYTE * pucKey, FLMUINT uiKeyBufSize, FLMUINT uiKeyLen); - RCODE btInsertEntry( + RCODE FLMAPI btInsertEntry( const FLMBYTE * pucKey, FLMUINT uiKeyBufSize, FLMUINT uiKeyLen, @@ -262,7 +258,7 @@ public: FLMUINT32 * pui32BlkAddr = NULL, FLMUINT * puiOffsetIndex = NULL); - RCODE btReplaceEntry( + RCODE FLMAPI btReplaceEntry( const FLMBYTE * pucKey, FLMUINT uiKeyBufSize, FLMUINT uiKeyLen, @@ -274,7 +270,7 @@ public: FLMUINT32 * pui32BlkAddr = NULL, FLMUINT * puiOffsetIndex = NULL); - RCODE btLocateEntry( + RCODE FLMAPI btLocateEntry( FLMBYTE * pucKey, FLMUINT uiKeyBufSize, FLMUINT * puiKeyLen, @@ -284,14 +280,14 @@ public: FLMUINT32 * pui32BlkAddr = NULL, FLMUINT * puiOffsetIndex = NULL); - RCODE btGetEntry( + RCODE FLMAPI btGetEntry( FLMBYTE * pucKey, FLMUINT uiKeyLen, FLMBYTE * pucData, FLMUINT uiDataBufSize, FLMUINT * puiDataLen); - RCODE btNextEntry( + RCODE FLMAPI btNextEntry( FLMBYTE * pucKey, FLMUINT uiKeyBufSize, FLMUINT * puiKeyLen, @@ -299,7 +295,7 @@ public: FLMUINT32 * pui32BlkAddr = NULL, FLMUINT * puiOffsetIndex = NULL); - RCODE btPrevEntry( + RCODE FLMAPI btPrevEntry( FLMBYTE * pucKey, FLMUINT uiKeyBufSize, FLMUINT * puiKeyLen, @@ -307,7 +303,7 @@ public: FLMUINT32 * pui32BlkAddr = NULL, FLMUINT * puiOffsetIndex = NULL); - RCODE btFirstEntry( + RCODE FLMAPI btFirstEntry( FLMBYTE * pucKey, FLMUINT uiKeyBufSize, FLMUINT * puiKeyLen, @@ -315,7 +311,7 @@ public: FLMUINT32 * pui32BlkAddr = NULL, FLMUINT * puiOffsetIndex = NULL); - RCODE btLastEntry( + RCODE FLMAPI btLastEntry( FLMBYTE * pucKey, FLMUINT uiKeyBufSize, FLMUINT * puiKeyLen, @@ -323,34 +319,43 @@ public: FLMUINT32 * pui32BlkAddr = NULL, FLMUINT * puiOffsetIndex = NULL); - RCODE btSetReadPosition( + RCODE FLMAPI btSetReadPosition( FLMBYTE * pucKey, FLMUINT uiKeyLen, FLMUINT uiPosition); - RCODE btGetReadPosition( + RCODE FLMAPI btGetReadPosition( FLMUINT * puiPosition); - RCODE btPositionTo( + RCODE FLMAPI btPositionTo( FLMUINT uiPosition, FLMBYTE * pucKey, FLMUINT uiKeyBufSize, FLMUINT * puiKeyLen); - RCODE btGetPosition( + RCODE FLMAPI btGetPosition( FLMUINT * puiPosition); - RCODE btCheck( - BTREE_ERR_STRUCT * pErrStruct); + RCODE FLMAPI btComputeCounts( + F_Btree * pUntilBtree, + FLMUINT * puiBlkCount, + FLMUINT * puiKeyCount, + FLMBOOL * pbTotalsEstimated, + FLMUINT uiAvgBlkFullness); - RCODE btRewind( void); + RCODE FLMAPI btRewind( void); - FINLINE void btRelease( void) + FINLINE FLMBOOL FLMAPI btHasCounts( void) { - releaseBlocks( TRUE); + return( m_bCounts); } - FINLINE void btResetBtree( void) + FINLINE FLMBOOL FLMAPI btHasData( void) + { + return( m_bData); + } + + FINLINE void FLMAPI btResetBtree( void) { releaseBlocks( TRUE); m_bSetupForRead = FALSE; @@ -368,20 +373,23 @@ public: m_uiDataRemaining = 0; m_uiOADataRemaining = 0; m_uiOffsetAtStart = 0; - m_uiSearchLevel = BH_MAX_LEVELS; + m_uiSearchLevel = FLM_MAX_BTREE_LEVELS; } - RCODE btComputeCounts( - F_Btree * pUntilBtree, - FLMUINT * puiBlkCount, - FLMUINT * puiKeyCount, - FLMBOOL * pbTotalsEstimated, - FLMUINT uiAvgBlkFullness); +private: + + RCODE btCheck( + BTREE_ERR_STRUCT * pErrStruct); + + FINLINE void btRelease( void) + { + releaseBlocks( TRUE); + } FINLINE void btSetSearchLevel( FLMUINT uiSearchLevel) { - f_assert( uiSearchLevel <= BH_MAX_LEVELS); + f_assert( uiSearchLevel <= FLM_MAX_BTREE_LEVELS); btResetBtree(); @@ -392,16 +400,6 @@ public: FLMUINT32 ui32FromBlkAddr, FLMUINT32 ui32ToBlkAddr); - FINLINE FLMBOOL btHasCounts( void) - { - return( m_bCounts); - } - - FINLINE FLMBOOL btHasData( void) - { - return( m_bData); - } - FINLINE FLMBOOL btDbIsOpen( void) { return( m_bOpened); @@ -422,8 +420,6 @@ public: return( m_bSetupForReplace); } -private: - RCODE btFreeBlockChain( FLMUINT uiStartAddr, FLMUINT uiBlocksToFree, @@ -947,7 +943,7 @@ private: FLMUINT32 m_ui32PrimaryBlkAddr; FLMUINT32 m_ui32DOBlkAddr; FLMUINT32 m_ui32CurBlkAddr; - F_BTSK m_Stack[ BH_MAX_LEVELS]; + F_BTSK m_Stack[ FLM_MAX_BTREE_LEVELS]; IF_ResultSetCompare * m_pCompare; }; @@ -1256,7 +1252,7 @@ F_Btree::F_Btree( void) m_bFirstRead = FALSE; m_pBlock = NULL; m_pBlkHdr = NULL; - m_uiSearchLevel = BH_MAX_LEVELS; + m_uiSearchLevel = FLM_MAX_BTREE_LEVELS; m_pCompare = NULL; } @@ -1405,7 +1401,7 @@ RCODE F_Btree::btOpen( m_bData = bData; m_pReplaceInfo = NULL; m_uiReplaceLevels = 0; - m_uiSearchLevel = BH_MAX_LEVELS; + m_uiSearchLevel = FLM_MAX_BTREE_LEVELS; m_bSetupForRead = FALSE; m_bSetupForWrite = FALSE; @@ -1419,7 +1415,7 @@ RCODE F_Btree::btOpen( m_pPool->poolInit( m_uiBlockSize); if( RC_BAD( rc = m_pPool->poolAlloc( - sizeof( BTREE_REPLACE_STRUCT) * BH_MAX_LEVELS, + sizeof( BTREE_REPLACE_STRUCT) * FLM_MAX_BTREE_LEVELS, (void **)&m_pReplaceStruct))) { goto Exit; @@ -1450,7 +1446,7 @@ void F_Btree::btClose() return; } - for (uiLoop = 0; uiLoop < BH_MAX_LEVELS; uiLoop++) + for (uiLoop = 0; uiLoop < FLM_MAX_BTREE_LEVELS; uiLoop++) { m_Stack[ uiLoop].pucKeyBuf = NULL; m_Stack[ uiLoop].uiKeyBufSize = 0; @@ -1495,7 +1491,7 @@ RCODE F_Btree::btDeleteTree( { RCODE rc = NE_FLM_OK; FLMUINT uiNumLevels; - FLMUINT puiBlkAddrs[ BH_MAX_LEVELS]; + FLMUINT puiBlkAddrs[ FLM_MAX_BTREE_LEVELS]; FLMUINT uiLoop; f_assert( m_bOpened); @@ -1660,7 +1656,7 @@ Exit: /*************************************************************************** Desc: Returns the address of the first block at each level of the tree Note: puiBlockAddrs is assumed to point to a buffer that can store - BH_MAX_LEVELS FLMUINT values + FLM_MAX_BTREE_LEVELS FLMUINT values ****************************************************************************/ RCODE F_Btree::btGetBlockChains( FLMUINT * puiBlockAddrs, @@ -1748,7 +1744,7 @@ RCODE F_Btree::btInsertEntry( goto Exit; } - f_assert( m_uiSearchLevel >= BH_MAX_LEVELS); + f_assert( m_uiSearchLevel >= FLM_MAX_BTREE_LEVELS); if( !uiKeyLen) { @@ -1962,7 +1958,7 @@ RCODE F_Btree::btReplaceEntry( goto Exit; } - f_assert( m_uiSearchLevel >= BH_MAX_LEVELS); + f_assert( m_uiSearchLevel >= FLM_MAX_BTREE_LEVELS); if (!uiKeyLen) { @@ -2260,7 +2256,7 @@ Desc: Method to get the data after a call to btLocateEntry, btNextEntry, ****************************************************************************/ RCODE F_Btree::btGetEntry( FLMBYTE * pucKey, - FLMUINT uiKeyLen, + FLMUINT uiKeyLen, FLMBYTE * pucData, FLMUINT uiDataBufSize, FLMUINT * puiDataLen) @@ -2306,7 +2302,6 @@ RCODE F_Btree::btGetEntry( if( !m_bDataOnlyBlock) { pucEntry = BtEntry( (FLMBYTE *)pBlkHdr, m_uiCurOffset); - btGetEntryDataLength( pucEntry, &m_pucDataPtr, NULL, NULL); } else @@ -2338,7 +2333,7 @@ RCODE F_Btree::btGetEntry( { goto Exit; } - + // Mark that we have completed our first read operation. // No more read synchronization allowed. @@ -3372,7 +3367,7 @@ Desc: Function to create a new level in the Btree. of the root block into it. It will then insert a single entry into the root block to point to the new child. - Note that there is a maximum of BH_MAX_LEVELS levels to the Btree. + Note that there is a maximum of FLM_MAX_BTREE_LEVELS levels to the Btree. Any effort to exceed that level will result in an error. ****************************************************************************/ RCODE F_Btree::createNewLevel( void) @@ -3397,7 +3392,7 @@ RCODE F_Btree::createNewLevel( void) // Check the root level - if( m_pStack->uiLevel >= BH_MAX_LEVELS - 1) + if( m_pStack->uiLevel >= FLM_MAX_BTREE_LEVELS - 1) { rc = RC_SET_AND_ASSERT( NE_FLM_BTREE_FULL); goto Exit; @@ -5796,7 +5791,7 @@ RCODE F_Btree::findEntry( { if( m_bCounts && puiPosition) { - f_assert( m_uiSearchLevel >= BH_MAX_LEVELS); + f_assert( m_uiSearchLevel >= FLM_MAX_BTREE_LEVELS); *puiPosition = uiPrevCounts + pStack->uiCurOffset; } @@ -5985,7 +5980,7 @@ GotEntry: if( m_bCounts && puiPosition) { - f_assert( m_uiSearchLevel >= BH_MAX_LEVELS); + f_assert( m_uiSearchLevel >= FLM_MAX_BTREE_LEVELS); *puiPosition = pStack->uiCurOffset; } @@ -8594,7 +8589,7 @@ RCODE F_Btree::saveReplaceInfo( const FLMBYTE * pucParentKey; FLMBYTE * pucEntry; - if( m_uiReplaceLevels + 1 >= BH_MAX_LEVELS) + if( m_uiReplaceLevels + 1 >= FLM_MAX_BTREE_LEVELS) { rc = RC_SET_AND_ASSERT( NE_FLM_BTREE_ERROR); goto Exit; @@ -8762,7 +8757,7 @@ FINLINE RCODE F_Btree::setReturnKey( FLMUINT uiKeyLen; const FLMBYTE * pucKeyRV; - uiKeyLen = getEntryKeyLength( pucEntry, uiBlockType, &pucKeyRV); + uiKeyLen = getEntryKeyLength( pucEntry, uiBlockType, &pucKeyRV); if( uiKeyLen == 0) { @@ -11006,7 +11001,7 @@ RCODE F_Btree::btMoveBlock( goto Exit; } - f_assert( m_uiSearchLevel >= BH_MAX_LEVELS); + f_assert( m_uiSearchLevel >= FLM_MAX_BTREE_LEVELS); // Get the From block and retrieve the last key in the block. Make note // of the level of the block. We will need this to make sure we get the diff --git a/ftk/src/ftkdir.cpp b/ftk/src/ftkdir.cpp index 90dc73a..f160a85 100644 --- a/ftk/src/ftkdir.cpp +++ b/ftk/src/ftkdir.cpp @@ -330,14 +330,14 @@ RCODE FLMAPI F_DirHdl::createDir( if( !CreateDirectory((LPTSTR)pszDirPath, NULL)) { - rc = MapPlatformError( GetLastError(), NE_FLM_CREATING_FILE); + rc = f_mapPlatformError( GetLastError(), NE_FLM_CREATING_FILE); } #elif defined( FLM_UNIX) || defined( FLM_NLM) if( mkdir( (char *)pszDirPath, 0777) == -1) { - rc = MapPlatformError( errno, NE_FLM_CREATING_FILE); + rc = f_mapPlatformError( errno, NE_FLM_CREATING_FILE); } #endif @@ -363,7 +363,7 @@ RCODE FLMAPI F_DirHdl::removeDir( if( !RemoveDirectory((LPTSTR)pszDirName)) { - return( MapPlatformError( GetLastError(), NE_FLM_IO_DELETING_FILE)); + return( f_mapPlatformError( GetLastError(), NE_FLM_IO_DELETING_FILE)); } return( NE_FLM_OK); @@ -372,7 +372,7 @@ RCODE FLMAPI F_DirHdl::removeDir( if( rmdir( (char *)pszDirName) == -1) { - return( MapPlatformError( errno, NE_FLM_IO_DELETING_FILE)); + return( f_mapPlatformError( errno, NE_FLM_IO_DELETING_FILE)); } return( NE_FLM_OK); @@ -422,7 +422,7 @@ RCODE f_fileFindFirst( if( (pFindData->findHandle = FindFirstFile( (LPTSTR)szTmpPath, &(pFindData->findBuffer))) == INVALID_HANDLE_VALUE) { - rc = MapPlatformError( GetLastError(), NE_FLM_OPENING_FILE); + rc = f_mapPlatformError( GetLastError(), NE_FLM_OPENING_FILE); goto Exit; } @@ -438,7 +438,7 @@ RCODE f_fileFindFirst( if( FindNextFile( pFindData->findHandle, &(pFindData->findBuffer)) == FALSE) { - rc = MapPlatformError( GetLastError(), NE_FLM_READING_FILE); + rc = f_mapPlatformError( GetLastError(), NE_FLM_READING_FILE); goto Exit; } } @@ -512,7 +512,7 @@ Exit: } else { - rc = MapPlatformError( errno, NE_FLM_READING_FILE); + rc = f_mapPlatformError( errno, NE_FLM_READING_FILE); } goto Exit; @@ -538,7 +538,7 @@ Exit: } else { - rc = MapPlatformError( errno, NE_FLM_READING_FILE); + rc = f_mapPlatformError( errno, NE_FLM_READING_FILE); } goto Exit; @@ -585,7 +585,7 @@ RCODE f_fileFindNext( if( FindNextFile( pFindData->findHandle, &(pFindData->findBuffer)) == FALSE) { - rc = MapPlatformError( GetLastError(), NE_FLM_READING_FILE); + rc = f_mapPlatformError( GetLastError(), NE_FLM_READING_FILE); goto Exit; } @@ -601,7 +601,7 @@ RCODE f_fileFindNext( if( FindNextFile( pFindData->findHandle, &(pFindData->findBuffer)) == FALSE) { - rc = MapPlatformError( GetLastError(), NE_FLM_READING_FILE); + rc = f_mapPlatformError( GetLastError(), NE_FLM_READING_FILE); goto Exit; } } @@ -635,7 +635,7 @@ RCODE f_fileFindNext( return( RC_SET( NE_FLM_IO_NO_MORE_FILES)); } - return( MapPlatformError( errno, NE_FLM_READING_FILE)); + return( f_mapPlatformError( errno, NE_FLM_READING_FILE)); } // Append the file name to the path name diff --git a/ftk/src/ftkerror.cpp b/ftk/src/ftkerror.cpp index 3b5944f..75bef6e 100644 --- a/ftk/src/ftkerror.cpp +++ b/ftk/src/ftkerror.cpp @@ -291,7 +291,7 @@ const char * FLMAPI f_errorString( Desc: Map POSIX errno to Flaim IO errors. ***************************************************************************/ #if defined( FLM_UNIX) || defined( FLM_NLM) -RCODE MapPlatformError( +RCODE f_mapPlatformError( FLMINT iError, RCODE defaultRc) { @@ -359,7 +359,7 @@ RCODE MapPlatformError( Desc: ***************************************************************************/ #ifdef FLM_WIN -RCODE MapPlatformError( +RCODE f_mapPlatformError( FLMINT iErrCode, RCODE defaultRc) { diff --git a/ftk/src/ftkfsys.cpp b/ftk/src/ftkfsys.cpp index b4aa9c9..14d46f5 100644 --- a/ftk/src/ftkfsys.cpp +++ b/ftk/src/ftkfsys.cpp @@ -25,10 +25,14 @@ #include "ftksys.h" +#define FHM_AVAIL_LIST 0 +#define FHM_USED_LIST 1 +#define FHM_LNODE_COUNT 2 + /**************************************************************************** Desc: ****************************************************************************/ -FINLINE void HexToNative( +FINLINE void f_hexToNative( FLMBYTE ucHexVal, char * pszNativeChar) { @@ -40,7 +44,7 @@ FINLINE void HexToNative( /**************************************************************************** Desc: ****************************************************************************/ -FINLINE void SetUpTime( +FINLINE void f_setupTime( FLMUINT * puiBaseTime, FLMBYTE * pbyHighByte) { @@ -746,7 +750,7 @@ RCODE FLMAPI F_FileSystem::doesFileExist( if( access( pszPath, F_OK) == -1) { - return( MapPlatformError( errno, NE_FLM_CHECKING_FILE_EXISTENCE)); + return( f_mapPlatformError( errno, NE_FLM_CHECKING_FILE_EXISTENCE)); } return( NE_FLM_OK); @@ -787,7 +791,7 @@ RCODE FLMAPI F_FileSystem::getFileTimeStamp( hSearch = FindFirstFile( (LPTSTR)pszPath, &find_data); if( hSearch == INVALID_HANDLE_VALUE) { - rc = MapPlatformError( GetLastError(), NE_FLM_OPENING_FILE); + rc = f_mapPlatformError( GetLastError(), NE_FLM_OPENING_FILE); switch( rc) { case NE_FLM_IO_NO_MORE_FILES: @@ -795,7 +799,7 @@ RCODE FLMAPI F_FileSystem::getFileTimeStamp( goto Exit; default: goto Exit; - } /* End switch. */ + } } // Convert it to a local time, so we can adjust based on our own @@ -804,7 +808,7 @@ RCODE FLMAPI F_FileSystem::getFileTimeStamp( if( FileTimeToLocalFileTime( &(find_data.ftLastWriteTime), &ftLocalFileTime) == FALSE) { - rc = MapPlatformError( GetLastError(), NE_FLM_OPENING_FILE); + rc = f_mapPlatformError( GetLastError(), NE_FLM_OPENING_FILE); goto Exit; } @@ -814,7 +818,7 @@ RCODE FLMAPI F_FileSystem::getFileTimeStamp( if( FileTimeToSystemTime( &ftLocalFileTime, &stLastFileWriteTime) == FALSE) { - rc = MapPlatformError( GetLastError(), NE_FLM_OPENING_FILE); + rc = f_mapPlatformError( GetLastError(), NE_FLM_OPENING_FILE); goto Exit; } @@ -854,7 +858,7 @@ Exit: if( stat( pszPath, &filestatus) == -1) { - return( MapPlatformError( errno, NE_FLM_GETTING_FILE_INFO)); + return( f_mapPlatformError( errno, NE_FLM_GETTING_FILE_INFO)); } *puiTimeStamp = (FLMUINT)filestatus.st_mtime; // st_mtime is UTC @@ -907,7 +911,7 @@ RCODE FLMAPI F_FileSystem::deleteFile( if( DeleteFile( (LPTSTR)pszFileName) == FALSE) { - return( MapPlatformError( GetLastError(), NE_FLM_IO_DELETING_FILE)); + return( f_mapPlatformError( GetLastError(), NE_FLM_IO_DELETING_FILE)); } return( NE_FLM_OK); @@ -918,7 +922,7 @@ RCODE FLMAPI F_FileSystem::deleteFile( if( stat( (char *)pszFileName, &FileStat) == -1) { - return( MapPlatformError( errno, NE_FLM_GETTING_FILE_INFO)); + return( f_mapPlatformError( errno, NE_FLM_GETTING_FILE_INFO)); } // Ensure that the path does NOT designate a directory for deletion @@ -932,7 +936,7 @@ RCODE FLMAPI F_FileSystem::deleteFile( if( unlink( (char *)pszFileName) == -1) { - return( MapPlatformError( errno, NE_FLM_IO_DELETING_FILE)); + return( f_mapPlatformError( errno, NE_FLM_IO_DELETING_FILE)); } return( NE_FLM_OK); @@ -1065,7 +1069,7 @@ RCODE FLMAPI F_FileSystem::renameFile( } break; default: - rc = MapPlatformError( error, NE_FLM_RENAMING_FILE); + rc = f_mapPlatformError( error, NE_FLM_RENAMING_FILE); break; } } @@ -1115,7 +1119,7 @@ RCODE FLMAPI F_FileSystem::renameFile( } else { - return( MapPlatformError( errno, NE_FLM_RENAMING_FILE)); + return( f_mapPlatformError( errno, NE_FLM_RENAMING_FILE)); } } } @@ -1176,7 +1180,7 @@ RCODE FLMAPI F_FileSystem::getSectorSize( &udBytesPerSector, &udNumberOfFreeClusters, &udTotalNumberOfClusters)) { - rc = MapPlatformError( GetLastError(), NE_FLM_INITIALIZING_IO_SYSTEM); + rc = f_mapPlatformError( GetLastError(), NE_FLM_INITIALIZING_IO_SYSTEM); *puiSectorSize = 0; goto Exit; } @@ -1280,7 +1284,7 @@ RCODE F_FileSystem::unix_TargetIsDir( *isdir = 0; if( stat(tpath, &sbuf) < 0) { - rc = MapPlatformError( errno, NE_FLM_IO_ACCESS_DENIED); + rc = f_mapPlatformError( errno, NE_FLM_IO_ACCESS_DENIED); } else if( (sbuf.st_mode & S_IFMT) == S_IFDIR) { @@ -1322,7 +1326,7 @@ RCODE F_FileSystem::unix_RenameSafe( // ENOENT means the file didn't exist, which is what we were // hoping for. - rc = MapPlatformError( errno, NE_FLM_IO_RENAME_FAILURE); + rc = f_mapPlatformError( errno, NE_FLM_IO_RENAME_FAILURE); goto Exit; } } @@ -1330,7 +1334,7 @@ RCODE F_FileSystem::unix_RenameSafe( errno = 0; if( rename( pszSrcFile, pszDestFile) != 0) { - rc = MapPlatformError( errno, NE_FLM_IO_RENAME_FAILURE); + rc = f_mapPlatformError( errno, NE_FLM_IO_RENAME_FAILURE); } Exit: @@ -1934,7 +1938,7 @@ RCODE FLMAPI F_FileSystem::pathToStorageString( if (!realpath( (char *)szDir, (char *)pszRealPath)) { - rc = MapPlatformError( errno, NE_FLM_PARSING_FILE_NAME); + rc = f_mapPlatformError( errno, NE_FLM_PARSING_FILE_NAME); goto Exit; } @@ -1996,7 +2000,7 @@ void FLMAPI F_FileSystem::pathCreateUniqueName( FLMUINT uiSdTmp = 0; FLMUINT uiIncVal = 1; - SetUpTime( puiTime, pHighChars); + f_setupTime( puiTime, pHighChars); uiSdTmp = *puiTime; *(pszFileName + 8) = NATIVE_DOT; @@ -2013,7 +2017,7 @@ void FLMAPI F_FileSystem::pathCreateUniqueName( if( bModext == TRUE) { - HexToNative((FLMBYTE)(uiSdTmp & 0x0000001F), pszFileName+(11)); + f_hexToNative((FLMBYTE)(uiSdTmp & 0x0000001F), pszFileName+(11)); } else { @@ -2023,13 +2027,13 @@ void FLMAPI F_FileSystem::pathCreateUniqueName( uiSdTmp = uiSdTmp >> 5; for( iCount = 0; iCount < 6; iCount++) { - HexToNative((FLMBYTE)(uiSdTmp & 0x0000000F), pszFileName+(7-iCount)); + f_hexToNative((FLMBYTE)(uiSdTmp & 0x0000000F), pszFileName+(7-iCount)); uiSdTmp = uiSdTmp >> 4; } for( iCount = 0; iCount < 2; iCount++) { - HexToNative((FLMBYTE)(*pHighChars & 0x0000000F), pszFileName+(1-iCount)); + f_hexToNative((FLMBYTE)(*pHighChars & 0x0000000F), pszFileName+(1-iCount)); *pHighChars = *pHighChars >> 4; } diff --git a/ftk/src/ftkiobuf.cpp b/ftk/src/ftkiobuf.cpp index 137e55f..c82823d 100644 --- a/ftk/src/ftkiobuf.cpp +++ b/ftk/src/ftkiobuf.cpp @@ -417,7 +417,7 @@ RCODE FLMAPI F_IOBuffer::setupBuffer( if( (m_Overlapped.hEvent = CreateEvent( NULL, TRUE, FALSE, NULL)) == NULL) { - rc = MapPlatformError( GetLastError(), NE_FLM_SETTING_UP_FOR_WRITE); + rc = f_mapPlatformError( GetLastError(), NE_FLM_SETTING_UP_FOR_WRITE); goto Exit; } #endif @@ -436,21 +436,21 @@ RCODE FLMAPI F_IOBuffer::setupBuffer( (DWORD)uiBufferSize, MEM_COMMIT, PAGE_READWRITE)) == NULL) { - rc = MapPlatformError( GetLastError(), NE_FLM_MEM); + rc = f_mapPlatformError( GetLastError(), NE_FLM_MEM); goto Exit; } #elif defined( FLM_LINUX) if( posix_memalign( (void **)&m_pucBuffer, sysconf( _SC_PAGESIZE), uiBufferSize) != 0) { - rc = MapPlatformError( errno, NE_FLM_MEM); + rc = f_mapPlatformError( errno, NE_FLM_MEM); goto Exit; } #elif defined( FLM_SOLARIS) if( (m_pucBuffer = (FLMBYTE *)memalign( sysconf( _SC_PAGESIZE), uiBufferSize)) == NULL) { - rc = MapPlatformError( errno, NE_FLM_MEM); + rc = f_mapPlatformError( errno, NE_FLM_MEM); goto Exit; } #else @@ -564,7 +564,7 @@ RCODE F_IOBuffer::waitToComplete( void) if (!GetOverlappedResult( m_FileHandle, &m_Overlapped, &udBytesWritten, TRUE)) { - rc = MapPlatformError( GetLastError(), NE_FLM_WRITING_FILE); + rc = f_mapPlatformError( GetLastError(), NE_FLM_WRITING_FILE); } notifyComplete( rc); @@ -578,7 +578,7 @@ RCODE F_IOBuffer::waitToComplete( void) if( aio_suspend( &pAio, 1, NULL) == -1) { - rc = MapPlatformError( errno, NE_FLM_MEM); + rc = f_mapPlatformError( errno, NE_FLM_MEM); } notifyComplete( rc); diff --git a/ftk/src/ftkmem.cpp b/ftk/src/ftkmem.cpp index 341ace9..4dbbc82 100644 --- a/ftk/src/ftkmem.cpp +++ b/ftk/src/ftkmem.cpp @@ -726,7 +726,7 @@ private: /************************************************************************ Desc: *************************************************************************/ -FINLINE FLMUINT f_msize( +FLMUINT f_msize( void * pvPtr) { #if defined( FLM_UNIX) @@ -1767,12 +1767,12 @@ void FLMAPI f_freeImp( /******************************************************************** Desc: Reset the stack information for an allocation. *********************************************************************/ -#ifdef FLM_DEBUG void f_resetStackInfoImp( void * pvPtr, const char * pszFileName, int iLineNumber) { +#ifdef FLM_DEBUG if (pvPtr) { @@ -1785,8 +1785,12 @@ void f_resetStackInfoImp( f_mutexUnlock( gv_hMemTrackingMutex); updateMemTrackingInfo( pHdr); } -} +#else + F_UNREFERENCED_PARM( pvPtr); + F_UNREFERENCED_PARM( pszFileName); + F_UNREFERENCED_PARM( iLineNumber); #endif +} /************************************************************************ Desc: @@ -4213,6 +4217,49 @@ IF_FixedAlloc * F_MultiAlloc::getAllocator( return( pAllocator); } +/**************************************************************************** +Desc: +****************************************************************************/ +RCODE FLMAPI f_allocAlignedBuffer( + FLMUINT uiMinSize, + void ** ppvAlloc) +{ + RCODE rc = NE_FLM_OK; + +#ifdef FLM_WIN + if ((*ppvAlloc = (void *)VirtualAlloc( NULL, + uiMinSize, MEM_COMMIT, PAGE_READWRITE)) == NULL) + { + rc = f_mapPlatformError( GetLastError(), NE_FLM_MEM); + goto Exit; + } + f_memset( *ppvAlloc, 0, uiMinSize); +#elif defined( FLM_LINUX) + if( posix_memalign( ppvAlloc, sysconf( _SC_PAGESIZE), uiMinSize) != 0) + { + rc = f_mapPlatformError( errno, NE_FLM_MEM); + goto Exit; + } + f_memset( *ppvAlloc, 0, uiMinSize); +#elif defined( FLM_SOLARIS) + if( (*ppvAlloc = memalign( sysconf( _SC_PAGESIZE), uiMinSize)) == NULL) + { + rc = f_mapPlatformError( errno, NE_FLM_MEM); + goto Exit; + } + f_memset( *ppvAlloc, 0, uiMinSize); +#else + if( RC_BAD( rc = f_calloc( uiMinSize, ppvAlloc))) + { + goto Exit; + } +#endif + +Exit: + + return( rc); +} + #undef new #undef delete /**************************************************************************** @@ -4305,19 +4352,9 @@ void F_Base::operator delete[]( f_freeImp( &ptr, TRUE); } -/************************************************************************ -Desc: -*************************************************************************/ -void * F_OSBase::operator new( - FLMSIZET uiSize) -{ - return( malloc( uiSize)); -} - /**************************************************************************** Desc: ****************************************************************************/ -#ifdef FLM_DEBUG void * F_OSBase::operator new( FLMSIZET uiSize, const char *, // pszFile, @@ -4325,7 +4362,6 @@ void * F_OSBase::operator new( { return( malloc( uiSize)); } -#endif /************************************************************************ Desc: @@ -4339,16 +4375,6 @@ void F_OSBase::operator delete( /**************************************************************************** Desc: ****************************************************************************/ -void F_OSBase::operator delete[]( - void * ptr) -{ - free( &ptr); -} - -/**************************************************************************** -Desc: -****************************************************************************/ -#if defined( FLM_DEBUG) && !defined( FLM_WATCOM_NLM) && !defined( FLM_SOLARIS) void F_OSBase::operator delete( void * ptr, const char *, // file @@ -4356,12 +4382,10 @@ void F_OSBase::operator delete( { free( &ptr); } -#endif /**************************************************************************** Desc: ****************************************************************************/ -#if defined( FLM_DEBUG) && !defined( FLM_WATCOM_NLM) && !defined( FLM_SOLARIS) void F_OSBase::operator delete[]( void * ptr, const char *, // file @@ -4369,4 +4393,3 @@ void F_OSBase::operator delete[]( { free( &ptr); } -#endif diff --git a/ftk/src/ftkrand.cpp b/ftk/src/ftkrand.cpp index ec5ef50..74c538f 100644 --- a/ftk/src/ftkrand.cpp +++ b/ftk/src/ftkrand.cpp @@ -75,9 +75,9 @@ public: void FLMAPI setSeed( FLMINT32 i32seed); - FLMINT32 FLMAPI getInt32( void); + FLMINT32 FLMAPI getINT32( void); - FLMINT32 FLMAPI getInt32( + FLMINT32 FLMAPI getINT32( FLMINT32 i32Low, FLMINT32 i32High); @@ -143,7 +143,7 @@ Desc: Generate the next number in the pseudo-random sequence time, on average. Likewise, "f_randomLong( &r) & 0x1" has a 50-50 chance of being true. *************************************************************************/ -FLMINT32 F_RandomGenerator::getInt32( void) +FLMINT32 F_RandomGenerator::getINT32( void) { #define M 2147483647 #define A 48271 @@ -177,7 +177,7 @@ FLMINT32 F_RandomGenerator::getInt32( void) /************************************************************************* Desc: Returns a random integer between i32Low and i32High, inclusive. *************************************************************************/ -FLMINT32 F_RandomGenerator::getInt32( +FLMINT32 F_RandomGenerator::getINT32( FLMINT32 i32Low, FLMINT32 i32High) { @@ -185,7 +185,7 @@ FLMINT32 F_RandomGenerator::getInt32( if( i32Range < (1L << 20)) { - return( i32Low + getInt32() % i32Range); + return( i32Low + getINT32() % i32Range); } else { @@ -200,7 +200,7 @@ FLMINT32 F_RandomGenerator::getInt32( do { - i32Val = getInt32() & i32Mask; + i32Val = getINT32() & i32Mask; } while( i32Val > i32Range); return( i32Low + i32Val); @@ -212,5 +212,5 @@ Desc: *************************************************************************/ FLMBOOL F_RandomGenerator::getBoolean( void) { - return( (getInt32( 1, 100) <= 50 ? TRUE : FALSE)); + return( (getINT32( 1, 100) <= 50 ? TRUE : FALSE)); } diff --git a/ftk/src/ftkrset.cpp b/ftk/src/ftkrset.cpp index 34cf131..869a7a5 100644 --- a/ftk/src/ftkrset.cpp +++ b/ftk/src/ftkrset.cpp @@ -531,6 +531,105 @@ private: friend class F_ResultSetBlk; }; +/***************************************************************************** +Desc: +*****************************************************************************/ +class F_BtResultSet : public IF_BtResultSet, public F_Base +{ +public: + + F_BtResultSet( void) + { + m_pBtree = NULL; + m_pCompare = NULL; + } + + virtual ~F_BtResultSet() + { + if( m_pBtree) + { + m_pBtree->Release(); + } + + if( m_pCompare) + { + m_pCompare->Release(); + } + } + + RCODE FLMAPI setupResultSet( + const char * pszPath, + IF_ResultSetCompare * pCompare); + + RCODE FLMAPI addEntry( + FLMBYTE * pucKey, + FLMUINT uiKeyLength, + FLMBYTE * pucEntry, + FLMUINT uiEntryLength); + + RCODE FLMAPI modifyEntry( + FLMBYTE * pucKey, + FLMUINT uiKeyLength, + FLMBYTE * pucEntry, + FLMUINT uiEntryLength); + + RCODE FLMAPI getCurrent( + FLMBYTE * pucKey, + FLMUINT uiKeyLength, + FLMBYTE * pucEntry, + FLMUINT uiEntryLength, + FLMUINT * puiReturnLength); + + RCODE FLMAPI getNext( + FLMBYTE * pucKey, + FLMUINT uiKeyBufLen, + FLMUINT * puiKeylen, + FLMBYTE * pucBuffer, + FLMUINT uiBufferLength, + FLMUINT * puiReturnLength); + + RCODE FLMAPI getPrev( + FLMBYTE * pucKey, + FLMUINT uiKeyBufLen, + FLMUINT * puiKeylen, + FLMBYTE * pucBuffer, + FLMUINT uiBufferLength, + FLMUINT * puiReturnLength); + + RCODE FLMAPI getFirst( + FLMBYTE * pucKey, + FLMUINT uiKeyBufLen, + FLMUINT * puiKeylen, + FLMBYTE * pucBuffer, + FLMUINT uiBufferLength, + FLMUINT * puiReturnLength); + + RCODE FLMAPI getLast( + FLMBYTE * pucKey, + FLMUINT uiKeyBufLen, + FLMUINT * puiKeylen, + FLMBYTE * pucBuffer, + FLMUINT uiBufferLength, + FLMUINT * puiReturnLength); + + RCODE FLMAPI findEntry( + FLMBYTE * pucKey, + FLMUINT uiKeyBufLen, + FLMUINT * puiKeylen, + FLMBYTE * pucBuffer, + FLMUINT uiBufferLength, + FLMUINT * puiReturnLength); + + RCODE FLMAPI deleteEntry( + FLMBYTE * pucKey, + FLMUINT uiKeyLength); + +private: + + IF_Btree * m_pBtree; + IF_ResultSetCompare * m_pCompare; +}; + /***************************************************************************** Desc: *****************************************************************************/ @@ -3763,3 +3862,286 @@ Exit: return( rc); } + +/**************************************************************************** +Desc: +****************************************************************************/ +RCODE F_BtResultSet::addEntry( + FLMBYTE * pucKey, + FLMUINT uiKeyLength, + FLMBYTE * pucEntry, + FLMUINT uiEntryLength) +{ + RCODE rc = NE_FLM_OK; + + f_assert( uiKeyLength <= FLM_MAX_KEY_SIZE); + + if( RC_BAD( rc = m_pBtree->btInsertEntry( pucKey, uiKeyLength, + uiKeyLength, pucEntry, uiEntryLength, TRUE, TRUE))) + { + if (rc == NE_FLM_NOT_UNIQUE) + { + rc = NE_FLM_OK; + } + else + { + goto Exit; + } + } + +Exit: + + return( rc); +} + +/**************************************************************************** +Desc: +****************************************************************************/ +RCODE F_BtResultSet::modifyEntry( + FLMBYTE * pucKey, + FLMUINT uiKeyLength, + FLMBYTE * pucEntry, + FLMUINT uiEntryLength) +{ + RCODE rc = NE_FLM_OK; + + f_assert( uiKeyLength <= FLM_MAX_KEY_SIZE); + + if( RC_BAD( rc = m_pBtree->btReplaceEntry( pucKey, uiKeyLength, + uiKeyLength, pucEntry, uiEntryLength, TRUE, TRUE))) + { + goto Exit; + } + +Exit: + + return( rc); +} + +/**************************************************************************** +Desc: +****************************************************************************/ +RCODE F_BtResultSet::deleteEntry( + FLMBYTE * pucKey, + FLMUINT uiKeyLength) +{ + RCODE rc = NE_FLM_OK; + + f_assert( uiKeyLength <= FLM_MAX_KEY_SIZE); + + if (RC_BAD( rc = m_pBtree->btRemoveEntry( + pucKey, uiKeyLength, uiKeyLength))) + { + goto Exit; + } + +Exit: + + return( rc); +} + +/**************************************************************************** +Desc: +****************************************************************************/ +RCODE F_BtResultSet::findEntry( + FLMBYTE * pucKey, + FLMUINT uiKeyBufLen, + FLMUINT * puiKeyLen, + FLMBYTE * pucBuffer, + FLMUINT uiBufferLength, + FLMUINT * puiReturnLength) +{ + RCODE rc = NE_FLM_OK; + FLMUINT uiLengthRV; + + f_assert( uiKeyBufLen <= FLM_MAX_KEY_SIZE); + + if( RC_BAD( rc = m_pBtree->btLocateEntry( pucKey, uiKeyBufLen, puiKeyLen, + FLM_EXACT, NULL, &uiLengthRV))) + { + goto Exit; + } + + if( pucBuffer) + { + if( RC_BAD( rc = m_pBtree->btGetEntry( pucKey, *puiKeyLen, + pucBuffer, uiBufferLength, puiReturnLength))) + { + goto Exit; + } + } + else if( puiReturnLength) + { + *puiReturnLength = uiLengthRV; + } + +Exit: + + return( rc); +} + +/**************************************************************************** +Desc: +****************************************************************************/ +RCODE F_BtResultSet::getCurrent( + FLMBYTE * pucKey, + FLMUINT uiKeyLength, + FLMBYTE * pucEntry, + FLMUINT uiEntryLength, + FLMUINT * puiReturnLength) +{ + RCODE rc = NE_FLM_OK; + + f_assert( uiKeyLength <= FLM_MAX_KEY_SIZE); + + if( RC_BAD( rc = m_pBtree->btGetEntry( pucKey, uiKeyLength, + pucEntry, uiEntryLength, puiReturnLength))) + { + goto Exit; + } + +Exit: + + return( rc); +} + +/**************************************************************************** +Desc: +****************************************************************************/ +RCODE F_BtResultSet::getNext( + FLMBYTE * pucKey, + FLMUINT uiKeyBufLen, + FLMUINT * puiKeyLen, + FLMBYTE * pucEntry, + FLMUINT uiEntryLength, + FLMUINT * puiReturnLength) +{ + RCODE rc = NE_FLM_OK; + + f_assert( uiKeyBufLen <= FLM_MAX_KEY_SIZE); + + if( RC_BAD( rc = m_pBtree->btNextEntry( pucKey, uiKeyBufLen, puiKeyLen, + puiReturnLength))) + { + goto Exit; + } + + if( pucEntry) + { + if( RC_BAD( rc = m_pBtree->btGetEntry( pucKey, *puiKeyLen, + pucEntry, uiEntryLength, puiReturnLength))) + { + goto Exit; + } + } + +Exit: + + return( rc); +} + +/**************************************************************************** +Desc: +****************************************************************************/ +RCODE F_BtResultSet::getPrev( + FLMBYTE * pucKey, + FLMUINT uiKeyBufLen, + FLMUINT * puiKeyLen, + FLMBYTE * pucEntry, + FLMUINT uiEntryLength, + FLMUINT * puiReturnLength) +{ + RCODE rc = NE_FLM_OK; + + f_assert( uiKeyBufLen <= FLM_MAX_KEY_SIZE); + + if( RC_BAD( rc = m_pBtree->btPrevEntry( pucKey, uiKeyBufLen, puiKeyLen, + puiReturnLength))) + { + goto Exit; + } + + if( pucEntry) + { + if( RC_BAD( rc = m_pBtree->btGetEntry( pucKey, *puiKeyLen, + pucEntry, uiEntryLength, puiReturnLength))) + { + goto Exit; + } + } + +Exit: + + return( rc); +} + +/**************************************************************************** +Desc: +****************************************************************************/ +RCODE F_BtResultSet::getFirst( + FLMBYTE * pucKey, + FLMUINT uiKeyBufLen, + FLMUINT * puiKeyLen, + FLMBYTE * pucEntry, + FLMUINT uiEntryLength, + FLMUINT * puiReturnLength) +{ + RCODE rc = NE_FLM_OK; + + f_assert( uiKeyBufLen <= FLM_MAX_KEY_SIZE); + + m_pBtree->btResetBtree(); + if( RC_BAD( rc = m_pBtree->btFirstEntry( pucKey, uiKeyBufLen, puiKeyLen, + puiReturnLength))) + { + goto Exit; + } + + if( pucEntry) + { + if( RC_BAD( rc = m_pBtree->btGetEntry( pucKey, *puiKeyLen, + pucEntry, uiEntryLength, puiReturnLength))) + { + goto Exit; + } + } + +Exit: + + return( rc); +} + +/**************************************************************************** +Desc: +****************************************************************************/ +RCODE F_BtResultSet::getLast( + FLMBYTE * pucKey, + FLMUINT uiKeyBufLen, + FLMUINT * puiKeyLen, + FLMBYTE * pucEntry, + FLMUINT uiEntryLength, + FLMUINT * puiReturnLength) +{ + RCODE rc = NE_FLM_OK; + + f_assert( uiKeyBufLen <= FLM_MAX_KEY_SIZE); + + if( RC_BAD( rc = m_pBtree->btLastEntry( pucKey, uiKeyBufLen, puiKeyLen, + puiReturnLength))) + { + goto Exit; + } + + if( pucEntry) + { + if( RC_BAD( rc = m_pBtree->btGetEntry( pucKey, *puiKeyLen, + pucEntry, uiEntryLength, puiReturnLength))) + { + goto Exit; + } + } + +Exit: + + return( rc); +} diff --git a/ftk/src/ftkstrm.cpp b/ftk/src/ftkstrm.cpp index ccb6cbc..77f7dce 100644 --- a/ftk/src/ftkstrm.cpp +++ b/ftk/src/ftkstrm.cpp @@ -35,6 +35,63 @@ #define MULTI_FILE_OUT_STREAM_MIN_FILE_SIZE 1048510 #define MULTI_FILE_OUT_STREAM_MAX_FILE_SIZE 2147483647 +/**************************************************************************** +Desc: Decodes an ASCII base64 stream to binary +****************************************************************************/ +class F_Base64DecoderIStream : public F_IStream +{ +public: + + F_Base64DecoderIStream() + { + m_pIStream = NULL; + m_uiBufOffset = 0; + m_uiAvailBytes = 0; + } + + virtual ~F_Base64DecoderIStream() + { + close(); + } + + RCODE FLMAPI open( + IF_IStream * pIStream); + + RCODE FLMAPI read( + void * pvBuffer, + FLMUINT uiBytesToRead, + FLMUINT * puiBytesRead); + + FINLINE RCODE FLMAPI close( void) + { + RCODE rc = NE_FLM_OK; + + if( m_pIStream) + { + if( m_pIStream->getRefCount() == 1) + { + rc = m_pIStream->close(); + } + + m_pIStream->Release(); + m_pIStream = NULL; + } + + m_uiAvailBytes = 0; + m_uiBufOffset = 0; + + return( rc); + } + +private: + + IF_IStream * m_pIStream; + FLMUINT m_uiBufOffset; + FLMUINT m_uiAvailBytes; + FLMBYTE m_ucBuffer[ 8]; + static FLMBYTE m_ucDecodeTable[ 256]; +}; + /**************************************************************************** Desc: ****************************************************************************/ @@ -77,7 +134,7 @@ FLMBYTE F_Base64DecoderIStream::m_ucDecodeTable[ 256] = /**************************************************************************** Desc: Encodes a binary input stream into ASCII base64. ****************************************************************************/ -class F_Base64EncoderIStream : public F_IStream +class F_Base64EncoderIStream : public IF_IStream { public: diff --git a/ftk/src/ftksys.h b/ftk/src/ftksys.h index 1c09b1b..553565b 100644 --- a/ftk/src/ftksys.h +++ b/ftk/src/ftksys.h @@ -49,9 +49,10 @@ IF_ThreadMgr * gv_pThreadMgr; #endif - RCODE MapPlatformError( - FLMINT iError, - RCODE defaultRc); + #define FLM_DEFAULT_OPEN_THRESHOLD 100 + #define FLM_DEFAULT_MAX_AVAIL_TIME 900 + + #define FLM_MAX_KEY_SIZE 1024 /**************************************************************************** Desc: NLM @@ -101,7 +102,6 @@ (*(type *)(((ap) += f_argsize(type)) - (f_argsize(type)))) #define f_va_end(ap) ((void)0) - #define FSTATIC #ifndef _SIZE_T #define _SIZE_T @@ -212,8 +212,6 @@ // Function XXX not inlined #pragma warning( disable : 4710) - #define FSTATIC static - #define ENDLINE ENDLINE_CRLF #define f_va_start va_start #define f_va_arg va_arg @@ -226,8 +224,6 @@ ****************************************************************************/ #if defined( FLM_UNIX) - #define FSTATIC static - #ifdef HAVE_CONFIG_H #include "config.h" #endif @@ -480,79 +476,6 @@ #define f_va_copy(to, from) ((to) = (from)) #endif - /**************************************************************************** - Desc: Internal base class - ****************************************************************************/ - class F_OSBase - { - public: - - F_OSBase() - { - m_refCnt = 1; - } - - virtual ~F_OSBase() - { - } - - FINLINE FLMUINT getRefCount( void) - { - return( m_refCnt); - } - - void * operator new( - FLMSIZET uiSize); - - #ifdef FLM_DEBUG - void * operator new( - FLMSIZET uiSize, - const char * pszFile, - int iLine); - #endif - - void operator delete( - void * ptr); - - void operator delete[]( - void * ptr); - - #if defined( FLM_DEBUG) && !defined( FLM_WATCOM_NLM) && !defined( FLM_SOLARIS) - void operator delete( - void * ptr, - const char *, // file - int); // line - #endif - - #if defined( FLM_DEBUG) && !defined( FLM_WATCOM_NLM) && !defined( FLM_SOLARIS) - void operator delete[]( - void * ptr, - const char *, // file - int); // line - #endif - - virtual FINLINE FLMINT FLMAPI AddRef( void) - { - return( ++m_refCnt); - } - - virtual FINLINE FLMINT FLMAPI Release( void) - { - FLMINT iRefCnt = --m_refCnt; - - if( !iRefCnt) - { - delete this; - } - - return( iRefCnt); - } - - protected: - - FLMATOMIC m_refCnt; - }; - /********************************************************************** Desc: **********************************************************************/ @@ -1651,6 +1574,27 @@ { m_uiBlockSize = uiBlockSize; } + + FINLINE FLMUINT FLMAPI getBlockSize( void) + { + return( m_uiBlockSize); + } + + FINLINE FLMUINT FLMAPI getSectorSize( void) + { + return( m_uiBytesPerSector); + } + + FINLINE void FLMAPI setFileId( + FLMUINT uiFileId) + { + m_uiFileId = uiFileId; + } + + FINLINE FLMUINT FLMAPI getFileId( void) + { + return( m_uiFileId); + } private: @@ -1667,11 +1611,6 @@ const char * pszFileName, FLMUINT uiIoFlags); - FINLINE FLMUINT getSectorSize( void) - { - return( m_uiBytesPerSector); - } - FINLINE HANDLE getFileHandle( void) { return m_FileHandle; @@ -1682,8 +1621,6 @@ FLMUINT uiAccess, FLMBOOL bCreateFlag); - RCODE allocAlignBuffer( void); - RCODE doOneRead( FLMUINT64 ui64Offset, FLMUINT uiLength, @@ -1723,7 +1660,10 @@ FLMUINT64 ui64EndOfLastWrite, FLMUINT uiMaxBytesToExtend, FLMBOOL bFlush); + + RCODE allocAlignedBuffer( void); + FLMUINT m_uiFileId; FLMBOOL m_bFileOpened; FLMBOOL m_bDeleteOnRelease; FLMBOOL m_bOpenedReadOnly; @@ -1907,7 +1847,7 @@ FLMBOOL bBuffHasFullSectors, FLMBOOL bZeroFill); - RCODE allocAlignBuffer( void); + RCODE allocAlignedBuffer( void); FLMBOOL m_bFileOpened; FLMBOOL m_bDeleteOnRelease; @@ -1932,6 +1872,181 @@ }; #endif + /*************************************************************************** + Desc: + ***************************************************************************/ + class F_FileHdlMgr : public IF_FileHdlMgr, public F_Base + { + public: + + F_FileHdlMgr(); + + virtual FINLINE ~F_FileHdlMgr() + { + if (m_hMutex != F_MUTEX_NULL) + { + lockMutex( FALSE); + freeUsedList( TRUE); + freeAvailList( TRUE); + unlockMutex( FALSE); + f_mutexDestroy( &m_hMutex); + } + } + + FINLINE void FLMAPI setOpenThreshold( + FLMUINT uiOpenThreshold) + { + if (m_bIsSetup) + { + lockMutex( FALSE); + m_uiOpenThreshold = uiOpenThreshold; + unlockMutex( FALSE); + } + } + + FINLINE void FLMAPI setMaxAvailTime( + FLMUINT uiMaxAvailTime) + { + if (m_bIsSetup) + { + lockMutex( FALSE); + m_uiMaxAvailTime = uiMaxAvailTime; + unlockMutex( FALSE); + } + } + + FINLINE FLMUINT FLMAPI getUniqueId( void) + { + FLMUINT uiTemp; + + lockMutex( FALSE); + uiTemp = ++m_uiFileIdCounter; + unlockMutex( FALSE); + return( uiTemp); + } + + void FLMAPI findAvail( + FLMUINT uiFileId, + FLMBOOL bReadOnlyFlag, + IF_FileHdl ** ppFileHdl); + + void FLMAPI removeFileHdls( + FLMUINT uiFileId); + + void FLMAPI checkAgedFileHdls( + FLMUINT uiMinSecondsOpened); + + FINLINE FLMUINT FLMAPI getOpenThreshold( void) + { + return( m_uiOpenThreshold); + } + + FINLINE FLMUINT FLMAPI getOpenedFiles( void) + { + FLMUINT uiTemp; + + lockMutex( FALSE); + uiTemp = m_uiNumUsed + m_uiNumAvail; + unlockMutex( FALSE); + return( uiTemp); + } + + FINLINE FLMUINT FLMAPI getMaxAvailTime( void) + { + return( m_uiMaxAvailTime); + } + + private: + + RCODE setupFileHdlMgr( + FLMUINT uiOpenThreshold = FLM_DEFAULT_OPEN_THRESHOLD, + FLMUINT uiMaxAvailTime = FLM_DEFAULT_MAX_AVAIL_TIME); + + void freeAvailList( + FLMBOOL bMutexAlreadyLocked); + + void freeUsedList( + FLMBOOL bMutexAlreadyLocked); + + FINLINE void insertInUsedList( + FLMBOOL bMutexAlreadyLocked, + IF_FileHdl * pFileHdl, + FLMBOOL bInsertAtEnd) + { + insertInList( bMutexAlreadyLocked, + pFileHdl, bInsertAtEnd, + &m_pFirstUsed, &m_pLastUsed, &m_uiNumUsed); + } + + void makeAvailAndRelease( + FLMBOOL bMutexAlreadyLocked, + IF_FileHdl * pFileHdl); + + void FINLINE releaseOneAvail( + FLMBOOL bMutexAlreadyLocked) + { + lockMutex( bMutexAlreadyLocked); + if (m_pFirstAvail) + { + removeFromList( TRUE, + m_pFirstAvail, &m_pFirstAvail, &m_pLastAvail, &m_uiNumAvail); + } + unlockMutex( bMutexAlreadyLocked); + } + + void insertInList( + FLMBOOL bMutexAlreadyLocked, + IF_FileHdl * pFileHdl, + FLMBOOL bInsertAtEnd, + IF_FileHdl ** ppFirst, + IF_FileHdl ** ppLast, + FLMUINT * puiCount); + + void removeFromList( + FLMBOOL bMutexAlreadyLocked, + IF_FileHdl * pFileHdl, + IF_FileHdl ** ppFirst, + IF_FileHdl ** ppLast, + FLMUINT * puiCount); + + FINLINE void lockMutex( + FLMBOOL bMutexAlreadyLocked) + { + if (m_hMutex != F_MUTEX_NULL && !bMutexAlreadyLocked) + { + f_mutexLock( m_hMutex); + } + } + + FINLINE void unlockMutex( + FLMBOOL bMutexAlreadyLocked) + { + if (m_hMutex != F_MUTEX_NULL && !bMutexAlreadyLocked) + { + f_mutexUnlock( m_hMutex); + } + } + + F_MUTEX m_hMutex; + FLMUINT m_uiOpenThreshold; // FileHdl open threshold. + FLMUINT m_uiMaxAvailTime; // Time to close any available files. + + // Used list + + IF_FileHdl * m_pFirstUsed; + IF_FileHdl * m_pLastUsed; + FLMUINT m_uiNumUsed; + + // Avail list + + IF_FileHdl * m_pFirstAvail; + IF_FileHdl * m_pLastAvail; + FLMUINT m_uiNumAvail; + + FLMBOOL m_bIsSetup; + FLMUINT m_uiFileIdCounter; + }; + /**************************************************************************** Desc: ****************************************************************************/ @@ -2456,63 +2571,6 @@ friend class F_FileSystem; }; - /**************************************************************************** - Desc: Decodes an ASCII base64 stream to binary - ****************************************************************************/ - class F_Base64DecoderIStream : public F_IStream - { - public: - - F_Base64DecoderIStream() - { - m_pIStream = NULL; - m_uiBufOffset = 0; - m_uiAvailBytes = 0; - } - - virtual ~F_Base64DecoderIStream() - { - close(); - } - - RCODE FLMAPI open( - IF_IStream * pIStream); - - RCODE FLMAPI read( - void * pvBuffer, - FLMUINT uiBytesToRead, - FLMUINT * puiBytesRead); - - FINLINE RCODE FLMAPI close( void) - { - RCODE rc = NE_FLM_OK; - - if( m_pIStream) - { - if( m_pIStream->getRefCount() == 1) - { - rc = m_pIStream->close(); - } - - m_pIStream->Release(); - m_pIStream = NULL; - } - - m_uiAvailBytes = 0; - m_uiBufOffset = 0; - - return( rc); - } - - private: - - IF_IStream * m_pIStream; - FLMUINT m_uiBufOffset; - FLMUINT m_uiAvailBytes; - FLMBYTE m_ucBuffer[ 8]; - static FLMBYTE m_ucDecodeTable[ 256]; - }; - /**************************************************************************** Desc: Logging ****************************************************************************/ @@ -2652,4 +2710,92 @@ RCODE f_allocDirHdl( F_DirHdl ** ppDirHdl); +#if defined( FLM_NLM) + + extern "C" + { + void ConvertTicksToSeconds( + LONG ticks, + LONG * seconds, + LONG * tenthsOfSeconds); + + void ConvertSecondsToTicks( + LONG seconds, + LONG tenthsOfSeconds, + LONG * ticks); + } + + #define FLM_GET_TIMER() (FLMUINT)GetCurrentTime() + + #define FLM_SECS_TO_TIMER_UNITS( uiSeconds, uiTU) \ + ConvertSecondsToTicks( (LONG)(uiSeconds), 0, (LONG *)(&(uiTU))) + + #define FLM_TIMER_UNITS_TO_SECS( uiTU, uiSeconds) \ + { \ + LONG udDummy; \ + ConvertTicksToSeconds( (LONG)(uiTU), (LONG *)(&(uiSeconds)), &udDummy); \ + } + + #define FLM_TIMER_UNITS_TO_MILLI( uiTU, uiMilli) \ + { \ + LONG udTenths; \ + LONG udSeconds; \ + ConvertTicksToSeconds( (LONG)(uiTU), (LONG *)(&(udSeconds)), &udTenths); \ + uiMilli = (FLMUINT)(udSeconds) * 1000 + (FLMUINT)udTenths * 100; \ + } + #define FLM_MILLI_TO_TIMER_UNITS( uiMilliSeconds, uiTU) \ + { \ + LONG udTenths, udSeconds; \ + udSeconds = ((LONG) uiMilliSeconds) / 1000; \ + udTenths = (((LONG) uiMilliSeconds) % 1000) / 100; \ + ConvertSecondsToTicks( udSeconds, udTenths, (LONG *)(&(uiTU))); \ + } + +#elif defined( FLM_UNIX) + + // gettimeofday() is actually 4 times faster than time() on + // Solaris. gethrtime() is even faster. On Linux time() is the + // fastest; gettimeofday() is 50% slower. clock() is the + // slowest on both Solaris and Linux. We use a new function for + // millisec resolution. The implementation is OS dependent. + + #define FLM_GET_TIMER() (FLMUINT) f_timeGetMilliTime() + #define FLM_SECS_TO_TIMER_UNITS( uiSeconds, uiTU) \ + ((uiTU) = ((uiSeconds) * 1000)) + #define FLM_TIMER_UNITS_TO_SECS( uiTU, uiSeconds) \ + ((uiSeconds) = ((uiTU) / 1000)) + #define FLM_TIMER_UNITS_TO_MILLI( uiTU, uiMilli) \ + ((uiMilli) = (uiTU)) + #define FLM_MILLI_TO_TIMER_UNITS( uiMilli, uiTU) \ + ((uiTU) = (uiMilli)) +#else /* FLM_WIN */ + + #define FLM_GET_TIMER() \ + (FLMUINT)GetTickCount() + + #define FLM_SECS_TO_TIMER_UNITS( uiSeconds, uiTU) \ + ((uiTU) = (uiSeconds) * 1000) + + #define FLM_TIMER_UNITS_TO_SECS( uiTU, uiSeconds) \ + ((uiSeconds) = (uiTU) / 1000) + + #define FLM_TIMER_UNITS_TO_MILLI( uiTU, uiMilli) \ + (uiMilli = (uiTU)) + + #define FLM_MILLI_TO_TIMER_UNITS( uiMilliSeconds, uiTU) \ + (uiTU = (uiMilliSeconds)) + +#endif + +// This macro for calculating elapsed time accounts for the +// possibility of the time wrapping - which it will for some +// of our counters (FLM_WIN is milliseconds and wraps in 49.7 days). + +#define FLM_ELAPSED_TIME(uiLaterTime,uiEarlierTime) \ + (FLMUINT)(((uiLaterTime) >= (uiEarlierTime)) \ + ? (FLMUINT)((uiLaterTime) - (uiEarlierTime)) \ + : (FLMUINT)((0xFFFFFFFF - (uiEarlierTime)) + (uiLaterTime))) + + + #endif // FTKSYS_H diff --git a/ftk/src/ftkunix.cpp b/ftk/src/ftkunix.cpp index a19299a..0f00aa7 100644 --- a/ftk/src/ftkunix.cpp +++ b/ftk/src/ftkunix.cpp @@ -650,7 +650,7 @@ RCODE F_FileHdl::directRead( { if( !m_pucAlignedBuff) { - if( RC_BAD( rc = allocAlignBuffer())) + if( RC_BAD( rc = allocAlignedBuffer())) { goto Exit; } @@ -986,7 +986,7 @@ Exit: /****************************************************************************** Desc: Allocate an aligned buffer. ******************************************************************************/ -RCODE F_FileHdl::allocAlignBuffer( void) +RCODE F_FileHdl::allocAlignedBuffer( void) { RCODE rc = NE_FLM_OK; @@ -1093,7 +1093,7 @@ RCODE F_FileHdl::directWrite( if( !m_pucAlignedBuff) { - if( RC_BAD( rc = allocAlignBuffer())) + if( RC_BAD( rc = allocAlignedBuffer())) { goto Exit; } diff --git a/ftk/src/ftkwin.cpp b/ftk/src/ftkwin.cpp index c4fde3d..767817c 100644 --- a/ftk/src/ftkwin.cpp +++ b/ftk/src/ftkwin.cpp @@ -32,11 +32,11 @@ Desc: ****************************************************************************/ F_FileHdl::F_FileHdl() { + m_uiFileId = 0; m_bFileOpened = FALSE; m_bDeleteOnRelease = FALSE; m_bOpenedReadOnly = FALSE; m_pszFileName = NULL; - m_FileHandle = INVALID_HANDLE_VALUE; m_uiBlockSize = 0; m_uiBytesPerSector = 0; @@ -232,7 +232,7 @@ Retry_Create: } } - rc = MapPlatformError( udErrCode, + rc = f_mapPlatformError( udErrCode, (RCODE)(bCreateFlag ? (RCODE)(m_bDoDirectIO ? (RCODE)NE_FLM_DIRECT_CREATING_FILE @@ -484,7 +484,7 @@ RCODE FLMAPI F_FileHdl::close( void) if( !CloseHandle( m_FileHandle)) { - rc = MapPlatformError( GetLastError(), NE_FLM_CLOSING_FILE); + rc = f_mapPlatformError( GetLastError(), NE_FLM_CLOSING_FILE); goto Exit; } @@ -520,7 +520,7 @@ RCODE FLMAPI F_FileHdl::flush( void) { if( !FlushFileBuffers( m_FileHandle)) { - rc = MapPlatformError( GetLastError(), NE_FLM_FLUSHING_FILE); + rc = f_mapPlatformError( GetLastError(), NE_FLM_FLUSHING_FILE); } } return( rc); @@ -529,7 +529,7 @@ RCODE FLMAPI F_FileHdl::flush( void) /**************************************************************************** Desc: Allocate an aligned buffer. ****************************************************************************/ -RCODE F_FileHdl::allocAlignBuffer( void) +RCODE F_FileHdl::allocAlignedBuffer( void) { RCODE rc = NE_FLM_OK; @@ -543,7 +543,7 @@ RCODE F_FileHdl::allocAlignBuffer( void) (DWORD)m_uiAlignedBuffSize, MEM_COMMIT, PAGE_READWRITE)) == NULL) { - rc = MapPlatformError( GetLastError(), NE_FLM_MEM); + rc = f_mapPlatformError( GetLastError(), NE_FLM_MEM); goto Exit; } @@ -572,7 +572,7 @@ RCODE F_FileHdl::doOneRead( liTmp.QuadPart = ui64ReadOffset; if( !SetFilePointerEx( m_FileHandle, liTmp, NULL, FILE_BEGIN)) { - rc = MapPlatformError( GetLastError(), NE_FLM_POSITIONING_IN_FILE); + rc = f_mapPlatformError( GetLastError(), NE_FLM_POSITIONING_IN_FILE); goto Exit; } @@ -585,7 +585,7 @@ RCODE F_FileHdl::doOneRead( if ((m_Overlapped.hEvent = CreateEvent( NULL, TRUE, FALSE, NULL)) == NULL) { - rc = MapPlatformError( GetLastError(), + rc = f_mapPlatformError( GetLastError(), NE_FLM_SETTING_UP_FOR_READ); goto Exit; } @@ -597,7 +597,7 @@ RCODE F_FileHdl::doOneRead( if( !ResetEvent( pOverlapped->hEvent)) { - rc = MapPlatformError( GetLastError(), NE_FLM_SETTING_UP_FOR_READ); + rc = f_mapPlatformError( GetLastError(), NE_FLM_SETTING_UP_FOR_READ); goto Exit; } } @@ -614,13 +614,13 @@ RCODE F_FileHdl::doOneRead( if( !GetOverlappedResult( m_FileHandle, pOverlapped, puiBytesRead, TRUE)) { - rc = MapPlatformError( GetLastError(), NE_FLM_READING_FILE); + rc = f_mapPlatformError( GetLastError(), NE_FLM_READING_FILE); goto Exit; } } else { - rc = MapPlatformError( udErr, NE_FLM_READING_FILE); + rc = f_mapPlatformError( udErr, NE_FLM_READING_FILE); goto Exit; } } @@ -677,7 +677,7 @@ RCODE F_FileHdl::directRead( { if (!m_pucAlignedBuff) { - if (RC_BAD( rc = allocAlignBuffer())) + if (RC_BAD( rc = allocAlignedBuffer())) { goto Exit; } @@ -897,7 +897,7 @@ RCODE FLMAPI F_FileHdl::size( if( !GetFileSizeEx( m_FileHandle, &liTmp)) { - rc = MapPlatformError( GetLastError(), NE_FLM_GETTING_FILE_SIZE); + rc = f_mapPlatformError( GetLastError(), NE_FLM_GETTING_FILE_SIZE); goto Exit; } @@ -936,7 +936,7 @@ RCODE FLMAPI F_FileHdl::truncate( liTmp.QuadPart = ui64Size; if( !SetFilePointerEx( m_FileHandle, liTmp, NULL, FILE_BEGIN)) { - rc = MapPlatformError( GetLastError(), NE_FLM_POSITIONING_IN_FILE); + rc = f_mapPlatformError( GetLastError(), NE_FLM_POSITIONING_IN_FILE); goto Exit; } @@ -944,7 +944,7 @@ RCODE FLMAPI F_FileHdl::truncate( if( !SetEndOfFile( m_FileHandle)) { - rc = MapPlatformError( GetLastError(), NE_FLM_TRUNCATING_FILE); + rc = f_mapPlatformError( GetLastError(), NE_FLM_TRUNCATING_FILE); goto Exit; } @@ -997,7 +997,7 @@ RCODE F_FileHdl::extendFile( if (!m_pucAlignedBuff) { - if (RC_BAD( rc = allocAlignBuffer())) + if (RC_BAD( rc = allocAlignedBuffer())) { goto Exit; } @@ -1020,7 +1020,7 @@ RCODE F_FileHdl::extendFile( liTmp.QuadPart = ui64EndOfLastWrite; if( !SetFilePointerEx( m_FileHandle, liTmp, NULL, FILE_BEGIN)) { - rc = MapPlatformError( GetLastError(), + rc = f_mapPlatformError( GetLastError(), NE_FLM_POSITIONING_IN_FILE); goto Exit; } @@ -1035,7 +1035,7 @@ RCODE F_FileHdl::extendFile( if ((pOverlapped->hEvent = CreateEvent( NULL, TRUE, FALSE, NULL)) == NULL) { - rc = MapPlatformError( GetLastError(), + rc = f_mapPlatformError( GetLastError(), NE_FLM_SETTING_UP_FOR_WRITE); goto Exit; } @@ -1046,7 +1046,7 @@ RCODE F_FileHdl::extendFile( if (!ResetEvent( pOverlapped->hEvent)) { - rc = MapPlatformError( GetLastError(), + rc = f_mapPlatformError( GetLastError(), NE_FLM_SETTING_UP_FOR_WRITE); goto Exit; } @@ -1057,7 +1057,7 @@ RCODE F_FileHdl::extendFile( if( !WriteFile( m_FileHandle, m_pucAlignedBuff, uiBytesToWrite, &uiBytesWritten, pOverlapped)) { - rc = MapPlatformError( GetLastError(), NE_FLM_WRITING_FILE); + rc = f_mapPlatformError( GetLastError(), NE_FLM_WRITING_FILE); // Don't care if it is a disk full error, because // extending the file is optional work. @@ -1091,7 +1091,7 @@ RCODE F_FileHdl::extendFile( { if( !FlushFileBuffers( m_FileHandle)) { - rc = MapPlatformError( GetLastError(), NE_FLM_FLUSHING_FILE); + rc = f_mapPlatformError( GetLastError(), NE_FLM_FLUSHING_FILE); goto Exit; } } @@ -1156,7 +1156,7 @@ RCODE F_FileHdl::directWrite( if( !GetFileSizeEx( m_FileHandle, &liTmp)) { - rc = MapPlatformError( GetLastError(), NE_FLM_GETTING_FILE_SIZE); + rc = f_mapPlatformError( GetLastError(), NE_FLM_GETTING_FILE_SIZE); goto Exit; } @@ -1206,7 +1206,7 @@ RCODE F_FileHdl::directWrite( f_assert( !bDoAsync || !m_bCanDoAsync); if (!m_pucAlignedBuff) { - if (RC_BAD( rc = allocAlignBuffer())) + if (RC_BAD( rc = allocAlignedBuffer())) { goto Exit; } @@ -1314,7 +1314,7 @@ RCODE F_FileHdl::directWrite( liTmp.QuadPart = ui64LastWriteOffset; if( !SetFilePointerEx( m_FileHandle, liTmp, NULL, FILE_BEGIN)) { - rc = MapPlatformError( GetLastError(), + rc = f_mapPlatformError( GetLastError(), NE_FLM_POSITIONING_IN_FILE); goto Exit; } @@ -1338,7 +1338,7 @@ RCODE F_FileHdl::directWrite( if ((pOverlapped->hEvent = CreateEvent( NULL, TRUE, FALSE, NULL)) == NULL) { - rc = MapPlatformError( GetLastError(), + rc = f_mapPlatformError( GetLastError(), NE_FLM_SETTING_UP_FOR_WRITE); goto Exit; } @@ -1349,7 +1349,7 @@ RCODE F_FileHdl::directWrite( if (!ResetEvent( pOverlapped->hEvent)) { - rc = MapPlatformError( GetLastError(), + rc = f_mapPlatformError( GetLastError(), NE_FLM_SETTING_UP_FOR_WRITE); goto Exit; } @@ -1382,14 +1382,14 @@ RCODE F_FileHdl::directWrite( if (!GetOverlappedResult( m_FileHandle, pOverlapped, &uiBytesWritten, TRUE)) { - rc = MapPlatformError( GetLastError(), + rc = f_mapPlatformError( GetLastError(), NE_FLM_WRITING_FILE); goto Exit; } } else { - rc = MapPlatformError( udErr, NE_FLM_WRITING_FILE); + rc = f_mapPlatformError( udErr, NE_FLM_WRITING_FILE); goto Exit; } } @@ -1487,7 +1487,7 @@ RCODE FLMAPI F_FileHdl::write( liTmp.QuadPart = ui64WriteOffset; if( !SetFilePointerEx( m_FileHandle, liTmp, NULL, FILE_BEGIN)) { - rc = MapPlatformError( GetLastError(), + rc = f_mapPlatformError( GetLastError(), NE_FLM_POSITIONING_IN_FILE); goto Exit; } @@ -1501,7 +1501,7 @@ RCODE FLMAPI F_FileHdl::write( if ((m_Overlapped.hEvent = CreateEvent( NULL, TRUE, FALSE, NULL)) == NULL) { - rc = MapPlatformError( GetLastError(), + rc = f_mapPlatformError( GetLastError(), NE_FLM_SETTING_UP_FOR_WRITE); goto Exit; } @@ -1513,7 +1513,7 @@ RCODE FLMAPI F_FileHdl::write( if( !ResetEvent( pOverlapped->hEvent)) { - rc = MapPlatformError( GetLastError(), + rc = f_mapPlatformError( GetLastError(), NE_FLM_SETTING_UP_FOR_WRITE); goto Exit; } @@ -1529,13 +1529,13 @@ RCODE FLMAPI F_FileHdl::write( if (!GetOverlappedResult( m_FileHandle, pOverlapped, &uiBytesWritten, TRUE)) { - rc = MapPlatformError( GetLastError(), NE_FLM_WRITING_FILE); + rc = f_mapPlatformError( GetLastError(), NE_FLM_WRITING_FILE); goto Exit; } } else { - rc = MapPlatformError( udErr, NE_FLM_WRITING_FILE); + rc = f_mapPlatformError( udErr, NE_FLM_WRITING_FILE); goto Exit; } }