2015-03-03 16:26 UTC+0100 Przemyslaw Czerpak (druzus/at/poczta.onet.pl)

* contrib/rddads/ads1.c
    ! use AdsSetLongLong() (if available) instead of AdsSetDouble() to not
      strip less significant bits from 64bit integer number during conversion
      to double
    * allow ADS to decide if writing into rowver and modtime fields is legal
      instead of generating our own arbitrary RTE

  * include/dbinfo.ch
  * src/rdd/workarea.c
    + added new dbInfo() action DBI_TRANSREC
      It indicates if area is destination table of currently processed COPY TO
      or APPEND FROM operation.

  * include/hbapirdd.h
  * src/rdd/wafunc.c
    + added new C function:
         HB_ERRCODE hb_dbTransCounters( LPDBTRANSINFO lpdbTransInfo );
      It copies field counters from source into destination table used
      in transfer operation.

  * src/rdd/dbcmd.c
  * src/rdd/wafunc.c
    + call DBI_TRANSREC to inform destination area that record transfer
      operation starts and stop. It allows destination RDD to change
      rules used for assign to automatically updated fields, i.e. unblock
      such operation.
    + call hb_dbTransCounters() to update counters in destination table
      after COPY TO operation

  * src/rdd/sdf1.c
  * src/rdd/delim1.c
    * clear AutoInc flag

  * src/rdd/dbf1.c
    + allow to set get and set counter for RowVer fields using DBS_COUNTER
      action
    * return HB_FAILURE for DBS_COUNTER and DBS_STEP if it's not supported
      by given field.
    + added support for DBI_TRANSREC - in case of DBF* RDDs it unblocks
      writing to automatically updated fields
This commit is contained in:
Przemysław Czerpak
2015-03-03 16:26:28 +01:00
parent 4617ba29d7
commit 03e7b6da6e
11 changed files with 156 additions and 32 deletions

View File

@@ -10,6 +10,48 @@
* Change, ! Fix, % Optimization, + Addition, - Removal, ; Comment
*/
2015-03-03 16:26 UTC+0100 Przemyslaw Czerpak (druzus/at/poczta.onet.pl)
* contrib/rddads/ads1.c
! use AdsSetLongLong() (if available) instead of AdsSetDouble() to not
strip less significant bits from 64bit integer number during conversion
to double
* allow ADS to decide if writing into rowver and modtime fields is legal
instead of generating our own arbitrary RTE
* include/dbinfo.ch
* src/rdd/workarea.c
+ added new dbInfo() action DBI_TRANSREC
It indicates if area is destination table of currently processed COPY TO
or APPEND FROM operation.
* include/hbapirdd.h
* src/rdd/wafunc.c
+ added new C function:
HB_ERRCODE hb_dbTransCounters( LPDBTRANSINFO lpdbTransInfo );
It copies field counters from source into destination table used
in transfer operation.
* src/rdd/dbcmd.c
* src/rdd/wafunc.c
+ call DBI_TRANSREC to inform destination area that record transfer
operation starts and stop. It allows destination RDD to change
rules used for assign to automatically updated fields, i.e. unblock
such operation.
+ call hb_dbTransCounters() to update counters in destination table
after COPY TO operation
* src/rdd/sdf1.c
* src/rdd/delim1.c
* clear AutoInc flag
* src/rdd/dbf1.c
+ allow to set get and set counter for RowVer fields using DBS_COUNTER
action
* return HB_FAILURE for DBS_COUNTER and DBS_STEP if it's not supported
by given field.
+ added support for DBI_TRANSREC - in case of DBF* RDDs it unblocks
writing to automatically updated fields
2015-03-03 15:57 UTC+0100 Przemyslaw Czerpak (druzus/at/poczta.onet.pl)
* contrib/gtalleg/gtallegd.c
* contrib/gtqtc/gtqtc1.cpp

View File

@@ -2694,10 +2694,20 @@ static HB_ERRCODE adsPutValue( ADSAREAP pArea, HB_USHORT uiIndex, PHB_ITEM pItem
}
break;
case HB_FT_LONG:
case HB_FT_INTEGER:
case HB_FT_DOUBLE:
case HB_FT_ROWVER:
case HB_FT_AUTOINC:
case HB_FT_INTEGER:
#if ADS_LIB_VERSION >= 700 && ! defined( HB_LONG_LONG_OFF )
if( HB_IS_NUMERIC( pItem ) )
{
bTypeError = HB_FALSE;
u32RetVal = AdsSetLongLong( pArea->hTable, ADSFIELD( uiIndex ), hb_itemGetNInt( pItem ) );
/* write to autoincrement field will gen error 5066 */
}
break;
#endif
case HB_FT_LONG:
case HB_FT_DOUBLE:
case HB_FT_CURDOUBLE:
case HB_FT_CURRENCY:
if( HB_IS_NUMERIC( pItem ) )

View File

@@ -292,6 +292,7 @@
#define DBI_ISTEMPORARY 145 /* Is the table a temporary one? */
#define DBI_LOCKTEST 146 /* record / file lock test */
#define DBI_CODEPAGE 147 /* Codepage used */
#define DBI_TRANSREC 148 /* Is it destination table of currently processed COPY TO or APPEND FROM operation? */
/* RECORD MAP (RM) support */
#define DBI_RM_SUPPORTED 150 /* has WA RDD record map support? */

View File

@@ -1207,6 +1207,7 @@ extern HB_EXPORT HB_ERRCODE hb_rddCreateTableTemp(
const char * szAlias,
const char * szCpId, HB_ULONG ulConnection,
PHB_ITEM pStruct );
extern HB_EXPORT HB_ERRCODE hb_dbTransCounters( LPDBTRANSINFO lpdbTransInfo );
extern HB_EXPORT HB_ERRCODE hb_dbTransStruct(
AREAP lpaSource, AREAP lpaDest,
LPDBTRANSINFO lpdbTransInfo,

View File

@@ -233,6 +233,7 @@ typedef struct _DBFAREA
HB_BOOL fFLocked; /* HB_TRUE if file is locked */
HB_BOOL fHeaderLocked; /* HB_TRUE if DBF header is locked */
HB_BOOL fPackMemo; /* Pack memo file in pack operation */
HB_BOOL fTransRec; /* HB_TRUE if records are transfered to this area, allow to change autoupdate fields and disable their initialization */
HB_BOOL fTrigger; /* Execute trigger function */
LPDBOPENINFO lpdbOpenInfo; /* Pointer to current dbOpenInfo structure in OPEN/CREATE methods */
LPDBRELINFO lpdbPendingRel; /* Pointer to parent rel struct */

View File

@@ -1973,6 +1973,8 @@ HB_FUNC( __DBTRANS )
NULL, pFields );
if( errCode == HB_SUCCESS )
{
PHB_ITEM pTransItm;
hb_rddSelectWorkAreaNumber( dbTransInfo.lpaSource->uiArea );
dbTransInfo.dbsci.itmCobFor = hb_param( 3, HB_IT_BLOCK );
@@ -1989,7 +1991,12 @@ HB_FUNC( __DBTRANS )
dbTransInfo.dbsci.fIgnoreDuplicates = HB_FALSE;
dbTransInfo.dbsci.fBackward = HB_FALSE;
pTransItm = hb_itemPutL( NULL, HB_TRUE );
SELF_INFO( dbTransInfo.lpaDest, DBI_TRANSREC, pTransItm );
errCode = SELF_TRANS( dbTransInfo.lpaSource, &dbTransInfo );
SELF_INFO( dbTransInfo.lpaDest, DBI_TRANSREC, pTransItm );
}
if( dbTransInfo.lpTransItems )

View File

@@ -173,6 +173,8 @@ static HB_BOOL hb_dbfIsAutoIncField( LPFIELD pField )
if( pField->uiType == HB_FT_AUTOINC )
return pField->uiLen - pField->uiDec > 4 ?
HB_AUTOINC_LONG : HB_AUTOINC_STD;
else if( pField->uiType == HB_FT_ROWVER )
return HB_AUTOINC_LONG;
else if( ( pField->uiFlags & HB_FF_AUTOINC ) != 0 )
{
switch( pField->uiType )
@@ -2627,13 +2629,14 @@ static HB_ERRCODE hb_dbfPutValue( DBFAREAP pArea, HB_USHORT uiIndex, PHB_ITEM pI
}
}
else if( pField->uiType == HB_FT_TIMESTAMP ||
pField->uiType == HB_FT_TIME )
pField->uiType == HB_FT_TIME ||
( pField->uiType == HB_FT_MODTIME && pArea->fTransRec ) )
{
long lDate, lTime;
hb_itemGetTDT( pItem, &lDate, &lTime );
ptr = pArea->pRecord + pArea->pFieldOffset[ uiIndex ];
if( pField->uiType == HB_FT_TIMESTAMP )
if( pField->uiType != HB_FT_TIME )
{
HB_PUT_LE_UINT32( ptr, lDate );
ptr += 4;
@@ -2664,7 +2667,9 @@ static HB_ERRCODE hb_dbfPutValue( DBFAREAP pArea, HB_USHORT uiIndex, PHB_ITEM pI
'*', pField->uiLen );
}
}
else if( pField->uiType == HB_FT_INTEGER )
else if( pField->uiType == HB_FT_INTEGER ||
( pArea->fTransRec && ( pField->uiType == HB_FT_AUTOINC ||
pField->uiType == HB_FT_ROWVER ) ) )
{
HB_MAXINT lVal;
double dVal;
@@ -3581,14 +3586,21 @@ static HB_ERRCODE hb_dbfInfo( DBFAREAP pArea, HB_USHORT uiIndex, PHB_ITEM pItem
( HB_MAXINT ) ( HB_NHANDLE ) hb_fileHandle( pArea->pMemoFile ) );
break;
case DBI_TRANSREC:
{
HB_BOOL fTransRec = pArea->fTransRec;
if( HB_IS_LOGICAL( pItem ) )
pArea->fTransRec = hb_itemGetL( pItem );
hb_itemPutL( pItem, fTransRec );
break;
}
case DBI_SHARED:
{
HB_BOOL fShared = pArea->fShared;
if( HB_IS_LOGICAL( pItem ) )
{
pArea->fShared = hb_itemGetL( pItem );
}
hb_itemPutL( pItem, fShared );
break;
}
@@ -3772,9 +3784,9 @@ static HB_ERRCODE hb_dbfFieldInfo( DBFAREAP pArea, HB_USHORT uiIndex, HB_USHORT
hb_dbfGetNullFlag( pArea, pArea->pFieldBits[ uiIndex ].uiNullBit ) );
return HB_SUCCESS;
case DBS_COUNTER:
nValue = 0;
if( hb_dbfIsAutoIncField( pArea->area.lpFields + uiIndex - 1 ) != HB_AUTOINC_NONE )
{
nValue = 0;
fLck = HB_FALSE;
if( pArea->fShared && ! pArea->fFLocked && ! pArea->fHeaderLocked )
{
@@ -3790,13 +3802,15 @@ static HB_ERRCODE hb_dbfFieldInfo( DBFAREAP pArea, HB_USHORT uiIndex, HB_USHORT
if( fLck )
SELF_RAWLOCK( &pArea->area, HEADER_UNLOCK, 0 );
hb_itemPutNInt( pItem, nValue );
return HB_SUCCESS;
}
hb_itemPutNInt( pItem, nValue );
return HB_SUCCESS;
hb_itemClear( pItem );
return HB_FAILURE;
case DBS_STEP:
iValue = 0;
if( hb_dbfIsAutoIncField( pArea->area.lpFields + uiIndex - 1 ) != HB_AUTOINC_NONE )
{
iValue = 0;
if( HB_IS_NUMERIC( pItem ) )
{
fLck = HB_FALSE;
@@ -3813,9 +3827,11 @@ static HB_ERRCODE hb_dbfFieldInfo( DBFAREAP pArea, HB_USHORT uiIndex, HB_USHORT
}
else
iValue = hb_dbfNextValueStep( pArea, uiIndex - 1, 0 );
hb_itemPutNI( pItem, iValue );
return HB_SUCCESS;
}
hb_itemPutNI( pItem, iValue );
return HB_SUCCESS;
hb_itemClear( pItem );
return HB_FAILURE;
default:
return SUPER_FIELDINFO( &pArea->area, uiIndex, uiType, pItem );
}
@@ -4935,6 +4951,7 @@ static HB_ERRCODE hb_dbfTrans( DBFAREAP pArea, LPDBTRANSINFO pTransInfo )
hb_itemRelease( pPutRec );
}
}
return SUPER_TRANS( &pArea->area, pTransInfo );
}
@@ -4980,10 +4997,10 @@ static HB_ERRCODE hb_dbfZap( DBFAREAP pArea )
/* reset autoincrement and row version fields */
for( uiField = 0; uiField < pArea->area.uiFieldCount; uiField++ )
{
if( hb_dbfIsAutoIncField( &pArea->area.lpFields[ uiField ] ) != HB_AUTOINC_NONE )
hb_dbfNextValueSet( pArea, uiField, 1 );
else if( pArea->area.lpFields[ uiField ].uiType == HB_FT_ROWVER )
if( pArea->area.lpFields[ uiField ].uiType == HB_FT_ROWVER )
hb_dbfRowVerSet( pArea, uiField, 0 );
else if( hb_dbfIsAutoIncField( &pArea->area.lpFields[ uiField ] ) != HB_AUTOINC_NONE )
hb_dbfNextValueSet( pArea, uiField, 1 );
}
/* Zap memo file */

