diff --git a/ChangeLog.txt b/ChangeLog.txt index 878358fdeb..137b01b296 100644 --- a/ChangeLog.txt +++ b/ChangeLog.txt @@ -10,6 +10,25 @@ * Change, ! Fix, % Optimization, + Addition, - Removal, ; Comment */ +2014-10-20 17:33 UTC+0200 Przemyslaw Czerpak (druzus/at/poczta.onet.pl) + * config/lang2po.hb + ! fixed negative UTC offsets to string conversion + + * include/dbinfo.ch + * src/rdd/dbfcdx/dbfcdx1.c + * src/rdd/dbfnsx/dbfnsx1.c + * src/rdd/dbfntx/dbfntx1.c + + added DBOI_INDEXPAGESIZE - get index page size + + * include/dbinfo.ch + * include/hbrdddbf.h + * src/rdd/dbf1.c + + added RDDI_INDEXPAGESIZE - get/set default index page size + + * include/hbrddcdx.h + * src/rdd/dbfcdx/dbfcdx1.c + * modification for user defined index page size (work in progress) + 2014-10-19 14:46 UTC+0200 Przemyslaw Czerpak (druzus/at/poczta.onet.pl) * src/rtl/gtwvt/gtwvt.c * small cleanup in HB_GTI_UNITRANS diff --git a/config/lang2po.hb b/config/lang2po.hb index 680b1cd4d0..7738a81fee 100644 --- a/config/lang2po.hb +++ b/config/lang2po.hb @@ -119,8 +119,8 @@ STATIC FUNCTION ISO_TimeStamp() RETURN hb_StrFormat( "%1$s%2$s%3$02d%4$02d", ; hb_TToC( hb_DateTime(), "YYYY-MM-DD", "HH:MM" ), ; iif( nOffset < 0, "-", "+" ), ; - Int( nOffset / 3600 ), ; - Int( ( ( nOffset / 3600 ) - Int( nOffset / 3600 ) ) * 60 ) ) + Int( Abs( nOffset ) / 3600 ), ; + Int( Abs( nOffset ) % 3600 / 60 ) ) STATIC FUNCTION Item( cOri, cTrs, nPos ) diff --git a/include/dbinfo.ch b/include/dbinfo.ch index 034d4e95b2..8ce6ff6629 100644 --- a/include/dbinfo.ch +++ b/include/dbinfo.ch @@ -105,6 +105,7 @@ #define RDDI_PASSWORD 42 /* Get/Set default password */ #define RDDI_LOCKRETRY 43 /* Get/Set record and file lock timeout value */ #define RDDI_DIRTYREAD 44 /* Get/Set index dirty read flag */ +#define RDDI_INDEXPAGESIZE 45 /* Get/Set default index page size */ /* Constants for SELF_ORDINFO () @@ -203,6 +204,7 @@ #define DBOI_USECURRENT 131 /* get/set "use current index" flag */ #define DBOI_INDEXTYPE 132 /* current index type */ #define DBOI_RESETPOS 133 /* rest logical and raw positions */ +#define DBOI_INDEXPAGESIZE 134 /* get index page size */ /* return values for DBOI_OPTLEVEL */ #define DBOI_OPTIMIZED_NONE 0 diff --git a/include/hbrddcdx.h b/include/hbrddcdx.h index c0dfcc48c0..b91d1bd1a3 100644 --- a/include/hbrddcdx.h +++ b/include/hbrddcdx.h @@ -62,16 +62,13 @@ HB_EXTERN_BEGIN #define CDX_PAGELEN (1<uiIndexPageSize ); + if( iPageSize && iPageSize >= 0x200 && iPageSize <= 0x2000 && + ( ( iPageSize - 1 ) & iPageSize ) == 0 ) + pData->uiIndexPageSize = ( HB_USHORT ) iPageSize; + break; + } case RDDI_TRIGGER: { char * szTrigger = pData->szTrigger; diff --git a/src/rdd/dbfcdx/dbfcdx1.c b/src/rdd/dbfcdx/dbfcdx1.c index 38ea72f425..0546bdd0d9 100644 --- a/src/rdd/dbfcdx/dbfcdx1.c +++ b/src/rdd/dbfcdx/dbfcdx1.c @@ -78,17 +78,11 @@ #include "hbregex.h" #include "hbapicdp.h" -#if 1 -#define hb_cdxFilePageOffset( I, B ) ( ( HB_FOFFSET ) ( B ) << ( ( I )->fLargeFile ? CDX_PAGELEN_BITS : 0 ) ) -#define hb_cdxFilePageNum( I, O ) ( ( HB_ULONG ) ( ( O ) >> ( ( I )->fLargeFile ? CDX_PAGELEN_BITS : 0 ) ) ) -#define hb_cdxFilePageNext( I, C ) ( ( C ) << ( ( I )->fLargeFile ? 0 : CDX_PAGELEN_BITS ) ) -#define hb_cdxFilePageRootValid( I, B ) ( ( I )->fLargeFile ? CDX_PAGELEN != CDX_DUMMYNODE : ( ( B ) % CDX_PAGELEN == 0 ) ) -#else -#define hb_cdxFilePageOffset( I, B ) ( ( HB_FOFFSET ) ( B ) ) -#define hb_cdxFilePageNum( I, O ) ( ( HB_ULONG ) ( O ) ) -#define hb_cdxFilePageNext( I, C ) ( ( C ) << CDX_PAGELEN_BITS ) -#define hb_cdxFilePageRootValid( I, B ) ( ( B ) % CDX_PAGELEN == 0 ) -#endif +#define hb_cdxFilePageOffset( I, B ) ( ( HB_FOFFSET ) ( B ) << ( ( I )->fLargeFile ? ( I )->uiPageBits : 0 ) ) +#define hb_cdxFilePageNum( I, O ) ( ( HB_ULONG ) ( ( O ) >> ( ( I )->fLargeFile ? ( I )->uiPageBits : 0 ) ) ) +#define hb_cdxFilePageNext( I, C ) ( ( C ) << ( ( I )->fLargeFile ? 0 : ( I )->uiPageBits ) ) +#define hb_cdxFilePageRootValid( I, B ) ( ( I )->fLargeFile ? ( B ) != CDX_DUMMYNODE : ( ( B ) % ( I )->uiPageLen == 0 ) ) + /* * Tag->fRePos = HB_TRUE means that rootPage->...->childLeafPage path is * bad and has to be reloaded @@ -1012,13 +1006,10 @@ static HB_ULONG hb_cdxIndexGetAvailPage( LPCDXINDEX pIndex, HB_BOOL fHeader ) HB_ULONG ulPage; if( pIndex->fReadonly ) - { hb_errInternal( 9101, "hb_cdxIndexGetAvailPage on readonly database.", NULL, NULL ); - } + if( pIndex->fShared && ! pIndex->lockWrite ) - { hb_errInternal( 9102, "hb_cdxIndexGetAvailPage on not locked index file.", NULL, NULL ); - } if( pIndex->freePage != 0 && pIndex->freePage != CDX_DUMMYNODE && ! fHeader ) { @@ -1034,38 +1025,45 @@ static HB_ULONG hb_cdxIndexGetAvailPage( LPCDXINDEX pIndex, HB_BOOL fHeader ) { if( hb_fileReadAt( pFile, byBuf, 4, hb_cdxFilePageOffset( pIndex, ulPage ) ) != 4 ) hb_errInternal( EDBF_READ, "hb_cdxIndexGetAvailPage: Read index page failed.", NULL, NULL ); - pIndex->freePage = HB_GET_LE_UINT32( byBuf ); #ifdef HB_CDX_DBGUPDT cdxReadNO++; #endif + pIndex->freePage = HB_GET_LE_UINT32( byBuf ); } } else { - int iCnt = ( fHeader ? CDX_HEADERPAGES : 1 ); + HB_SIZE nSize = fHeader ? pIndex->uiHeaderLen : pIndex->uiPageLen, nLen = 0; if( pIndex->nextAvail == CDX_DUMMYNODE ) pIndex->nextAvail = hb_cdxFilePageNum( pIndex, hb_fileSize( pFile ) ); ulPage = pIndex->nextAvail; - pIndex->nextAvail += hb_cdxFilePageNext( pIndex, iCnt ); + do + { + pIndex->nextAvail += hb_cdxFilePageNext( pIndex, 1 ); + nLen += pIndex->uiPageLen; + } + while( nLen < nSize ); /* TODO: ### */ if( fHeader ) { - HB_BYTE byPageBuf[ CDX_PAGELEN ]; - HB_FOFFSET fOffset = hb_cdxFilePageOffset( pIndex, ulPage ); + HB_BYTE * byPageBuf; + + if( nSize < ( HB_SIZE ) pIndex->uiPageLen ) + nSize = pIndex->uiPageLen; + byPageBuf = ( HB_BYTE * ) hb_xgrabz( nSize ); hb_cdxIndexLockFlush( pIndex ); - memset( byPageBuf, 0, CDX_PAGELEN ); - do - { - if( hb_fileWriteAt( pFile, byPageBuf, CDX_PAGELEN, fOffset ) != CDX_PAGELEN ) - hb_errInternal( EDBF_WRITE, "Write in index page failed.", NULL, NULL ); - fOffset += CDX_PAGELEN; - } - while( --iCnt ); + if( hb_fileWriteAt( pFile, byPageBuf, nSize, + hb_cdxFilePageOffset( pIndex, ulPage ) ) != nSize ) + hb_errInternal( EDBF_WRITE, "Write in index page failed.", NULL, NULL ); +#ifdef HB_CDX_DBGUPDT + cdxWriteNO++; +#endif pIndex->fChanged = HB_TRUE; + hb_xfree( byPageBuf ); } } return ulPage; @@ -1078,7 +1076,7 @@ static void hb_cdxIndexPutAvailPage( LPCDXINDEX pIndex, HB_ULONG ulPage, HB_BOOL { if( ulPage != 0 && ulPage != CDX_DUMMYNODE ) { - int iCnt = ( fHeader ? CDX_HEADERPAGES : 1 ); + HB_SIZE nSize = fHeader ? pIndex->uiHeaderLen : pIndex->uiPageLen, nLen = 0; LPCDXLIST pLst; if( pIndex->fReadonly ) @@ -1095,8 +1093,9 @@ static void hb_cdxIndexPutAvailPage( LPCDXINDEX pIndex, HB_ULONG ulPage, HB_BOOL pLst->pNext = pIndex->freeLst; pIndex->freeLst = pLst; ulPage += hb_cdxFilePageNext( pIndex, 1 ); + nLen += pIndex->uiPageLen; } - while( --iCnt ); + while( nLen < nSize ); } } @@ -1106,9 +1105,7 @@ static void hb_cdxIndexPutAvailPage( LPCDXINDEX pIndex, HB_ULONG ulPage, HB_BOOL static void hb_cdxIndexFlushAvailPage( LPCDXINDEX pIndex ) { LPCDXLIST pLst = pIndex->freeLst; - HB_BYTE byPageBuf[ CDX_PAGELEN ]; HB_ULONG ulPage; - HB_BOOL fClean = HB_TRUE; if( pIndex->fReadonly ) hb_errInternal( 9101, "hb_cdxIndexFlushAvailPage on readonly database.", NULL, NULL ); @@ -1117,24 +1114,26 @@ static void hb_cdxIndexFlushAvailPage( LPCDXINDEX pIndex ) hb_cdxIndexLockFlush( pIndex ); ulPage = pIndex->freePage; - while( pLst && pLst->fStat ) + if( pLst && pLst->fStat ) { - if( fClean ) + HB_BYTE * byPageBuf = ( HB_BYTE * ) hb_xgrabz( pIndex->uiPageLen ); + + do { - memset( byPageBuf, 0, CDX_PAGELEN ); - fClean = HB_FALSE; - } - HB_PUT_LE_UINT32( byPageBuf, pLst->nextPage ); - if( hb_fileWriteAt( pIndex->pFile, byPageBuf, CDX_PAGELEN, - hb_cdxFilePageOffset( pIndex, ulPage ) ) != CDX_PAGELEN ) - hb_errInternal( EDBF_WRITE, "Write in index page failed.", NULL, NULL ); - pIndex->fChanged = HB_TRUE; - ulPage = pLst->nextPage; - pLst->fStat = HB_FALSE; - pLst = pLst->pNext; + HB_PUT_LE_UINT32( byPageBuf, pLst->nextPage ); + if( hb_fileWriteAt( pIndex->pFile, byPageBuf, pIndex->uiPageLen, + hb_cdxFilePageOffset( pIndex, ulPage ) ) != pIndex->uiPageLen ) + hb_errInternal( EDBF_WRITE, "Write in index page failed.", NULL, NULL ); #ifdef HB_CDX_DBGUPDT - cdxWriteNO++; + cdxWriteNO++; #endif + pIndex->fChanged = HB_TRUE; + ulPage = pLst->nextPage; + pLst->fStat = HB_FALSE; + pLst = pLst->pNext; + } + while( pLst && pLst->fStat ); + hb_xfree( byPageBuf ); } } @@ -1157,10 +1156,8 @@ static void hb_cdxIndexDropAvailPage( LPCDXINDEX pIndex ) * write index page */ static void hb_cdxIndexPageWrite( LPCDXINDEX pIndex, HB_ULONG ulPage, - const HB_BYTE * pBuffer, HB_BOOL fHeader ) + const HB_BYTE * pBuffer, HB_SIZE nSize ) { - HB_SIZE nSize = fHeader ? CDX_HEADERLEN : CDX_PAGELEN; - if( pIndex->fReadonly ) hb_errInternal( 9101, "hb_cdxIndexPageWrite on readonly database.", NULL, NULL ); if( pIndex->fShared && ! pIndex->lockWrite ) @@ -1180,10 +1177,8 @@ static void hb_cdxIndexPageWrite( LPCDXINDEX pIndex, HB_ULONG ulPage, * read index page */ static void hb_cdxIndexPageRead( LPCDXINDEX pIndex, HB_ULONG ulPage, - HB_BYTE * pBuffer, HB_BOOL fHeader ) + HB_BYTE * pBuffer, HB_SIZE nSize ) { - HB_SIZE nSize = fHeader ? CDX_HEADERLEN : CDX_PAGELEN; - if( pIndex->fShared && ! ( pIndex->lockRead || pIndex->lockWrite ) ) hb_errInternal( 9103, "hb_cdxIndexPageRead on not locked index file.", NULL, NULL ); @@ -2285,7 +2280,8 @@ static void hb_cdxPageLoad( LPCDXPAGE pPage ) pPage->fBufChanged = HB_FALSE; } hb_cdxIndexPageRead( pPage->TagParent->pIndex, pPage->Page, - ( HB_BYTE * ) &pPage->node, HB_FALSE ); + ( HB_BYTE * ) &pPage->node, + pPage->TagParent->pIndex->uiPageLen ); pPage->PageType = ( HB_BYTE ) HB_GET_LE_UINT16( pPage->node.intNode.attr ); pPage->Left = HB_GET_LE_UINT32( pPage->node.intNode.leftPtr ); pPage->Right = HB_GET_LE_UINT32( pPage->node.intNode.rightPtr ); @@ -2365,7 +2361,8 @@ static void hb_cdxPageStore( LPCDXPAGE pPage ) #endif } hb_cdxIndexPageWrite( pPage->TagParent->pIndex, pPage->Page, - ( const HB_BYTE * ) &pPage->node, HB_FALSE ); + ( const HB_BYTE * ) &pPage->node, + pPage->TagParent->pIndex->uiPageLen ); #ifdef HB_CDX_DBGCODE_EXT hb_cdxPageCheckKeys( pPage ); #endif @@ -3433,8 +3430,8 @@ static void hb_cdxTagHeaderStore( LPCDXTAG pTag ) memset( &tagHeader, 0, sizeof( tagHeader ) ); HB_PUT_LE_UINT32( tagHeader.rootPtr, pTag->RootBlock ); HB_PUT_LE_UINT16( tagHeader.keySize, pTag->uiLen ); - HB_PUT_LE_UINT16( tagHeader.headerLen, CDX_HEADERLEN ); - HB_PUT_LE_UINT16( tagHeader.pageLen, CDX_PAGELEN ); + HB_PUT_LE_UINT16( tagHeader.headerLen, pTag->pIndex->uiHeaderLen ); + HB_PUT_LE_UINT16( tagHeader.pageLen, pTag->pIndex->uiPageLen ); tagHeader.indexOpt = pTag->OptFlags; if( pTag->TagBlock == 0 ) { @@ -3471,7 +3468,8 @@ static void hb_cdxTagHeaderStore( LPCDXTAG pTag ) } } hb_cdxIndexPageWrite( pTag->pIndex, pTag->TagBlock, - ( const HB_BYTE * ) &tagHeader, HB_TRUE ); + ( const HB_BYTE * ) &tagHeader, + sizeof( tagHeader ) ); } #if defined( HB_SIXCDX ) @@ -3496,7 +3494,7 @@ static void hb_cdxTagLoad( LPCDXTAG pTag ) /* read the page from a file */ hb_cdxIndexPageRead( pTag->pIndex, pTag->TagBlock, - ( HB_BYTE * ) &tagHeader, HB_TRUE ); + ( HB_BYTE * ) &tagHeader, sizeof( tagHeader ) ); uiForPos = HB_GET_LE_UINT16( tagHeader.forExpPos ); uiForLen = HB_GET_LE_UINT16( tagHeader.forExpLen ); @@ -3723,9 +3721,8 @@ static void hb_cdxTagClose( LPCDXTAG pTag ) pTag->RootPage = NULL; } if( pTag->TagChanged ) - { hb_cdxTagHeaderStore( pTag ); - } + pTag->fRePos = HB_TRUE; } @@ -3739,7 +3736,7 @@ static void hb_cdxTagOpen( LPCDXTAG pTag ) if( ! pTag->RootPage ) { hb_cdxIndexPageRead( pTag->pIndex, pTag->TagBlock, - ( HB_BYTE * ) &tagHeader, HB_TRUE ); + ( HB_BYTE * ) &tagHeader, sizeof( tagHeader ) ); pTag->RootBlock = HB_GET_LE_UINT32( tagHeader.rootPtr ); if( pTag->RootBlock && pTag->RootBlock != CDX_DUMMYNODE ) pTag->RootPage = hb_cdxPageNew( pTag, NULL, pTag->RootBlock ); @@ -4797,6 +4794,12 @@ static LPCDXINDEX hb_cdxIndexNew( CDXAREAP pArea ) pIndex->pFile = NULL; pIndex->pArea = pArea; pIndex->nextAvail = CDX_DUMMYNODE; + pIndex->uiHeaderLen = CDX_HEADERLEN; + pIndex->uiPageLen = CDX_PAGELEN; + pIndex->uiPageBits = CDX_PAGELEN_BITS; + while( ( 1 << pIndex->uiPageBits ) < pIndex->uiPageLen ) + ++pIndex->uiPageBits; + return pIndex; } @@ -8693,6 +8696,11 @@ static HB_ERRCODE hb_cdxOrderInfo( CDXAREAP pArea, HB_USHORT uiIndex, LPDBORDERI DBOI_TYPE_COMPOUND : DBOI_TYPE_UNDEF ); break; + case DBOI_INDEXPAGESIZE: + pInfo->itmResult = hb_itemPutNI( pInfo->itmResult, pTag ? + pTag->pIndex->uiPageLen : 0 ); + break; + default: return SUPER_ORDINFO( ( AREAP ) pArea, uiIndex, pInfo ); diff --git a/src/rdd/dbfnsx/dbfnsx1.c b/src/rdd/dbfnsx/dbfnsx1.c index 3a93257007..4b71ce7c61 100644 --- a/src/rdd/dbfnsx/dbfnsx1.c +++ b/src/rdd/dbfnsx/dbfnsx1.c @@ -7652,6 +7652,9 @@ static HB_ERRCODE hb_nsxOrderInfo( NSXAREAP pArea, HB_USHORT uiIndex, LPDBORDERI pInfo->itmResult = hb_itemPutNI( pInfo->itmResult, pTag->pIndex->iTags > 1 ? DBOI_TYPE_COMPOUND : DBOI_TYPE_COMPACT ); break; + case DBOI_INDEXPAGESIZE: + pInfo->itmResult = hb_itemPutNI( pInfo->itmResult, NSX_PAGELEN ); + break; } } else if( pInfo->itmResult ) @@ -7776,6 +7779,7 @@ static HB_ERRCODE hb_nsxOrderInfo( NSXAREAP pArea, HB_USHORT uiIndex, LPDBORDERI case DBOI_ORDERCOUNT: case DBOI_SCOPEEVAL: case DBOI_UPDATECOUNTER: + case DBOI_INDEXPAGESIZE: hb_itemPutNI( pInfo->itmResult, 0 ); break; case DBOI_FILEHANDLE: diff --git a/src/rdd/dbfntx/dbfntx1.c b/src/rdd/dbfntx/dbfntx1.c index 9f13b4e7e2..7e01b4b1be 100644 --- a/src/rdd/dbfntx/dbfntx1.c +++ b/src/rdd/dbfntx/dbfntx1.c @@ -7264,6 +7264,9 @@ static HB_ERRCODE hb_ntxOrderInfo( NTXAREAP pArea, HB_USHORT uiIndex, LPDBORDERI DBOI_TYPE_COMPOUND : DBOI_TYPE_NONCOMPACT ); #endif break; + case DBOI_INDEXPAGESIZE: + hb_itemPutNI( pInfo->itmResult, NTXBLOCKSIZE ); + break; } } else if( pInfo->itmResult ) @@ -7388,6 +7391,7 @@ static HB_ERRCODE hb_ntxOrderInfo( NTXAREAP pArea, HB_USHORT uiIndex, LPDBORDERI case DBOI_ORDERCOUNT: case DBOI_SCOPEEVAL: case DBOI_UPDATECOUNTER: + case DBOI_INDEXPAGESIZE: hb_itemPutNI( pInfo->itmResult, 0 ); break; case DBOI_FILEHANDLE: