2017-09-13 11:40 UTC Viktor Szakats (vszakats users.noreply.github.com)

* config/*/*.mk
  * config/*.mk
  * config/postinst.hb
  * ChangeLog.txt
  * src/rdd/usrrdd/rdds/*.prg
    * sync with 3.4 fork minor code changes, comments, some strings
This commit is contained in:
Viktor Szakats
2017-09-13 11:51:47 +00:00
parent a83c8f1fd8
commit fa876ddc8a
23 changed files with 498 additions and 554 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -44,9 +44,9 @@
*
*/
#include "rddsys.ch"
#include "hbusrrdd.ch"
#include "dbinfo.ch"
#include "hbusrrdd.ch"
#include "rddsys.ch"
/*
* DBTCDX RDD
@@ -62,7 +62,6 @@ REQUEST DBFFPT
ANNOUNCE DBTCDX
FUNCTION DBTCDX_GETFUNCTABLE( pFuncCount, pFuncTable, pSuperTable, nRddID, pSuperRddID )
RETURN USRRDD_GETFUNCTABLE( pFuncCount, pFuncTable, pSuperTable, nRddID, ;
"DBFCDX", {}, pSuperRddID ) /* We are inheriting from DBFCDX */

View File

@@ -44,9 +44,9 @@
*
*/
#include "rddsys.ch"
#include "hbusrrdd.ch"
#include "dbinfo.ch"
#include "hbusrrdd.ch"
#include "rddsys.ch"
/*
* FPTCDX RDD
@@ -58,11 +58,10 @@
REQUEST DBFCDX
REQUEST DBFFPT
/* Announce our RDD for forign REQUESTs */
/* Announce our RDD for foreign REQUESTs */
ANNOUNCE FPTCDX
FUNCTION FPTCDX_GETFUNCTABLE( pFuncCount, pFuncTable, pSuperTable, nRddID, pSuperRddID )
RETURN USRRDD_GETFUNCTABLE( pFuncCount, pFuncTable, pSuperTable, nRddID, ;
"DBFCDX", {}, pSuperRddID ) /* We are inheriting from DBFCDX */

View File