View File

@@ -1104,6 +1104,9 @@ static HB_ERRCODE hb_delimAddField( DELIMAREAP pArea, LPDBFIELDINFO pFieldInfo )
}
break;
case HB_FT_LONG:
break;
case HB_FT_FLOAT:
pFieldInfo->uiType = HB_FT_LONG;
break;
@@ -1140,9 +1143,6 @@ static HB_ERRCODE hb_delimAddField( DELIMAREAP pArea, LPDBFIELDINFO pFieldInfo )
}
break;
case HB_FT_LONG:
break;
case HB_FT_TIME:
pFieldInfo->uiType = HB_FT_TIMESTAMP;
pFieldInfo->uiLen = 12;
@@ -1165,6 +1165,8 @@ static HB_ERRCODE hb_delimAddField( DELIMAREAP pArea, LPDBFIELDINFO pFieldInfo )
break;
}
pFieldInfo->uiFlags &= ~HB_FF_AUTOINC;
/* Update field offset */
pArea->pFieldOffset[ pArea->area.uiFieldCount ] = pArea->uiRecordLen;
pArea->uiRecordLen += pFieldInfo->uiLen;

View File

@@ -848,6 +848,10 @@ static HB_ERRCODE hb_sdfAddField( SDFAREAP pArea, LPDBFIELDINFO pFieldInfo )
}
break;
case HB_FT_STRING:
case HB_FT_LONG:
break;
case HB_FT_FLOAT:
pFieldInfo->uiType = HB_FT_LONG;
break;
@@ -883,10 +887,6 @@ static HB_ERRCODE hb_sdfAddField( SDFAREAP pArea, LPDBFIELDINFO pFieldInfo )
}
break;
case HB_FT_LONG:
case HB_FT_STRING:
break;
case HB_FT_TIME:
pFieldInfo->uiType = HB_FT_TIMESTAMP;
pFieldInfo->uiLen = 12;
@@ -907,6 +907,8 @@ static HB_ERRCODE hb_sdfAddField( SDFAREAP pArea, LPDBFIELDINFO pFieldInfo )
break;
}
pFieldInfo->uiFlags &= ~HB_FF_AUTOINC;
/* Update field offset */
pArea->pFieldOffset[ pArea->area.uiFieldCount ] = pArea->uiRecordLen;
pArea->uiRecordLen += pFieldInfo->uiLen;

View File

