173 lines
5.2 KiB
C++
173 lines
5.2 KiB
C++
|
#include "HxRecordCleanup.h"
|
||
|
|
||
|
#include "HxDisk.h"
|
||
|
#include "HxJson.h"
|
||
|
#include "HxTrace.h"
|
||
|
|
||
|
/* 每盘保留 GB */
|
||
|
int drive_threshold;
|
||
|
/* 录像保留时间 */
|
||
|
int recording_reserver_time;
|
||
|
/* 磁盘空间若不足时自动覆盖 */
|
||
|
bool is_cleanup_enabled;
|
||
|
/* 保留期限若超过时强制删除 */
|
||
|
bool is_cleanup_forced_for_reserve_time;
|
||
|
/* 存储硬盘 */
|
||
|
QStringList disks;
|
||
|
|
||
|
QList<HxVideoRecord> records;
|
||
|
static bool query_record_errorcode = false;
|
||
|
|
||
|
void HxRecordCleanup::set(QJsonObject object)
|
||
|
{
|
||
|
drive_threshold = HxJson::to_int(object, "drive_threshold");
|
||
|
recording_reserver_time = HxJson::to_int(object, "recording_reserver_time");
|
||
|
is_cleanup_enabled = HxJson::to_boolean(object, "is_cleanup_enabled");
|
||
|
is_cleanup_forced_for_reserve_time = HxJson::to_boolean(object, "is_cleanup_forced_for_reserve_time");
|
||
|
|
||
|
disks.clear();
|
||
|
foreach(QString d, HxJson::to_string_list(object, "disks", ";"))
|
||
|
{
|
||
|
if (HxDisk::exist(d))
|
||
|
{
|
||
|
disks.append(d);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void HxRecordCleanup::set_records_array(QJsonArray array)
|
||
|
{
|
||
|
records.clear();
|
||
|
|
||
|
for (int i = 0; i < array.size(); i++)
|
||
|
{
|
||
|
auto object = array.at(i).toObject();
|
||
|
|
||
|
HxVideoRecord record;
|
||
|
|
||
|
record.channel = object.value("channel").toInt();
|
||
|
record.start_time = QDateTime::fromString(object.value("start_time").toString(), "yyyy-MM-dd HH:mm:ss");
|
||
|
record.end_time = object.value("end_time").toString() == "" ? QDateTime() : QDateTime::fromString(object.value("end_time").toString(), "yyyy-MM-dd HH:mm:ss");
|
||
|
record.duration = object.value("duration").toInt();
|
||
|
record.name = object.value("name").toString();
|
||
|
record.path = object.value("path").toString();
|
||
|
|
||
|
records.append(record);
|
||
|
}
|
||
|
|
||
|
query_record_errorcode = records.count() > 0;
|
||
|
}
|
||
|
|
||
|
void HxRecordCleanup::process(void)
|
||
|
{
|
||
|
/* 保留期限若超过时强制删除 */
|
||
|
if (is_cleanup_forced_for_reserve_time)
|
||
|
{
|
||
|
/* 存储期限判断 */
|
||
|
for (int i = 0; i < CHANNEL_MAX; i++)
|
||
|
{
|
||
|
if (query_record(i, QDate::currentDate().addDays((recording_reserver_time + 1) * -1), QDate::currentDate().addDays(-1)))
|
||
|
{
|
||
|
/* delete */
|
||
|
for (int i = 0; i < records.size(); i++)
|
||
|
remove(records.at(i));
|
||
|
}
|
||
|
|
||
|
QThread::msleep(100);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/* 保留期限若超过时强制删除 */
|
||
|
if (is_cleanup_enabled)
|
||
|
{
|
||
|
int needCleanNum = 0;
|
||
|
|
||
|
if (disks.count() == 0)
|
||
|
{
|
||
|
/* 存储介质丢失 */
|
||
|
HxTrace::debug_write_line("delete", "存储介质丢失");
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
/* */
|
||
|
foreach(QString drive, disks)
|
||
|
{
|
||
|
auto size = HxDisk::free_size(drive);
|
||
|
|
||
|
/* 判断磁盘可用空间 */
|
||
|
if (size <= (drive_threshold + 2))
|
||
|
{
|
||
|
needCleanNum++;
|
||
|
|
||
|
HxTrace::debug_write_line("delete", QString("need clean num = %1/%2").arg(needCleanNum).arg(disks.count()));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/* 所有磁盘都满了的情况下, 删除最早的录像 */
|
||
|
if (needCleanNum == disks.count())
|
||
|
{
|
||
|
if (query_first_record())
|
||
|
{
|
||
|
auto date = records[0].start_time.date();
|
||
|
|
||
|
if (!query_record(date))
|
||
|
return;
|
||
|
|
||
|
HxTrace::debug_write_line("delete", QString("need clean record count = %1").arg(records.size()));
|
||
|
|
||
|
/* delete */
|
||
|
for (int i = 0; i < records.size(); i++)
|
||
|
{
|
||
|
remove(records.at(i));
|
||
|
|
||
|
HxTrace::debug_write_line("delete", QString("delete file = %1/%2").arg(i + 1).arg(records.size()));
|
||
|
}
|
||
|
|
||
|
HxBroadcast::publish_json(7, { {"date", date.toString("yyyy-MM-dd")} });
|
||
|
|
||
|
HxTrace::debug_write_line("delete", "finished");
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
bool HxRecordCleanup::query_first_record()
|
||
|
{
|
||
|
query_record_errorcode = false;
|
||
|
|
||
|
HxBroadcast::publish_json(5);
|
||
|
|
||
|
return HxTask::wait([=]() -> bool { return query_record_errorcode; }, 3000);
|
||
|
}
|
||
|
|
||
|
bool HxRecordCleanup::query_record(QDate date)
|
||
|
{
|
||
|
query_record_errorcode = false;
|
||
|
|
||
|
HxBroadcast::publish_json(5, { {"date", date.toString("yyyy-MM-dd")} });
|
||
|
|
||
|
return HxTask::wait([=]() -> bool { return query_record_errorcode; }, 3000);
|
||
|
}
|
||
|
|
||
|
bool HxRecordCleanup::query_record(int channel, QDate start_date, QDate end_date)
|
||
|
{
|
||
|
query_record_errorcode = false;
|
||
|
|
||
|
HxBroadcast::publish_json(5, { {"channel", channel},
|
||
|
{"start_date", start_date.toString("yyyy-MM-dd")},
|
||
|
{"end_date", end_date.toString("yyyy-MM-dd")} });
|
||
|
|
||
|
return HxTask::wait([=]() -> bool { return query_record_errorcode; }, 3000);
|
||
|
}
|
||
|
|
||
|
void HxRecordCleanup::remove(HxVideoRecord record)
|
||
|
{
|
||
|
/* delete file */
|
||
|
HxDisk::remove(record.path);
|
||
|
|
||
|
/* delete database */
|
||
|
HxBroadcast::publish_json(7, { {"path", record.path} });
|
||
|
|
||
|
HxTrace::debug_write_line("delete", QString("delete record %1").arg(record.name));
|
||
|
}
|