Add "restore cleanerr [locked|missing]" to clean status.tcl error messages
"cleanerr" removes duplicate message "cleanerr locked" removes locked variable errors as well "cleanerr missing" removes variable not found errors as well
This commit is contained in:
98
statusfile.c
98
statusfile.c
@ -52,6 +52,9 @@
|
|||||||
#include "lld.h"
|
#include "lld.h"
|
||||||
#include "exebuf.h"
|
#include "exebuf.h"
|
||||||
|
|
||||||
|
#define CLEAN_LOCKED 1
|
||||||
|
#define CLEAN_MISSING 2
|
||||||
|
|
||||||
static int parameterChange = 0;
|
static int parameterChange = 0;
|
||||||
/*-----------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------*/
|
||||||
int StatusFileTask(void *data)
|
int StatusFileTask(void *data)
|
||||||
@ -217,6 +220,94 @@ static int listRestoreErr(pRestoreObj self, SConnection * pCon)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------------------*/
|
||||||
|
static int cleanRestoreErr(pRestoreObj self, SConnection * pCon, int hard)
|
||||||
|
{
|
||||||
|
char command[1024];
|
||||||
|
char message[1024];
|
||||||
|
char *errMsg = NULL;
|
||||||
|
int status;
|
||||||
|
int newErrList;
|
||||||
|
pDynString data = NULL;
|
||||||
|
pStringDict dict;
|
||||||
|
int count_in = 0;
|
||||||
|
int count_ex = 0;
|
||||||
|
|
||||||
|
if (!self->errList)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
data = CreateDynString(256,256);
|
||||||
|
if (data == NULL) {
|
||||||
|
SCWrite(pCon,"ERROR: out of memory cleaning errors",eError);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
dict = CreateStringDict();
|
||||||
|
if (dict == NULL) {
|
||||||
|
SCWrite(pCon,"ERROR: out of memory cleaning errors",eError);
|
||||||
|
DeleteDynString(data);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
/* create new list */
|
||||||
|
newErrList = LLDstringCreate();
|
||||||
|
if (newErrList < 0) {
|
||||||
|
SCWrite(pCon,"ERROR: out of blobs cleaning errors",eError);
|
||||||
|
DeleteDynString(data);
|
||||||
|
DeleteStringDict(dict);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
status = LLDnodePtr2First(self->errList);
|
||||||
|
while (status == 1) {
|
||||||
|
LLDstringData(self->errList, command);
|
||||||
|
status = LLDnodePtr2Next(self->errList);
|
||||||
|
if (status != 1) {
|
||||||
|
/* Error */
|
||||||
|
errMsg = "ERROR: unpaired error cleaning errors";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
LLDstringData(self->errList, message);
|
||||||
|
if (command[0] == '#' || message[0] != '#') {
|
||||||
|
/* Error */
|
||||||
|
errMsg = "ERROR: sequence error cleaning errors";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
DynStringClear(data);
|
||||||
|
DynStringConcat(data, command);
|
||||||
|
DynStringConcat(data, message);
|
||||||
|
status = LLDnodePtr2Next(self->errList);
|
||||||
|
++count_in;
|
||||||
|
/* Skip duplicate messages */
|
||||||
|
if (StringDictExists(dict, GetCharArray(data)))
|
||||||
|
continue;
|
||||||
|
/* Skip "configured locked!" messages */
|
||||||
|
if (hard == CLEAN_LOCKED &&
|
||||||
|
strstr(message, "#ERR: ERROR: variable ") &&
|
||||||
|
strstr(message, " is configured locked!"))
|
||||||
|
continue;
|
||||||
|
/* Skip "not found" messages */
|
||||||
|
if (hard == CLEAN_MISSING &&
|
||||||
|
strstr(message, "#ERR: Object ") &&
|
||||||
|
strstr(message, "not found"))
|
||||||
|
continue;
|
||||||
|
/* add to dictionary and new list */
|
||||||
|
StringDictAddPair(dict, GetCharArray(data), "");
|
||||||
|
LLDstringAppend(newErrList, command);
|
||||||
|
LLDstringAppend(newErrList, message);
|
||||||
|
++count_ex;
|
||||||
|
}
|
||||||
|
if (errMsg) {
|
||||||
|
SCWrite(pCon, errMsg, eError);
|
||||||
|
LLDstringDelete(newErrList);
|
||||||
|
} else {
|
||||||
|
/* swap lists */
|
||||||
|
LLDstringDelete(self->errList);
|
||||||
|
self->errList = newErrList;
|
||||||
|
SCPrintf(pCon, eLog, "CleanErr: %d pairs in, %d pairs out", count_in, count_ex);
|
||||||
|
}
|
||||||
|
DeleteDynString(data);
|
||||||
|
DeleteStringDict(dict);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
/*-----------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------*/
|
||||||
int RestoreStatus(SConnection * pCon, SicsInterp * pSics, void *pData,
|
int RestoreStatus(SConnection * pCon, SicsInterp * pSics, void *pData,
|
||||||
int argc, char *argv[])
|
int argc, char *argv[])
|
||||||
@ -245,6 +336,13 @@ int RestoreStatus(SConnection * pCon, SicsInterp * pSics, void *pData,
|
|||||||
} else {
|
} else {
|
||||||
if (strcasecmp(argv[1], "listerr") == 0) {
|
if (strcasecmp(argv[1], "listerr") == 0) {
|
||||||
return listRestoreErr(self, pCon);
|
return listRestoreErr(self, pCon);
|
||||||
|
} else if (strcasecmp(argv[1], "cleanerr") == 0) {
|
||||||
|
if (argc > 2 && strcasecmp(argv[2], "locked") == 0)
|
||||||
|
return cleanRestoreErr(self, pCon, CLEAN_LOCKED);
|
||||||
|
else if (argc > 2 && strcasecmp(argv[2], "missing") == 0)
|
||||||
|
return cleanRestoreErr(self, pCon, CLEAN_MISSING);
|
||||||
|
else
|
||||||
|
return cleanRestoreErr(self, pCon, 0);
|
||||||
} else if (strcasecmp(argv[1], "killerr") == 0) {
|
} else if (strcasecmp(argv[1], "killerr") == 0) {
|
||||||
if (self->errList >= 0) {
|
if (self->errList >= 0) {
|
||||||
LLDdeleteBlob(self->errList);
|
LLDdeleteBlob(self->errList);
|
||||||
|
Reference in New Issue
Block a user