@@ -870,6 +870,34 @@ static const char * hb_dbTransFieldPos( PHB_ITEM pFields, HB_USHORT uiField )
return szField;
}
/* update counters for autoinc and rowver fields */
HB_ERRCODE hb_dbTransCounters( LPDBTRANSINFO lpdbTransInfo )
{
PHB_ITEM pItem = hb_itemNew( NULL );
HB_USHORT uiCount;
for( uiCount = 1; uiCount <= lpdbTransInfo->uiItemCount; ++uiCount )
{
LPDBTRANSITEM lpdbTransItem = &lpdbTransInfo->lpTransItems[ uiCount ];
if( SELF_FIELDINFO( lpdbTransInfo->lpaSource, lpdbTransItem->uiSource,
DBS_COUNTER, pItem ) == HB_SUCCESS &&
SELF_FIELDINFO( lpdbTransInfo->lpaDest, lpdbTransItem->uiDest,
DBS_COUNTER, pItem ) == HB_SUCCESS )
{
hb_itemClear( pItem );
if( SELF_FIELDINFO( lpdbTransInfo->lpaSource, lpdbTransItem->uiSource,
DBS_STEP, pItem ) == HB_SUCCESS )
SELF_FIELDINFO( lpdbTransInfo->lpaDest, lpdbTransItem->uiDest,
DBS_STEP, pItem );
}
hb_itemClear( pItem );
}
hb_itemRelease( pItem );
return HB_SUCCESS;
}
HB_ERRCODE hb_dbTransStruct( AREAP lpaSource, AREAP lpaDest,
LPDBTRANSINFO lpdbTransInfo,
PHB_ITEM * pStruct, PHB_ITEM pFields )
@@ -1085,6 +1113,7 @@ HB_ERRCODE hb_rddTransRecords( AREAP pArea,
PHB_ITEM pStruct = NULL;
DBTRANSINFO dbTransInfo;
HB_USHORT uiPrevArea, uiCount, uiSwap;
HB_BOOL fUpdateCtr = HB_FALSE;
HB_ERRCODE errCode;
memset( &dbTransInfo, 0, sizeof( dbTransInfo ) );
@@ -1105,6 +1134,7 @@ HB_ERRCODE hb_rddTransRecords( AREAP pArea,
szCpId, ulConnection, pStruct, pDelim );
if( errCode == HB_SUCCESS )
{
fUpdateCtr = HB_TRUE;
dbTransInfo.lpaDest = lpaClose =
( AREAP ) hb_rddGetCurrentWorkAreaPointer();
}
@@ -1164,6 +1194,8 @@ HB_ERRCODE hb_rddTransRecords( AREAP pArea,
if( errCode == HB_SUCCESS )
{
PHB_ITEM pTransItm;
hb_rddSelectWorkAreaNumber( dbTransInfo.lpaSource->uiArea );
dbTransInfo.dbsci.itmCobFor = pCobFor;
@@ -1180,7 +1212,15 @@ HB_ERRCODE hb_rddTransRecords( AREAP pArea,
dbTransInfo.dbsci.fIgnoreDuplicates = HB_FALSE;
dbTransInfo.dbsci.fBackward = HB_FALSE;
pTransItm = hb_itemPutL( NULL, HB_TRUE );
SELF_INFO( dbTransInfo.lpaDest, DBI_TRANSREC, pTransItm );
errCode = SELF_TRANS( dbTransInfo.lpaSource, &dbTransInfo );
SELF_INFO( dbTransInfo.lpaDest, DBI_TRANSREC, pTransItm );
if( errCode == HB_SUCCESS && fUpdateCtr )
errCode = hb_dbTransCounters( &dbTransInfo );
}
if( dbTransInfo.lpTransItems )

View File

@@ -562,8 +562,8 @@ static HB_ERRCODE hb_waFieldInfo( AREAP pArea, HB_USHORT uiIndex, HB_USHORT uiTy
{
case HB_FT_STRING:
cType = 'C';
uiFlags = HB_FF_NULLABLE | HB_FF_BINARY | HB_FF_COMPRESSED |
HB_FF_ENCRYPTED | HB_FF_UNICODE;
uiFlags = HB_FF_NULLABLE | HB_FF_BINARY | HB_FF_UNICODE |
HB_FF_ENCRYPTED | HB_FF_COMPRESSED;
break;
case HB_FT_LOGICAL:
@@ -631,20 +631,20 @@ static HB_ERRCODE hb_waFieldInfo( AREAP pArea, HB_USHORT uiIndex, HB_USHORT uiTy
case HB_FT_VARLENGTH:
cType = 'Q';
uiFlags = HB_FF_NULLABLE | HB_FF_BINARY | HB_FF_COMPRESSED |
HB_FF_ENCRYPTED | HB_FF_UNICODE;
uiFlags = HB_FF_NULLABLE | HB_FF_BINARY | HB_FF_UNICODE |
HB_FF_ENCRYPTED | HB_FF_COMPRESSED;
break;
case HB_FT_ANY:
cType = 'V';
uiFlags = HB_FF_NULLABLE | HB_FF_BINARY | HB_FF_COMPRESSED |
HB_FF_ENCRYPTED | HB_FF_UNICODE;
uiFlags = HB_FF_NULLABLE | HB_FF_BINARY | HB_FF_UNICODE |
HB_FF_ENCRYPTED | HB_FF_COMPRESSED;
break;
case HB_FT_MEMO:
cType = 'M';
uiFlags = HB_FF_NULLABLE | HB_FF_BINARY | HB_FF_COMPRESSED |
HB_FF_ENCRYPTED | HB_FF_UNICODE;
uiFlags = HB_FF_NULLABLE | HB_FF_BINARY | HB_FF_UNICODE |
HB_FF_ENCRYPTED | HB_FF_COMPRESSED;
break;
case HB_FT_IMAGE:
@@ -790,6 +790,7 @@ static HB_ERRCODE hb_waInfo( AREAP pArea, HB_USHORT uiIndex, PHB_ITEM pItem )
case DBI_CANPUTREC:
case DBI_ISFLOCK:
case DBI_SHARED:
case DBI_TRANSREC:
hb_itemPutL( pItem, HB_FALSE );
break;