ClRcT clFaultRepairProcess(ClFaultRecordPtr hRec)
{
	ClRcT				rc = CL_OK;
	ClUint8T			catIndex = 0, sevIndex = 0;
	ClFaultRecordPtr 	historyRec = NULL;
	ClFaultRecordPtr 	fRec = NULL;
	ClUint8T    		recordFound = 0;	

	
	if ( (rc = clFaultCategory2IndexTranslate((hRec->event).category, &catIndex)) != CL_OK )
	{
        CL_DEBUG_PRINT(CL_DEBUG_ERROR, ("FM REPAIR, Invalid CATEGORY. CANNOT DO \
                           ANY REPAIR\r\n"));
    	return rc;
	}
/* 
 * this api is used to for querying the fault history
 * for a particular set of attributes from the cli.
 */
ClRcT
clFaultCliDebugHistoryShow( ClUint32T argc, 
                            ClCharT **argv, 
                            ClCharT** ret)
{
    ClRcT               rc = CL_OK;
    SaNameT             moIdName = {0};
    ClUint8T            catIndex, sevIndex;
    ClUint8T    		recordFound = 0;	
    ClCorMOIdT          moid;
    ClFaultRecordT*     fRecord;
    ClFaultRecordPtr 	historyRec;
    ClCorObjectHandleT  hMSOObj;

    if ( argc != 6 )
    {
        clFaultCliStrPrint(ret, "\nUsage : queryFaulthistory <Moid>"
                " <Category#> <SpecificProblem#> <Severity#> <Cause#>\n"
                "\tMoid [STRING]    : This is the absolute path of the MOID"
                "i.e \\Class_Chassis:0\\Class_GigeBlade:1 \n"
                "\tCategory [DEC]   : Category of the fault\n"
                "\tValid values are : 1 for COMMUNICATIONS, 2 for QUALITY OF SERVICE,\n\t\t\t   3 for PROCESSING ERROR, 4 for EQUIPMENT,\n\t\t\t   5 for ENVIRONMENTAL\n\n"
                "\tSpecProblem[DEC] : Specific problem of the fault\n"
                "\tSeverity [DEC]   : Severity of the fault\n"
                "\tValid values are : 1 for CRITICAL, 2 for MAJOR,\n\t\t\t   3 for MINOR, 4 for WARNING,\n\t\t\t   5 for INTERMEDIATE, 6 for CLEAR\n\n"
                "\tCause [DEC]      : Cause of the fault\n"
                "\tValid values are : 1 to 57. Refer ClAlarmProbableCauseT for more description\n");
        return CL_OK;
    }
    //rc = clFaultXlateMOPath (argv[1], &moid );
    strcpy(moIdName.value, argv[1]);
    moIdName.length = strlen(argv[1]);
    rc = clCorMoIdNameToMoIdGet(&moIdName, &moid);
    if ( CL_OK == rc)
    {
        fRecord =(ClFaultRecordT*)clHeapAllocate(sizeof(ClFaultRecordT));

        historyRec = (ClFaultRecordPtr)clHeapAllocate(sizeof(ClFaultRecordT));	

        if(fRecord == NULL || historyRec == NULL)
        {
            clLogWrite(CL_LOG_HANDLE_SYS, CL_LOG_SEV_CRITICAL, CL_FAULT_SERVER_LIB,
                    CL_LOG_MESSAGE_0_MEMORY_ALLOCATION_FAILED);
            return CL_FAULT_RC(CL_ERR_NO_MEMORY);
        }
                            
        rc = clCorObjectHandleGet(&moid, &hMSOObj);
        if (CL_OK != rc)
        {
            clFaultCliStrPrint(ret, " Invalid MoId passed..... \n");
            clHeapFree(fRecord);
            clHeapFree(historyRec);
            return rc;
        }
        (fRecord->event).category = atoi(argv[2]);
        (fRecord->event).specificProblem = atoi(argv[3]);
        (fRecord->event).severity = atoi(argv[4]);
        (fRecord->event).cause = atoi(argv[5]);
        if((fRecord->event).cause < CL_ALARM_PROB_CAUSE_LOSS_OF_SIGNAL 
                        ||
           (fRecord->event).cause > CL_ALARM_PROB_CAUSE_ENCLOSURE_DOOR_OPEN)
        {
            clFaultCliStrPrint(ret, 
                    "Invalid probable cause [%s] supplied. Please see usage for the valid range of values\n");
            return CL_FAULT_ERR_INVLD_VAL;
        }
        (fRecord->event).moId = moid;	
                            
        (fRecord->event).category=
            clFaultCategory2InternalTranslate((fRecord->event).category);
        (fRecord->event).severity=
            clFaultSeverity2InternalTranslate((fRecord->event.severity));

        if ( (rc = clFaultCategory2IndexTranslate(
                        (fRecord->event).category, &catIndex)) != CL_OK )
        {
            clFaultCliStrPrint(ret, 
                    "\nFM REPAIR, Invalid CATEGORY. CANNOT PROCESS QUERY\n");
            clHeapFree(fRecord);
            clHeapFree(historyRec);
            return CL_OK;
        }
        if( (rc = clFaultSeverity2IndexTranslate(
                        (fRecord->event).severity, &sevIndex)) != CL_OK )
        {
            clFaultCliStrPrint(ret, 
                    "\nFM REPAIR, Invalid SEVERITY. CANNOT PROCESS QUERY\n");
            clHeapFree(fRecord);
            clHeapFree(historyRec);
            return rc;
        }

        rc = clFaultHistoryDataLock();
        if (rc != CL_OK)
        {
            clFaultCliStrPrint(ret, 
                    " REPAIR: Not able to get history data lock rc [0x%x]\n", rc);
            clHeapFree(fRecord);
            clHeapFree(historyRec);
            return rc;
        }
        rc = clFaultProcessFaultRecordQuery(&(fRecord->event.moId),
                                               (fRecord->event).category,
                                               (fRecord->event).severity,
                                               (fRecord->event).specificProblem,
                                               (fRecord->event).cause,
                                               CL_ALL_BUCKETS,historyRec,
                                               &recordFound);
        if(!recordFound)
        {
            /* record not found */
            fRecord->seqNum = 0;
        }
        else
        {
            /* record found */
            fRecord->seqNum = historyRec->seqNum;
        }
        rc = clFaultHistoryDataUnLock();
        if (rc != CL_OK)
        {
            clFaultCliStrPrint(ret, 
                    "REPAIR: Not able to get history data lock rc:0x%x \n", rc);
            clHeapFree(fRecord);
            clHeapFree(historyRec);
            return rc;
        }
    
        clFaultRecordPack(fRecord,ret);
        clHeapFree(fRecord);
        clHeapFree(historyRec);
    }
    else
        clFaultCliStrPrint(ret, 
                " MOId name to MOId conversion failed ..... \n");
    return CL_OK;
}