mirror of
https://github.com/ElvishArtisan/rivendell.git
synced 2025-10-12 09:33:37 +02:00
2017-12-20 Fred Gleason <fredg@paravelsystems.com>
* Added a 'LOGS.LOCK_GUID' field to the database. * Incremented the database version to 274. * Added a 'LockLog' call to the Web API.
This commit is contained in:
@@ -24,7 +24,7 @@
|
||||
/*
|
||||
* Current Database Version
|
||||
*/
|
||||
#define RD_VERSION_DATABASE 273
|
||||
#define RD_VERSION_DATABASE 274
|
||||
|
||||
|
||||
#endif // DBVERSION_H
|
||||
|
@@ -59,6 +59,43 @@ bool RDLogLock::isLocked() const
|
||||
|
||||
bool RDLogLock::tryLock(QString *username,QString *stationname,
|
||||
QHostAddress *addr)
|
||||
{
|
||||
bool ret=false;
|
||||
QString guid=RDLogLock::makeGuid(lock_station->name());
|
||||
|
||||
*username=lock_user->name();
|
||||
*stationname=lock_station->name();
|
||||
addr->setAddress(lock_station->address().toString());
|
||||
|
||||
if(RDLogLock::tryLock(username,stationname,addr,lock_log_name,guid)) {
|
||||
lock_timer->start(RD_LOG_LOCK_TIMEOUT/2);
|
||||
lock_guid=guid;
|
||||
lock_locked=true;
|
||||
ret=true;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
void RDLogLock::clearLock()
|
||||
{
|
||||
RDLogLock::clearLock(lock_guid);
|
||||
lock_guid=QString();
|
||||
lock_timer->stop();
|
||||
lock_locked=false;
|
||||
}
|
||||
|
||||
|
||||
void RDLogLock::updateLock()
|
||||
{
|
||||
RDLogLock::updateLock(lock_log_name,lock_guid);
|
||||
}
|
||||
|
||||
|
||||
bool RDLogLock::tryLock(QString *username,QString *stationname,
|
||||
QHostAddress *addr,const QString &log_name,
|
||||
const QString &guid)
|
||||
{
|
||||
QString sql;
|
||||
RDSqlQuery *q;
|
||||
@@ -67,18 +104,17 @@ bool RDLogLock::tryLock(QString *username,QString *stationname,
|
||||
QDateTime now=QDateTime::currentDateTime();
|
||||
|
||||
sql=QString("update LOGS set ")+
|
||||
"LOCK_USER_NAME=\""+RDEscapeString(lock_user->name())+"\","+
|
||||
"LOCK_STATION_NAME=\""+RDEscapeString(lock_station->name())+"\","+
|
||||
"LOCK_IPV4_ADDRESS=\""+RDEscapeString(lock_station->address().toString())+
|
||||
"LOCK_USER_NAME=\""+RDEscapeString(*username)+"\","+
|
||||
"LOCK_STATION_NAME=\""+RDEscapeString(*stationname)+"\","+
|
||||
"LOCK_IPV4_ADDRESS=\""+RDEscapeString(addr->toString())+
|
||||
"\","+
|
||||
"LOCK_GUID=\""+RDEscapeString(guid)+"\","+
|
||||
"LOCK_DATETIME=now() where "+
|
||||
"(NAME=\""+RDEscapeString(lock_log_name)+"\")&&"+
|
||||
"(NAME=\""+RDEscapeString(log_name)+"\")&&"+
|
||||
"((LOCK_DATETIME is null)||"+
|
||||
"(LOCK_DATETIME<\""+RDEscapeString(now.addSecs(-RD_LOG_LOCK_TIMEOUT/1000).toString("yyyy-MM-dd hh:mm:ss"))+"\"))";
|
||||
q=new RDSqlQuery(sql);
|
||||
if(q->numRowsAffected()>0) {
|
||||
lock_timer->start(RD_LOG_LOCK_TIMEOUT/2);
|
||||
lock_locked=true;
|
||||
ret=true;
|
||||
}
|
||||
else {
|
||||
@@ -87,7 +123,7 @@ bool RDLogLock::tryLock(QString *username,QString *stationname,
|
||||
"LOCK_STATION_NAME,"+
|
||||
"LOCK_IPV4_ADDRESS "+
|
||||
"from LOGS where "+
|
||||
"NAME=\""+RDEscapeString(lock_log_name)+"\"";
|
||||
"NAME=\""+RDEscapeString(log_name)+"\"";
|
||||
q1=new RDSqlQuery(sql);
|
||||
if(q1->first()) {
|
||||
*username=q1->value(0).toString();
|
||||
@@ -102,7 +138,26 @@ bool RDLogLock::tryLock(QString *username,QString *stationname,
|
||||
}
|
||||
|
||||
|
||||
void RDLogLock::clearLock()
|
||||
void RDLogLock::updateLock(const QString &log_name,const QString &guid)
|
||||
{
|
||||
QString sql;
|
||||
RDSqlQuery *q;
|
||||
|
||||
sql=QString("update LOGS set ")+
|
||||
"LOCK_DATETIME=now() where "+
|
||||
"LOCK_GUID=\""+RDEscapeString(guid)+"\"";
|
||||
q=new RDSqlQuery(sql);
|
||||
#ifndef WIN32
|
||||
if(q->numRowsAffected()==0) {
|
||||
syslog(LOG_WARNING,"lock on log \"%s\" has evaporated!",
|
||||
(const char *)log_name);
|
||||
}
|
||||
#endif // WIN32
|
||||
delete q;
|
||||
}
|
||||
|
||||
|
||||
void RDLogLock::clearLock(const QString &guid)
|
||||
{
|
||||
QString sql;
|
||||
RDSqlQuery *q;
|
||||
@@ -111,37 +166,16 @@ void RDLogLock::clearLock()
|
||||
"LOCK_USER_NAME=null,"+
|
||||
"LOCK_STATION_NAME=null,"+
|
||||
"LOCK_IPV4_ADDRESS=null,"+
|
||||
"LOCK_GUID=null,"+
|
||||
"LOCK_DATETIME=null where "+
|
||||
"(NAME=\""+RDEscapeString(lock_log_name)+"\")&&"+
|
||||
"(LOCK_USER_NAME=\""+RDEscapeString(lock_user->name())+"\")&&"+
|
||||
"(LOCK_STATION_NAME=\""+RDEscapeString(lock_station->name())+"\")&&"+
|
||||
"(LOCK_IPV4_ADDRESS=\""+RDEscapeString(lock_station->address().toString())+
|
||||
"\")";
|
||||
"LOCK_GUID=\""+RDEscapeString(guid)+"\"";
|
||||
q=new RDSqlQuery(sql);
|
||||
delete q;
|
||||
lock_timer->stop();
|
||||
lock_locked=false;
|
||||
}
|
||||
|
||||
|
||||
void RDLogLock::updateLock()
|
||||
QString RDLogLock::makeGuid(const QString &stationname)
|
||||
{
|
||||
QString sql;
|
||||
RDSqlQuery *q;
|
||||
|
||||
sql=QString("update LOGS set ")+
|
||||
"LOCK_DATETIME=now() where "+
|
||||
"(NAME=\""+RDEscapeString(lock_log_name)+"\")&&"+
|
||||
"(LOCK_USER_NAME=\""+RDEscapeString(lock_user->name())+"\")&&"+
|
||||
"(LOCK_STATION_NAME=\""+RDEscapeString(lock_station->name())+"\")&&"+
|
||||
"(LOCK_IPV4_ADDRESS=\""+RDEscapeString(lock_station->address().toString())+
|
||||
"\")";
|
||||
q=new RDSqlQuery(sql);
|
||||
#ifndef WIN32
|
||||
if(q->numRowsAffected()==0) {
|
||||
syslog(LOG_WARNING,"lock on log \"%s\" has gone stale",
|
||||
(const char *)lock_log_name);
|
||||
}
|
||||
#endif // WIN32
|
||||
delete q;
|
||||
return stationname+QDateTime::currentDateTime().
|
||||
toString("yyyyMMddhhmmsszzz");
|
||||
}
|
||||
|
@@ -39,6 +39,11 @@ class RDLogLock : public QObject
|
||||
bool isLocked() const;
|
||||
bool tryLock(QString *username,QString *stationname,QHostAddress *addr);
|
||||
void clearLock();
|
||||
static bool tryLock(QString *username,QString *stationname,QHostAddress *addr,
|
||||
const QString &log_name,const QString &guid);
|
||||
static void updateLock(const QString &log_name,const QString &guid);
|
||||
static void clearLock(const QString &guid);
|
||||
static QString makeGuid(const QString &stationname);
|
||||
|
||||
private slots:
|
||||
void updateLock();
|
||||
@@ -49,6 +54,7 @@ class RDLogLock : public QObject
|
||||
RDStation *lock_station;
|
||||
QTimer *lock_timer;
|
||||
bool lock_locked;
|
||||
QString lock_guid;
|
||||
};
|
||||
|
||||
|
||||
|
@@ -54,6 +54,7 @@
|
||||
#define RDXPORT_COMMAND_CREATETICKET 31
|
||||
#define RDXPORT_COMMAND_REHASH 32
|
||||
#define RDXPORT_COMMAND_LISTSYSTEMSETTINGS 33
|
||||
#define RDXPORT_COMMAND_LOCKLOG 34
|
||||
|
||||
|
||||
#endif // RDXPORT_INTERFACE_H
|
||||
|
Reference in New Issue
Block a user