HxVideoCaptor/HxRecordCleanup.cpp

173 lines
5.2 KiB
C++
Raw Permalink Normal View History

2024-01-21 22:22:39 +08:00
#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));
}