2017-12-21 Fred Gleason <fredg@paravelsystems.com>

* Added log locking logic to the 'SaveLog' Web API call.
This commit is contained in:
Fred Gleason
2017-12-21 11:47:34 -05:00
parent 0224380581
commit 97a6045992
5 changed files with 106 additions and 44 deletions

View File

@@ -246,6 +246,7 @@ void Xport::SaveLog()
QString log_name;
QString service_name;
QString lock_guid;
QString description;
QDate purge_date;
bool auto_refresh;
@@ -263,6 +264,7 @@ void Xport::SaveLog()
XmlExit("Missing SERVICE_NAME",400,"logs.cpp",LINE_NUMBER);
}
GetLogService(service_name);
xport_post->getValue("LOCK_GUID",&lock_guid);
if(!xport_post->getValue("DESCRIPTION",&description)) {
XmlExit("Missing DESCRIPTION",400,"logs.cpp",LINE_NUMBER);
}
@@ -495,55 +497,46 @@ void Xport::SaveLog()
if(!log->exists()) {
XmlExit("No such log",404,"logs.cpp",LINE_NUMBER);
}
log->setService(service_name);
log->setDescription(description);
log->setPurgeDate(purge_date);
log->setAutoRefresh(auto_refresh);
log->setStartDate(start_date);
log->setEndDate(end_date);
log->setModifiedDatetime(QDateTime::currentDateTime());
logevt->save(xport_config);
if(lock_guid.isEmpty()) {
QString username=xport_user->name();
QString stationname=xport_remote_hostname;
QHostAddress addr=xport_remote_address;
lock_guid=RDLogLock::makeGuid(stationname);
if(RDLogLock::tryLock(&username,&stationname,&addr,log_name,lock_guid)) {
log->setService(service_name);
log->setDescription(description);
log->setPurgeDate(purge_date);
log->setAutoRefresh(auto_refresh);
log->setStartDate(start_date);
log->setEndDate(end_date);
log->setModifiedDatetime(QDateTime::currentDateTime());
logevt->save(xport_config);
RDLogLock::clearLock(lock_guid);
}
else {
XmlExit("unable to get log lock",404);
}
}
else {
if(RDLogLock::validateLock(log_name,lock_guid)) {
log->setService(service_name);
log->setDescription(description);
log->setPurgeDate(purge_date);
log->setAutoRefresh(auto_refresh);
log->setStartDate(start_date);
log->setEndDate(end_date);
log->setModifiedDatetime(QDateTime::currentDateTime());
logevt->save(xport_config);
}
else {
XmlExit("invalid log lock",400);
}
}
XmlExit(QString().sprintf("OK Saved %d events",logevt->size()),
200,"logs.cpp",LINE_NUMBER);
}
RDSvc *Xport::GetLogService(const QString &svc_name)
{
QString sql=QString("select SERVICE_NAME from USER_SERVICE_PERMS where ")+
"(USER_NAME=\""+RDEscapeString(xport_user->name())+"\")&&"+
"(SERVICE_NAME=\""+RDEscapeString(svc_name)+"\")";
RDSqlQuery *q=new RDSqlQuery(sql);
if(!q->first()) {
XmlExit("No such service",404,"logs.cpp",LINE_NUMBER);
}
delete q;
RDSvc *svc=new RDSvc(svc_name,xport_station,xport_config);
if(!svc->exists()) {
XmlExit("No such service",404,"logs.cpp",LINE_NUMBER);
}
return svc;
}
bool Xport::ServiceUserValid(const QString &svc_name)
{
bool ret=false;
QString sql=QString("select SERVICE_NAME from USER_SERVICE_PERMS where ")+
"(SERVICE_NAME=\""+RDEscapeString(svc_name)+"\")&&"+
"(USER_NAME=\""+RDEscapeString(xport_user->name())+"\")";
RDSqlQuery *q=new RDSqlQuery(sql);
ret=q->first();
delete q;
return ret;
}
void Xport::LockLog()
{
RDLog *log;
@@ -628,6 +621,40 @@ void Xport::LockLog()
}
RDSvc *Xport::GetLogService(const QString &svc_name)
{
QString sql=QString("select SERVICE_NAME from USER_SERVICE_PERMS where ")+
"(USER_NAME=\""+RDEscapeString(xport_user->name())+"\")&&"+
"(SERVICE_NAME=\""+RDEscapeString(svc_name)+"\")";
RDSqlQuery *q=new RDSqlQuery(sql);
if(!q->first()) {
XmlExit("No such service",404,"logs.cpp",LINE_NUMBER);
}
delete q;
RDSvc *svc=new RDSvc(svc_name,xport_station,xport_config);
if(!svc->exists()) {
XmlExit("No such service",404,"logs.cpp",LINE_NUMBER);
}
return svc;
}
bool Xport::ServiceUserValid(const QString &svc_name)
{
bool ret=false;
QString sql=QString("select SERVICE_NAME from USER_SERVICE_PERMS where ")+
"(SERVICE_NAME=\""+RDEscapeString(svc_name)+"\")&&"+
"(USER_NAME=\""+RDEscapeString(xport_user->name())+"\")";
RDSqlQuery *q=new RDSqlQuery(sql);
ret=q->first();
delete q;
return ret;
}
QString Xport::LogLockXml(bool result,const QString &log_name,
const QString &guid,const QString &username,
const QString &stationname,