/*
 * Create the section if it doesn't exist.
 * Called on becoming active
 */
SaAisErrorT alarmClockCkptActivate(SaCkptCheckpointHandleT ckptHdl, ClUint32T section_num)
{
    SaAisErrorT rc = SA_AIS_OK;
    SaCkptSectionIdT *id;

    if(section_num > NUM_SECTION_ID_MAPS)
        return SA_AIS_ERR_INVALID_PARAM;

    id = &sectionIdMap[section_num-1].sectionId;

    rc = clCkptSectionCheck(ckptHdl, (ClCkptSectionIdT*)id);
    if(rc != CL_OK)
    {
        if(CL_GET_ERROR_CODE(rc) == CL_ERR_NOT_EXIST)
        {
            rc = alarmClockCkptSectionCreate(ckptHdl, 1);
            if(rc == SA_AIS_OK)
            {
                alarmClockLogWrite(CL_LOG_SEV_INFO, 
                                   "alarmClockActivate: Section [%.*s] created successfully", 
                                   id->idLen, (const char *)id->id);
            }
        }
        else rc = SA_AIS_ERR_UNAVAILABLE; /* internal error */
    }
    else rc = SA_AIS_OK;

    if(rc != SA_AIS_OK)
    {
        alarmClockLogWrite(CL_LOG_SEV_INFO, "alarmClockActivate: Section operation on section [%d] "
                           "failed with [%#x]", section_num, rc);
    }
    
    return rc;
}
static ClRcT __alarmClockCkptSectionCheck(ClCkptHdlT ckpt_hdl, ClUint32T section_num)
{
    ClCkptSectionIdT *section_id;
    if(section_num > NUM_SECTION_ID_MAPS)
        return CL_ERR_OUT_OF_RANGE;
    section_id = (ClCkptSectionIdT*)&sectionIdMap[section_num-1].sectionId;
    return clCkptSectionCheck(ckpt_hdl, section_id);
}
SaAisErrorT alarmClockCkptActivate(SaCkptCheckpointHandleT ckptHdl, ClUint32T section_num)
{
    SaAisErrorT rc = SA_AIS_OK;
    SaCkptSectionIdT id;

    id.idLen = sizeof(section_num);
    id.id = (ClUint8T*)&section_num;

    rc = saCkptActiveReplicaSet(ckptHdl);
    if(rc != SA_AIS_OK)
    {
        alarmClockLogWrite(CL_LOG_SEV_ERROR, "alarmClockReplicaSet: returned [%#x]", rc);
        return rc;
    }
    
    rc = clCkptSectionCheck(ckptHdl, (ClCkptSectionIdT*)&id);
    if(rc != CL_OK)
    {
        if(CL_GET_ERROR_CODE(rc) == CL_ERR_NOT_EXIST)
        {
            SaCkptSectionCreationAttributesT attr;
            attr.sectionId = &id;
            attr.expirationTime = (ClTimeT)CL_TIME_END;
            rc = saCkptSectionCreate(ckptHdl, &attr, NULL, 0);
            if(rc == SA_AIS_OK)
            {
                alarmClockLogWrite(CL_LOG_SEV_INFO, 
                                   "alarmClockActivate: Section [%d] created successfully", 
                                   section_num);
            }
        }
        else rc = SA_AIS_ERR_UNAVAILABLE; /* internal error */
    }
    else rc = SA_AIS_OK;

    if(rc != SA_AIS_OK)
    {
        alarmClockLogWrite(CL_LOG_SEV_INFO, "alarmClockActivate: Section operation on section [%d] "
                           "failed with [%#x]", section_num, rc);
    }
    
    return rc;
}
ClRcT alarmClockCkptActivate(ClCkptHdlT ckptHdl, ClUint32T numSections)
{
    ClRcT rc = CL_OK;
    ClCkptSectionIdT id;
    ClCharT section_name[CL_MAX_NAME_LENGTH];

    snprintf(section_name, sizeof(section_name), "s%05d", numSections);
    id.idLen = strlen(section_name);
    id.id = (ClUint8T*)section_name;

    rc = clCkptActiveReplicaSet(ckptHdl);
    if(rc != CL_OK)
    {
        alarmClockLogWrite(CL_LOG_SEV_ERROR, "alarmClockReplicaSet: returned [%#x]", rc);
        return rc;
    }
    
    rc = clCkptSectionCheck(ckptHdl, &id);
    if(CL_GET_ERROR_CODE(rc) == CL_ERR_NOT_EXIST)
    {
        ClCkptSectionCreationAttributesT attr;
        attr.sectionId = &id;
        attr.expirationTime = (ClTimeT)CL_TIME_END;
        rc = clCkptSectionCreate(ckptHdl, &attr, NULL, 0);
        if(rc == CL_OK)
        {
            alarmClockLogWrite(CL_LOG_SEV_INFO, "alarmClockActivate: Section [%s] created successfully",
                               section_name);
        }
    }
    
    if(rc != CL_OK)
    {
        alarmClockLogWrite(CL_LOG_SEV_INFO, "alarmClockActivate: Section operation on [%s] "
                           "failed with [%#x]", section_name, rc);
    }
    
    return rc;
}