#include "HxRecordCleanup.h" #include "HxDisk.h" #include "HxJson.h" #include "HxTrace.h" /* 每盘保留 GB */ int drive_threshold; /* 录像保留时间 */ int recording_reserver_time; /* 磁盘空间若不足时自动覆盖 */ bool is_cleanup_enabled = false; /* 保留期限若超过时强制删除 */ bool is_cleanup_forced_for_reserve_time = false; /* 存储硬盘 */ QStringList disks; QList 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)); }