@@ -46,16 +46,16 @@
/*
* A simple RDD which adds automatically update HSX indexes to DBFCDX
* To create new HSX index for current work area use: HSX_CREATE()
* To open already existing one use HSX_OPEN(),
* To close use: HSX_CLOSE()
* To retieve an handle use: HSX_HANDLE()
* To create new HSX index for current work area use: hsx_Create()
* To open already existing one use hsx_Open(),
* To close use: hsx_Close()
* To retrieve an handle use: hsx_Handle()
*/
#include "rddsys.ch"
#include "hbusrrdd.ch"
#include "fileio.ch"
#include "dbinfo.ch"
#include "fileio.ch"
#include "hbusrrdd.ch"
#include "rddsys.ch"
ANNOUNCE HSCDX
@@ -63,8 +63,8 @@ ANNOUNCE HSCDX
* methods: NEW and RELEASE receive pointer to work area structure
* not work area number. It's necessary because the can be executed
* before work area is allocated
* these methods does not have to execute SUPER methods - these is
* always done by low level USRRDD code
* these methods does not have to execute SUPER methods - this is
* always done by low-level USRRDD code
*/
STATIC FUNCTION _HSX_NEW( pWA )
@@ -72,7 +72,7 @@ STATIC FUNCTION _HSX_NEW( pWA )
LOCAL aWData := { .F., {}, {} }
/*
* Set in our private AREA item the array where we will kepp HSX indexes
* Set in our private AREA item the array where we will keep HSX indexes
* and HOT buffer flag
*/
@@ -102,8 +102,7 @@ STATIC FUNCTION _HSX_GOCOLD( nWA )
LOCAL nResult, aWData, nHSX, nRecNo, nKeyNo
nResult := UR_SUPER_GOCOLD( nWA )
IF nResult == HB_SUCCESS
IF ( nResult := UR_SUPER_GOCOLD( nWA ) ) == HB_SUCCESS
aWData := USRRDD_AREADATA( nWA )
IF aWData[ 1 ]
IF ! Empty( aWData[ 2 ] )
@@ -129,8 +128,7 @@ STATIC FUNCTION _HSX_GOHOT( nWA )
LOCAL nResult, aWData
nResult := UR_SUPER_GOHOT( nWA )
IF nResult == HB_SUCCESS
IF ( nResult := UR_SUPER_GOHOT( nWA ) ) == HB_SUCCESS
aWData := USRRDD_AREADATA( nWA )
aWData[ 1 ] := .T.
ENDIF
@@ -141,8 +139,7 @@ STATIC FUNCTION _HSX_APPEND( nWA, lUnlockAll )
LOCAL nResult, aWData
nResult := UR_SUPER_APPEND( nWA, lUnlockAll )
IF nResult == HB_SUCCESS
IF ( nResult := UR_SUPER_APPEND( nWA, lUnlockAll ) ) == HB_SUCCESS
aWData := USRRDD_AREADATA( nWA )
aWData[ 1 ] := .T.
ENDIF
@@ -154,7 +151,7 @@ STATIC FUNCTION _HSX_APPEND( nWA, lUnlockAll )
* with current work are and automatically updated.
*/
FUNCTION HSX_CREATE( cFile, cExpr, nKeySize, nBufSize, lCase, nFiltSet )
FUNCTION hsx_Create( cFile, cExpr, nKeySize, nBufSize, lCase, nFiltSet )
LOCAL aWData, nHsx := -1, nOpenMode
@@ -164,9 +161,7 @@ FUNCTION HSX_CREATE( cFile, cExpr, nKeySize, nBufSize, lCase, nFiltSet )
aWData := USRRDD_AREADATA( Select() )
nOpenMode := iif( dbInfo( DBI_SHARED ), 1, 0 ) + ;
iif( dbInfo( DBI_ISREADONLY ), 2, 0 )
nHsx := hs_Index( cFile, cExpr, nKeySize, nOpenMode, ;
nBufSize, lCase, nFiltSet )
IF nHsx >= 0
IF ( nHsx := hs_Index( cFile, cExpr, nKeySize, nOpenMode, nBufSize, lCase, nFiltSet ) ) >= 0
AAdd( aWData[ 2 ], nHsx )
AAdd( aWData[ 3 ], cFile )
ENDIF
@@ -174,7 +169,7 @@ FUNCTION HSX_CREATE( cFile, cExpr, nKeySize, nBufSize, lCase, nFiltSet )
RETURN nHsx
PROCEDURE HSX_OPEN( cFile, nBufSize )
PROCEDURE hsx_Open( cFile, nBufSize )
LOCAL aWData, nHsx, nOpenMode
@@ -184,8 +179,7 @@ PROCEDURE HSX_OPEN( cFile, nBufSize )
aWData := USRRDD_AREADATA( Select() )
nOpenMode := iif( dbInfo( DBI_SHARED ), 1, 0 ) + ;
iif( dbInfo( DBI_ISREADONLY ), 2, 0 )
nHsx := hs_Open( cFile, nBufSize, nOpenMode )
IF nHsx >= 0
IF ( nHsx := hs_Open( cFile, nBufSize, nOpenMode ) ) >= 0
AAdd( aWData[ 2 ], nHsx )
AAdd( aWData[ 3 ], cFile )
ENDIF
@@ -193,20 +187,21 @@ PROCEDURE HSX_OPEN( cFile, nBufSize )
RETURN
PROCEDURE HSX_CLOSE( xHSX )
PROCEDURE hsx_Close( xHSX )
LOCAL aWData, nSlot
IF Used() .AND. rddName() == "HSCDX"
aWData := USRRDD_AREADATA( Select() )
IF HB_ISNUMERIC( xHSX )
DO CASE
CASE HB_ISNUMERIC( xHSX )
nSlot := AScan( aWData[ 2 ], xHSX )
ELSEIF HB_ISSTRING( xHSX )
CASE HB_ISSTRING( xHSX )
nSlot := AScan( aWData[ 3 ], {| _1 | _1 == xHSX } )
ELSE
OTHERWISE
nSlot := 0
ENDIF
IF nSlot != 0
ENDCASE
IF nSlot > 0
hb_ADel( aWData[ 2 ], nSlot, .T. )
hb_ADel( aWData[ 3 ], nSlot, .T. )
ENDIF
@@ -214,7 +209,7 @@ PROCEDURE HSX_CLOSE( xHSX )
RETURN
FUNCTION HSX_HANDLE( cFile )
FUNCTION hsx_Handle( cFile )
LOCAL aWData, nSlot
@@ -222,13 +217,13 @@ FUNCTION HSX_HANDLE( cFile )
aWData := USRRDD_AREADATA( Select() )
nSlot := AScan( aWData[ 3 ], {| _1 | _1 == cFile } )
IF nSlot != 0
RETURN aWData[ 2, nSlot ]
RETURN aWData[ 2 ][ nSlot ]
ENDIF
ENDIF
RETURN -1
FUNCTION HSX_FILE( nHsx )
FUNCTION hsx_File( nHsx )
LOCAL aWData, nSlot
@@ -236,20 +231,20 @@ FUNCTION HSX_FILE( nHsx )
aWData := USRRDD_AREADATA( Select() )
nSlot := AScan( aWData[ 3 ], nHsx )
IF nSlot != 0
RETURN aWData[ 3, nSlot ]
RETURN aWData[ 3 ][ nSlot ]
ENDIF
ENDIF
RETURN ""
FUNCTION HSX_GET( nSlot )
FUNCTION hsx_Get( nSlot )
LOCAL aWData
IF Used() .AND. rddName() == "HSCDX"
aWData := USRRDD_AREADATA( Select() )
IF nSlot > 0 .AND. nSlot <= Len( aWData[ 2 ] )
RETURN aWData[ 2, nSlot ]
RETURN aWData[ 2 ][ nSlot ]
ENDIF
ENDIF
@@ -269,11 +264,11 @@ FUNCTION HSCDX_GETFUNCTABLE( pFuncCount, pFuncTable, pSuperTable, nRddID, pSuper
LOCAL cSuperRDD := "DBFCDX" /* We are inheriting from DBFCDX */
LOCAL aMyFunc[ UR_METHODCOUNT ]
aMyFunc[ UR_NEW ] := ( @_HSX_NEW() )
aMyFunc[ UR_CLOSE ] := ( @_HSX_CLOSE() )
aMyFunc[ UR_GOCOLD ] := ( @_HSX_GOCOLD() )
aMyFunc[ UR_GOHOT ] := ( @_HSX_GOHOT() )
aMyFunc[ UR_APPEND ] := ( @_HSX_APPEND() )
aMyFunc[ UR_NEW ] := @_HSX_NEW()
aMyFunc[ UR_CLOSE ] := @_HSX_CLOSE()
aMyFunc[ UR_GOCOLD ] := @_HSX_GOCOLD()
aMyFunc[ UR_GOHOT ] := @_HSX_GOHOT()
aMyFunc[ UR_APPEND ] := @_HSX_APPEND()
RETURN USRRDD_GETFUNCTABLE( pFuncCount, pFuncTable, pSuperTable, nRddID, ;
cSuperRDD, aMyFunc, pSuperRddID )

View File

@@ -45,45 +45,43 @@
*/
/*
* A simple RDD which introduce logging to file. It inheriths from
* A simple RDD which introduce logging to file. It inherits from
* any existent RDD but if you write / replace / delete something
* on tables it writes changes in a log file.
*/
#include "rddsys.ch"
#include "hbusrrdd.ch"
#include "fileio.ch"
#include "dbinfo.ch"
#include "fileio.ch"
#include "hbusrrdd.ch"
#include "rddsys.ch"
#define ARRAY_FILENAME 1
#define ARRAY_FHANDLE 2
#define ARRAY_TAG 3
#define ARRAY_ACTIVE 4
#define ARRAY_RDDNAME 5
#define ARRAY_MSGLOGBLOCK 6
#define ARRAY_USERLOGBLOCK 7
#define ARRAY_FILENAME 1
#define ARRAY_FHANDLE 2
#define ARRAY_TAG 3
#define ARRAY_ACTIVE 4
#define ARRAY_RDDNAME 5
#define ARRAY_MSGLOGBLOCK 6
#define ARRAY_USERLOGBLOCK 7
ANNOUNCE LOGRDD
DYNAMIC HB_LOGRDDINHERIT /* To be defined at user level */
DYNAMIC hb_LogRddInherit /* To be defined at user level */
STATIC s_nRddID := -1
STATIC FUNCTION LOGRDD_INIT( nRDD )
LOCAL lActive, cFileName, cTag, cRDDName
/* Defaults */
cFileName := "changes.log"
lActive := .F.
cTag := NetName() + "\" + hb_UserName()
cRDDName := hb_LogRddInherit()
LOCAL cFileName := "changes.log"
LOCAL lActive := .F.
LOCAL cTag := NetName() + "\" + hb_UserName()
LOCAL cRDDName := hb_LogRddInherit()
/* Log File will be open later so user can change parameters */
/* Store data in RDD cargo */
/* cFileName, nHandle, cTag, lActive, cRDDName, bMsgLogBlock, bUserLogBlock */
/* cFileName, hFile, cTag, lActive, cRDDName, bMsgLogBlock, bUserLogBlock */
USRRDD_RDDDATA( nRDD, { cFileName, NIL, cTag, lActive, cRDDName, NIL, NIL } )
RETURN HB_SUCCESS
@@ -105,9 +103,9 @@ STATIC FUNCTION LOGRDD_EXIT( nRDD )
STATIC FUNCTION LOGRDD_CREATE( nWA, aOpenInfo )
LOCAL nResult := UR_SUPER_CREATE( nWA, aOpenInfo )
LOCAL nResult
IF nResult == HB_SUCCESS
IF ( nResult := UR_SUPER_CREATE( nWA, aOpenInfo ) ) == HB_SUCCESS
ToLog( "CREATE", nWA, aOpenInfo )
ENDIF
@@ -117,9 +115,9 @@ STATIC FUNCTION LOGRDD_CREATE( nWA, aOpenInfo )
STATIC FUNCTION LOGRDD_CREATEFIELDS( nWA, aStruct )
LOCAL nResult := UR_SUPER_CREATEFIELDS( nWA, aStruct )
LOCAL nResult
IF nResult == HB_SUCCESS
IF ( nResult := UR_SUPER_CREATEFIELDS( nWA, aStruct ) ) == HB_SUCCESS
ToLog( "CREATEFIELDS", nWA, aStruct )
ENDIF
@@ -129,9 +127,9 @@ STATIC FUNCTION LOGRDD_CREATEFIELDS( nWA, aStruct )
STATIC FUNCTION LOGRDD_OPEN( nWA, aOpenInfo )
LOCAL nResult := UR_SUPER_OPEN( nWA, aOpenInfo )
LOCAL nResult
IF nResult == HB_SUCCESS
IF ( nResult := UR_SUPER_OPEN( nWA, aOpenInfo ) ) == HB_SUCCESS
ToLog( "OPEN", nWA, aOpenInfo )
ENDIF
@@ -141,11 +139,11 @@ STATIC FUNCTION LOGRDD_OPEN( nWA, aOpenInfo )
STATIC FUNCTION LOGRDD_CLOSE( nWA )
LOCAL cFile := dbInfo( DBI_FULLPATH )
LOCAL cAlias := Alias()
LOCAL nResult := UR_SUPER_CLOSE( nWA )
LOCAL cFile := dbInfo( DBI_FULLPATH )
LOCAL cAlias := Alias()
LOCAL nResult
IF nResult == HB_SUCCESS
IF ( nResult := UR_SUPER_CLOSE( nWA ) ) == HB_SUCCESS
ToLog( "CLOSE", nWA, cFile, cAlias )
ENDIF
@@ -153,9 +151,9 @@ STATIC FUNCTION LOGRDD_CLOSE( nWA )
STATIC FUNCTION LOGRDD_APPEND( nWA, lUnlockAll )
LOCAL nResult := UR_SUPER_APPEND( nWA, lUnlockAll )
LOCAL nResult
IF nResult == HB_SUCCESS
IF ( nResult := UR_SUPER_APPEND( nWA, lUnlockAll ) ) == HB_SUCCESS
ToLog( "APPEND", nWA, lUnlockAll )
ENDIF
@@ -163,9 +161,9 @@ STATIC FUNCTION LOGRDD_APPEND( nWA, lUnlockAll )
STATIC FUNCTION LOGRDD_DELETE( nWA )
LOCAL nResult := UR_SUPER_DELETE( nWA )
LOCAL nResult
IF nResult == HB_SUCCESS
IF ( nResult := UR_SUPER_DELETE( nWA ) ) == HB_SUCCESS
ToLog( "DELETE", nWA )
ENDIF
@@ -173,9 +171,9 @@ STATIC FUNCTION LOGRDD_DELETE( nWA )
STATIC FUNCTION LOGRDD_RECALL( nWA )
LOCAL nResult := UR_SUPER_RECALL( nWA )
LOCAL nResult
IF nResult == HB_SUCCESS
IF ( nResult := UR_SUPER_RECALL( nWA ) ) == HB_SUCCESS
ToLog( "RECALL", nWA )
ENDIF
@@ -186,9 +184,9 @@ STATIC FUNCTION LOGRDD_PUTVALUE( nWA, nField, xValue )
LOCAL xOldValue := FieldGet( nField )
LOCAL nResult := UR_SUPER_PUTVALUE( nWA, nField, xValue )
// Log Only Changes
// Log changes only
IF !( xOldValue == xValue )
IF ! xOldValue == xValue
ToLog( "PUTVALUE", nWA, nField, xValue, xOldValue )
ENDIF
@@ -196,9 +194,9 @@ STATIC FUNCTION LOGRDD_PUTVALUE( nWA, nField, xValue )
STATIC FUNCTION LOGRDD_ZAP( nWA )
LOCAL nResult := UR_SUPER_ZAP( nWA )
LOCAL nResult
IF nResult == HB_SUCCESS
IF ( nResult := UR_SUPER_ZAP( nWA ) ) == HB_SUCCESS
ToLog( "ZAP", nWA )
ENDIF
@@ -220,17 +218,17 @@ FUNCTION LOGRDD_GETFUNCTABLE( pFuncCount, pFuncTable, pSuperTable, nRddID, pSupe
s_nRddID := nRddID
aMyFunc[ UR_INIT ] := ( @LOGRDD_INIT() )
aMyFunc[ UR_EXIT ] := ( @LOGRDD_EXIT() )
aMyFunc[ UR_CREATE ] := ( @LOGRDD_CREATE() )
aMyFunc[ UR_CREATEFIELDS ] := ( @LOGRDD_CREATEFIELDS() )
aMyFunc[ UR_OPEN ] := ( @LOGRDD_OPEN() )
aMyFunc[ UR_CLOSE ] := ( @LOGRDD_CLOSE() )
aMyFunc[ UR_APPEND ] := ( @LOGRDD_APPEND() )
aMyFunc[ UR_DELETE ] := ( @LOGRDD_DELETE() )
aMyFunc[ UR_RECALL ] := ( @LOGRDD_RECALL() )
aMyFunc[ UR_PUTVALUE ] := ( @LOGRDD_PUTVALUE() )
aMyFunc[ UR_ZAP ] := ( @LOGRDD_ZAP() )
aMyFunc[ UR_INIT ] := @LOGRDD_INIT()
aMyFunc[ UR_EXIT ] := @LOGRDD_EXIT()
aMyFunc[ UR_CREATE ] := @LOGRDD_CREATE()
aMyFunc[ UR_CREATEFIELDS ] := @LOGRDD_CREATEFIELDS()
aMyFunc[ UR_OPEN ] := @LOGRDD_OPEN()
aMyFunc[ UR_CLOSE ] := @LOGRDD_CLOSE()
aMyFunc[ UR_APPEND ] := @LOGRDD_APPEND()
aMyFunc[ UR_DELETE ] := @LOGRDD_DELETE()
aMyFunc[ UR_RECALL ] := @LOGRDD_RECALL()
aMyFunc[ UR_PUTVALUE ] := @LOGRDD_PUTVALUE()
aMyFunc[ UR_ZAP ] := @LOGRDD_ZAP()
RETURN USRRDD_GETFUNCTABLE( pFuncCount, pFuncTable, pSuperTable, nRddID, ;
cSuperRDD, aMyFunc, pSuperRddID )
@@ -241,9 +239,7 @@ INIT PROCEDURE _LOGRDD_INIT()
RETURN
/* -------------------------------------------------- */
/* USER UTILITY FUNCTIONS */
/* -------------------------------------------------- */
/* User utility functions */
FUNCTION hb_LogRddLogFileName( cFileName )
@@ -259,7 +255,6 @@ FUNCTION hb_LogRddLogFileName( cFileName )
IF HB_ISSTRING( cFileName )
aRDDData[ ARRAY_FILENAME ] := cFileName
ENDIF
ENDIF
RETURN cOldFileName
@@ -278,7 +273,6 @@ FUNCTION hb_LogRddTag( cTag )
IF HB_ISSTRING( cTag )
aRDDData[ ARRAY_TAG ] := cTag
ENDIF
ENDIF
RETURN cOldTag
@@ -297,7 +291,6 @@ FUNCTION hb_LogRddActive( lActive )
IF HB_ISLOGICAL( lActive )
aRDDData[ ARRAY_ACTIVE ] := lActive
ENDIF
ENDIF
RETURN lOldActive
@@ -316,7 +309,6 @@ FUNCTION hb_LogRddMsgLogBlock( bMsgLogBlock )
IF HB_ISEVALITEM( bMsgLogBlock )
aRDDData[ ARRAY_MSGLOGBLOCK ] := bMsgLogBlock
ENDIF
ENDIF
RETURN bOldMsgLogBlock
@@ -335,114 +327,102 @@ FUNCTION hb_LogRddUserLogBlock( bUserLogBlock )
IF HB_ISEVALITEM( bUserLogBlock )
aRDDData[ ARRAY_USERLOGBLOCK ] := bUserLogBlock
ENDIF
ENDIF
RETURN bOldUserLogBlock
FUNCTION hb_LogRddValueToText( uValue )
LOCAL cType := ValType( uValue )
LOCAL cType
LOCAL cText
DO CASE
CASE cType == "C"
cText := hb_StrToExp( uValue )
CASE cType == "N"
cText := hb_ntos( uValue )
CASE cType == "D"
cText := DToS( uValue )
cText := "0d" + iif( Empty( cText ), "00000000", cText )
OTHERWISE
cText := hb_ValToStr( uValue )
ENDCASE
SWITCH cType := ValType( uValue )
CASE "C" ; cText := hb_StrToExp( uValue ) ; EXIT
CASE "N" ; cText := hb_ntos( uValue ) ; EXIT
CASE "D" ; cText := DToS( uValue ) ; cText := "0d" + iif( Empty( cText ), "00000000", cText ) ; EXIT
OTHERWISE ; cText := hb_ValToStr( uValue )
ENDSWITCH
RETURN "[" + cType + "]>>>" + cText + "<<<"
/* -------------------------------------------------- */
/* LOCAL UTILITY FUNCTIONS */
/* -------------------------------------------------- */
/* Local utility functions */
STATIC PROCEDURE OpenLogFile( nWA )
LOCAL aRDDData := USRRDD_RDDDATA( USRRDD_ID( nWA ) )
LOCAL cFileName := aRDDData[ ARRAY_FILENAME ]
LOCAL nHandle := aRDDData[ ARRAY_FHANDLE ]
LOCAL lActive := aRDDData[ ARRAY_ACTIVE ]
LOCAL hFile := aRDDData[ ARRAY_FHANDLE ]
LOCAL lActive := aRDDData[ ARRAY_ACTIVE ]
// TraceLog( "nHandle " + CStr( nHandle ) )
#if 0
TraceLog( "hFile " + CStr( hFile ) )
#endif
IF lActive .AND. nHandle == NIL
IF lActive .AND. hFile == NIL
/* Open Access Log File */
IF hb_FileExists( cFileName )
nHandle := FOpen( cFileName, FO_READWRITE + FO_SHARED )
hFile := FOpen( cFileName, FO_READWRITE + FO_SHARED )
ELSE
nHandle := FCreate( cFileName )
hFile := FCreate( cFileName )
/* Close and reopen in shared mode */
IF FError() == 0 .AND. nHandle != F_ERROR
FClose( nHandle )
nHandle := FOpen( cFileName, FO_READWRITE + FO_SHARED )
IF FError() == 0 .AND. hFile != F_ERROR
FClose( hFile )
hFile := FOpen( cFileName, FO_READWRITE + FO_SHARED )
ENDIF
ENDIF
IF FError() == 0 .AND. nHandle != F_ERROR
IF FError() == 0 .AND. hFile != F_ERROR
/* Move to end of file */
FSeek( nHandle, 0, FS_END )
FSeek( hFile, 0, FS_END )
ELSE
nHandle := NIL
hFile := NIL
ENDIF
aRDDData[ ARRAY_FHANDLE ] := nHandle
aRDDData[ ARRAY_FHANDLE ] := hFile
ENDIF
RETURN
STATIC FUNCTION ToString( cCmd, nWA, xPar1, xPar2, xPar3 )
LOCAL cString
DO CASE
CASE cCmd == "CREATE"
// Parameters received: xPar1 = aOpenInfo
cString := xPar1[ UR_OI_NAME ]
CASE cCmd == "CREATEFIELDS"
// Parameters received: xPar1 = aStruct
cString := hb_ValToExp( xPar1 )
CASE cCmd == "OPEN"
// Parameters received: xPar1 = aOpenInfo
cString := 'Table : "' + xPar1[ UR_OI_NAME ] + '", Alias : "' + Alias() + '", WorkArea : ' + hb_ntos( nWA )
CASE cCmd == "CLOSE"
// Parameters received: xPar1 = cTableName, xPar2 = cAlias
cString := 'Table : "' + xPar1 + '", Alias : "' + xPar2 + '", WorkArea : ' + hb_ntos( nWA )
CASE cCmd == "APPEND"
// Parameters received: xPar1 = lUnlockAll
cString := Alias() + "->RecNo() = " + hb_ntos( RecNo() )
CASE cCmd == "DELETE"
SWITCH cCmd
CASE "CREATE"
// Parameters received: xPar1: aOpenInfo
RETURN xPar1[ UR_OI_NAME ]
CASE "CREATEFIELDS"
// Parameters received: xPar1: aStruct
RETURN hb_ValToExp( xPar1 )
CASE "OPEN"
// Parameters received: xPar1: aOpenInfo
RETURN 'Table: "' + xPar1[ UR_OI_NAME ] + '", Alias: "' + Alias() + '", WorkArea: ' + hb_ntos( nWA )
CASE "CLOSE"
// Parameters received: xPar1: cTableName, xPar2: cAlias
RETURN 'Table: "' + xPar1 + '", Alias: "' + xPar2 + '", WorkArea: ' + hb_ntos( nWA )
CASE "APPEND"
// Parameters received: xPar1: lUnlockAll
RETURN Alias() + "->RecNo() == " + hb_ntos( RecNo() )
CASE "DELETE"
// Parameters received: none
cString := Alias() + "->RecNo() = " + hb_ntos( RecNo() )
CASE cCmd == "RECALL"
RETURN Alias() + "->RecNo() == " + hb_ntos( RecNo() )
CASE "RECALL"
// Parameters received: none
cString := Alias() + "->RecNo() = " + hb_ntos( RecNo() )
CASE cCmd == "PUTVALUE"
// Parameters received: xPar1 = nField, xPar2 = xValue, xPar3 = xOldValue
RETURN Alias() + "->RecNo() == " + hb_ntos( RecNo() )
CASE "PUTVALUE"
// Parameters received: xPar1: nField, xPar2: xValue, xPar3: xOldValue
HB_SYMBOL_UNUSED( xPar3 ) // Here don't log previous value
cString := Alias() + "(" + hb_ntos( RecNo() ) + ")->" + PadR( FieldName( xPar1 ), 10 ) + " := " + hb_LogRddValueToText( xPar2 )
CASE cCmd == "ZAP"
RETURN Alias() + "(" + hb_ntos( RecNo() ) + ")->" + PadR( FieldName( xPar1 ), 10 ) + " := " + hb_LogRddValueToText( xPar2 )
CASE "ZAP"
// Parameters received: none
cString := 'Alias : "' + Alias() + ' Table : "' + dbInfo( DBI_FULLPATH ) + '"'
ENDCASE
RETURN 'Alias: "' + Alias() + ' Table: "' + dbInfo( DBI_FULLPATH ) + '"'
ENDSWITCH
RETURN cString
RETURN NIL
STATIC PROCEDURE ToLog( cCmd, nWA, xPar1, xPar2, xPar3 )
LOCAL aRDDData := USRRDD_RDDDATA( USRRDD_ID( nWA ) )
LOCAL lActive := aRDDData[ ARRAY_ACTIVE ]
LOCAL nHandle, cTag, cRDDName, bMsgLogBlock, bUserLogBlock, cLog
LOCAL hFile, cTag, cRDDName, bMsgLogBlock, bUserLogBlock, cLog
// Check if logging system is active
@@ -455,14 +435,14 @@ STATIC PROCEDURE ToLog( cCmd, nWA, xPar1, xPar2, xPar3 )
// If not defined a User codeblock
IF ! HB_ISEVALITEM( bUserLogBlock )
nHandle := aRDDData[ ARRAY_FHANDLE ]
hFile := aRDDData[ ARRAY_FHANDLE ]
// If log file is not already open I open now
IF nHandle == NIL
IF hFile == NIL
OpenLogFile( nWA )
ENDIF
IF nHandle != NIL
IF hFile != NIL
bMsgLogBlock := aRDDData[ ARRAY_MSGLOGBLOCK ]
@@ -475,17 +455,13 @@ STATIC PROCEDURE ToLog( cCmd, nWA, xPar1, xPar2, xPar3 )
ENDIF
// Log to file only if cLog is a valid string
IF HB_ISSTRING( cLog )
FWrite( nHandle, cLog + hb_eol() )
FWrite( hFile, cLog + hb_eol() )
ENDIF
ENDIF
ELSE
// Otherwise I send all to user that is responsible to log everywhere
Eval( bUserLogBlock, cTag, cRDDName, cCmd, nWA, xPar1, xPar2, xPar3 )
ENDIF
ENDIF
RETURN

View File

@@ -46,14 +46,14 @@
/*
* A simple RDD which introduce lock counters. It has full DBFCDX
* functionality from which it inherits but if you execute dbRLock(100)
* twice then you will have to also repeat call to dbRUnlock(100) to
* functionality from which it inherits but if you execute dbRLock( 100 )
* twice then you will have to also repeat call to dbRUnlock( 100 ) to
* really unlock the record 100. The same if for FLock()
* This idea comes from one of messages sent by Mindaugas Kavaliauskas.
*/
#include "rddsys.ch"
#include "hbusrrdd.ch"
#include "rddsys.ch"
ANNOUNCE RLCDX
@@ -61,8 +61,8 @@ ANNOUNCE RLCDX
* methods: NEW and RELEASE receive pointer to work area structure
* not work area number. It's necessary because the can be executed
* before work area is allocated
* these methods does not have to execute SUPER methods - these is
* always done by low level USRRDD code
* these methods does not have to execute SUPER methods - this is
* always done by low-level USRRDD code
*/
STATIC FUNCTION RLCDX_NEW( pWA )
@@ -86,10 +86,8 @@ STATIC FUNCTION RLCDX_LOCK( nWA, aLockInfo )
/* Convert EXCLUSIVE locks to DBLM_MULTIPLE */
IF aLockInfo[ UR_LI_METHOD ] == DBLM_EXCLUSIVE
aLockInfo[ UR_LI_METHOD ] := DBLM_MULTIPLE
aLockInfo[ UR_LI_RECORD ] := RecNo()
ENDIF
IF aLockInfo[ UR_LI_METHOD ] == DBLM_MULTIPLE /* RLOCK */
@@ -107,14 +105,13 @@ STATIC FUNCTION RLCDX_LOCK( nWA, aLockInfo )
IF aWData[ 1 ] > 0
aLockInfo[ UR_LI_RESULT ] := .T.
RETURN HB_SUCCESS
ELSEIF ( i := AScan( aWData[ 2 ], {| x | x[ 1 ] == xRecID } ) ) != 0
++aWData[ 2, i, 2 ]
ELSEIF ( i := AScan( aWData[ 2 ], {| x | x[ 1 ] == xRecID } ) ) > 0
++aWData[ 2 ][ i ][ 2 ]
aLockInfo[ UR_LI_RESULT ] := .T.
RETURN HB_SUCCESS
ENDIF
nResult := UR_SUPER_LOCK( nWA, aLockInfo )
IF nResult == HB_SUCCESS
IF ( nResult := UR_SUPER_LOCK( nWA, aLockInfo ) ) == HB_SUCCESS
IF aLockInfo[ UR_LI_RESULT ]
AAdd( aWData[ 2 ], { xRecID, 1 } )
ENDIF
@@ -129,8 +126,7 @@ STATIC FUNCTION RLCDX_LOCK( nWA, aLockInfo )
RETURN HB_SUCCESS
ENDIF
nResult := UR_SUPER_LOCK( nWA, aLockInfo )
IF nResult == HB_SUCCESS
IF ( nResult := UR_SUPER_LOCK( nWA, aLockInfo ) ) == HB_SUCCESS
/* FLOCK always first remove all RLOCKs, even if it fails */
ASize( aWData[ 2 ], 0 )
@@ -153,8 +149,8 @@ STATIC FUNCTION RLCDX_UNLOCK( nWA, xRecID )
LOCAL aWData := USRRDD_AREADATA( nWA ), i
IF HB_ISNUMERIC( xRecID ) .AND. xRecID > 0
IF ( i := AScan( aWData[ 2 ], {| x | x[ 1 ] == xRecID } ) ) != 0
IF --aWData[ 2, i, 2 ] > 0
IF ( i := AScan( aWData[ 2 ], {| x | x[ 1 ] == xRecID } ) ) > 0
IF --aWData[ 2 ][ i ][ 2 ] > 0
RETURN HB_SUCCESS
ENDIF
hb_ADel( aWData[ 2 ], i, .T. )
@@ -180,16 +176,15 @@ STATIC FUNCTION RLCDX_APPEND( nWA, lUnlockAll )
lUnlockAll := .F.
nResult := UR_SUPER_APPEND( nWA, lUnlockAll )
IF nResult == HB_SUCCESS
IF ( nResult := UR_SUPER_APPEND( nWA, lUnlockAll ) ) == HB_SUCCESS
aWData := USRRDD_AREADATA( nWA )
IF aWData[ 1 ] == 0
xRecId := RecNo()
/* Some RDDs may allow to set phantom locks with RLOCK so we should
check if it's not the case and increase the counter when it is */
IF ( i := AScan( aWData[ 2 ], {| x | x[ 1 ] == xRecID } ) ) != 0
++aWData[ 2, i, 2 ]
IF ( i := AScan( aWData[ 2 ], {| x | x[ 1 ] == xRecID } ) ) > 0
++aWData[ 2 ][ i ][ 2 ]
ELSE
AAdd( aWData[ 2 ], { xRecID, 1 } )
ENDIF
@@ -212,10 +207,10 @@ FUNCTION RLCDX_GETFUNCTABLE( pFuncCount, pFuncTable, pSuperTable, nRddID, pSuper
LOCAL cSuperRDD := "DBFCDX" /* We are inheriting from DBFCDX */
LOCAL aMethods[ UR_METHODCOUNT ]
aMethods[ UR_NEW ] := ( @RLCDX_NEW() )
aMethods[ UR_LOCK ] := ( @RLCDX_LOCK() )
aMethods[ UR_UNLOCK ] := ( @RLCDX_UNLOCK() )
aMethods[ UR_APPEND ] := ( @RLCDX_APPEND() )
aMethods[ UR_NEW ] := @RLCDX_NEW()
aMethods[ UR_LOCK ] := @RLCDX_LOCK()
aMethods[ UR_UNLOCK ] := @RLCDX_UNLOCK()
aMethods[ UR_APPEND ] := @RLCDX_APPEND()
RETURN USRRDD_GETFUNCTABLE( pFuncCount, pFuncTable, pSuperTable, nRddID, ;
cSuperRDD, aMethods, pSuperRddID )

View File

@@ -50,19 +50,18 @@
* set default memo type to SMT
*/
#include "rddsys.ch"
#include "hbusrrdd.ch"
#include "dbinfo.ch"
#include "hbusrrdd.ch"
#include "rddsys.ch"
/* Force linking DBFCDX and DBFFPT from which our RDD inherits */
REQUEST DBFCDX
REQUEST DBFFPT
/* Announce our RDD for forign REQUESTs */
/* Announce our RDD for foreign REQUESTs */
ANNOUNCE SMTCDX
FUNCTION SMTCDX_GETFUNCTABLE( pFuncCount, pFuncTable, pSuperTable, nRddID, pSuperRddID )
RETURN USRRDD_GETFUNCTABLE( pFuncCount, pFuncTable, pSuperTable, nRddID, ;
"DBFCDX", {}, pSuperRddID ) /* We are inheriting from DBFCDX */

View File

@@ -44,9 +44,9 @@
*
*/
#include "rddsys.ch"
#include "dbinfo.ch"
#include "hbusrrdd.ch"
#include "rddsys.ch"
/* Force linking DBFCDX from which our RDD inherits */
REQUEST DBFCDX
@@ -54,10 +54,8 @@ REQUEST DBFFPT
ANNOUNCE VFPCDX
/* We are inheriting from DBFCDX */
FUNCTION VFPCDX_GETFUNCTABLE( pFuncCount, pFuncTable, pSuperTable, nRddID, pSuperRddID )
/* We are inheriting from DBFCDX */
RETURN USRRDD_GETFUNCTABLE( pFuncCount, pFuncTable, pSuperTable, nRddID, "DBFCDX", {}, pSuperRddID )
INIT PROCEDURE VFPCDX_INIT()