修改数据库表结构
This commit is contained in:
parent
97f22cf302
commit
2782c6867c
87
Channel.cpp
87
Channel.cpp
@ -45,7 +45,7 @@ Channel::Channel(QObject* parent)
|
|||||||
if (lineIn == nullptr) {
|
if (lineIn == nullptr) {
|
||||||
lineIn = Link::create("InputAlsa");
|
lineIn = Link::create("InputAlsa");
|
||||||
QVariantMap dataIn;
|
QVariantMap dataIn;
|
||||||
dataIn["path"] = "hw:0,0";
|
dataIn["path"] = "hw:0";
|
||||||
dataIn["channels"] = 2;
|
dataIn["channels"] = 2;
|
||||||
lineIn->start(dataIn);
|
lineIn->start(dataIn);
|
||||||
}
|
}
|
||||||
@ -194,53 +194,62 @@ void Channel::init()
|
|||||||
void Channel::startRecord()
|
void Channel::startRecord()
|
||||||
{
|
{
|
||||||
// 记录本次录制开始时间以及当前视频录制的开始时间
|
// 记录本次录制开始时间以及当前视频录制的开始时间
|
||||||
QString curTime = QDateTime::currentDateTime().toString("yyyyMMddhhmmss");
|
QString time = QDateTime::currentDateTime().toString("yyyyMMddhhmmss");
|
||||||
startTime = curTime;
|
startTime = time;
|
||||||
currentTime = curTime;
|
curTime = time;
|
||||||
QVariantMap dataRecord;
|
QVariantMap dataRecord;
|
||||||
QString path = QString("%1/%2/%3_%d.mp4").arg(Constant::VideoPath).arg(channelName).arg(curTime);
|
QString path = QString("%1/%2/%3_%d.mp4").arg(Constant::VideoPath).arg(channelName).arg(curTime);
|
||||||
dataRecord["path"] = path;
|
dataRecord["path"] = path;
|
||||||
record->start(dataRecord);
|
record->start(dataRecord);
|
||||||
isRecord = true;
|
isRecord = true;
|
||||||
Log::info("{} start recording...", channelName.toStdString());
|
Log::info("{} start recording...", channelName.toStdString());
|
||||||
Log::info("open done {}", path.toStdString());
|
|
||||||
|
|
||||||
// 显示录制状态水印
|
// 显示录制状态水印
|
||||||
overlay->setData(recordOverlay);
|
overlay->setData(recordOverlay);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief 新事件槽函数
|
* @brief 新事件槽函数,用于分段录制
|
||||||
* @param msg 时间类型
|
* @param msg 时间类型
|
||||||
* @param data 数据
|
* @param data 数据
|
||||||
*/
|
*/
|
||||||
void Channel::onNewEvent(QString msg, QVariant data)
|
void Channel::onNewEvent(QString msg, QVariant data)
|
||||||
{
|
{
|
||||||
if (msg == "newSegment") {
|
if (msg == "newSegment") {
|
||||||
|
QString datetime = curTime;
|
||||||
|
// 重新设置视频的录制起始时间
|
||||||
|
curTime = QDateTime::currentDateTime().toString("yyyyMMddhhmmss");
|
||||||
segmentId = data.toInt();
|
segmentId = data.toInt();
|
||||||
// 将上一次的文件信息存入数据库中
|
// 修改文件名:本次录制起始时间_%d ==> 当前视频录制起始时间
|
||||||
DatabaseManager::File file;
|
QString filename = QString("%1_%2.mp4").arg(startTime).arg(segmentId - 1);
|
||||||
file.channel = channelName == Constant::MainChannel
|
QString newFilename = QString("%1/%2/%3.mp4").arg(Constant::VideoPath).arg(channelName).arg(datetime);
|
||||||
|
QString path = QString("%1/%2/%3").arg(Constant::VideoPath).arg(channelName).arg(filename);
|
||||||
|
QFile file(path);
|
||||||
|
if (!file.rename(newFilename)) {
|
||||||
|
Log::error("rename file name failed in function onNewEvent, old filename: {}, target filename: {} , channel name: {},reason: {}",
|
||||||
|
path.toStdString(),
|
||||||
|
newFilename.toStdString(),
|
||||||
|
channelName.toStdString(),
|
||||||
|
file.errorString().toStdString());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// 将录制完的文件信息保存到数据库
|
||||||
|
DatabaseManager::File fileInfo;
|
||||||
|
fileInfo.channel = channelName == Constant::MainChannel
|
||||||
? DatabaseManager::MainChannel
|
? DatabaseManager::MainChannel
|
||||||
: DatabaseManager::SecondaryChannel;
|
: DatabaseManager::SecondaryChannel;
|
||||||
// 设置当前视频的录制时间信息
|
fileInfo.datetime = QDateTime::fromString(datetime, "yyyyMMddhhmmss").toString("yyyy-MM-dd hh:mm:ss");
|
||||||
file.year = currentTime.mid(0, 4);
|
fileInfo.filename = QString("%1.mp4").arg(datetime);
|
||||||
file.month = currentTime.mid(4, 2);
|
if (db->insert(fileInfo)) {
|
||||||
file.day = currentTime.mid(6, 2);
|
|
||||||
file.time = currentTime.mid(8, 6);
|
|
||||||
// 设置当前视频的文件名,格式:本次录制开始时间_第几次分片
|
|
||||||
file.filename = QString("%1_%2.mp4").arg(startTime).arg(segmentId - 1);
|
|
||||||
if (db->insert(file)) {
|
|
||||||
Log::info("insert one record into database success, name: {}, channel: {}",
|
Log::info("insert one record into database success, name: {}, channel: {}",
|
||||||
file.filename.toStdString(),
|
fileInfo.filename.toStdString(),
|
||||||
channelName.toStdString());
|
channelName.toStdString());
|
||||||
} else {
|
} else {
|
||||||
Log::error("insert one record into database failed, name: {}, channel: {}",
|
Log::error("insert one record into database failed, name: {}, channel: {}",
|
||||||
file.filename.toStdString(),
|
fileInfo.filename.toStdString(),
|
||||||
channelName.toStdString());
|
channelName.toStdString());
|
||||||
}
|
}
|
||||||
// 更新当前录制录制视频的时间
|
// 更新当前录制录制视频的时间
|
||||||
currentTime = QDateTime::currentDateTime().toString("yyyyMMddhhmmss");
|
|
||||||
emit appendOneVideo(channelName);
|
emit appendOneVideo(channelName);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -252,17 +261,41 @@ void Channel::stopRecord()
|
|||||||
{
|
{
|
||||||
Log::info("{} stop recording...", channelName.toStdString());
|
Log::info("{} stop recording...", channelName.toStdString());
|
||||||
record->stop(true);
|
record->stop(true);
|
||||||
|
// 修改文件名:本次录制起始时间_%d ==> 当前视频录制起始时间
|
||||||
|
QString filename = QString("%1_%2.mp4").arg(startTime).arg(segmentId);
|
||||||
|
QString newFilename = QString("%1/%2/%3.mp4").arg(Constant::VideoPath).arg(channelName).arg(curTime);
|
||||||
|
QString path = QString("%1/%2/%3").arg(Constant::VideoPath).arg(channelName).arg(filename);
|
||||||
|
QFile file(path);
|
||||||
|
if (!file.rename(newFilename)) {
|
||||||
|
Log::error("rename file name failed in function onNewEvent, old filename: {}, target filename: {} , channel name: {},reason: {}",
|
||||||
|
path.toStdString(),
|
||||||
|
newFilename.toStdString(),
|
||||||
|
channelName.toStdString(),
|
||||||
|
file.errorString().toStdString());
|
||||||
|
return;
|
||||||
|
}
|
||||||
// 将录制文件的信息存入数据库
|
// 将录制文件的信息存入数据库
|
||||||
DatabaseManager::File file;
|
DatabaseManager::File fileInfo;
|
||||||
file.channel = channelName == Constant::MainChannel
|
fileInfo.channel = channelName == Constant::MainChannel
|
||||||
? DatabaseManager::MainChannel
|
? DatabaseManager::MainChannel
|
||||||
: DatabaseManager::SecondaryChannel;
|
: DatabaseManager::SecondaryChannel;
|
||||||
file.year = currentTime.mid(0, 4);
|
fileInfo.datetime = QDateTime::fromString(curTime, "yyyyMMddhhmmss").toString("yyyy-MM-dd hh:mm:ss");
|
||||||
file.month = currentTime.mid(4, 2);
|
fileInfo.filename = QString("%1.mp4").arg(curTime);
|
||||||
file.day = currentTime.mid(6, 2);
|
if (db->insert(fileInfo)) {
|
||||||
file.time = currentTime.mid(8, 6);
|
Log::info("insert one record into database success, name: {}, channel: {}",
|
||||||
file.filename = QString("%1_%2.mp4").arg(startTime).arg(segmentId);
|
fileInfo.filename.toStdString(),
|
||||||
|
channelName.toStdString());
|
||||||
|
} else {
|
||||||
|
Log::error("insert one record into database failed, name: {}, channel: {}",
|
||||||
|
fileInfo.filename.toStdString(),
|
||||||
|
channelName.toStdString());
|
||||||
|
}
|
||||||
|
// 更新当前录制录制视频的时间
|
||||||
|
emit appendOneVideo(channelName);
|
||||||
overlay->setData(norecordOverlay);
|
overlay->setData(norecordOverlay);
|
||||||
|
// 重置时间
|
||||||
|
startTime = "";
|
||||||
|
curTime = "";
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -63,7 +63,7 @@ public:
|
|||||||
int duration = 1 * 60 * 1000; // 单个视频时长
|
int duration = 1 * 60 * 1000; // 单个视频时长
|
||||||
bool isRecord = false;
|
bool isRecord = false;
|
||||||
QString startTime; // 本次录制文件的开始时间
|
QString startTime; // 本次录制文件的开始时间
|
||||||
QString currentTime; // 当前录制文件的开始时间
|
QString curTime; // 当前录制文件的开始时间
|
||||||
int segmentId = 0;
|
int segmentId = 0;
|
||||||
LinkObject* overlay; // 水印,提示是否在录制视频
|
LinkObject* overlay; // 水印,提示是否在录制视频
|
||||||
QVariantMap recordOverlay; // 录制状态下的水印参数
|
QVariantMap recordOverlay; // 录制状态下的水印参数
|
||||||
|
@ -34,7 +34,7 @@ void CheckStorageThread::run()
|
|||||||
// 从数据库中取出前两条数据,找到相关的文件删除
|
// 从数据库中取出前两条数据,找到相关的文件删除
|
||||||
QList<DatabaseManager::File> fileList = db->getTopTwo();
|
QList<DatabaseManager::File> fileList = db->getTopTwo();
|
||||||
for (auto& file : fileList) {
|
for (auto& file : fileList) {
|
||||||
QString filename = file.time;
|
QString filename = file.filename;
|
||||||
QString channel = file.channel == DatabaseManager::MainChannel
|
QString channel = file.channel == DatabaseManager::MainChannel
|
||||||
? Constant::MainChannel
|
? Constant::MainChannel
|
||||||
: Constant::SecondaryChannel;
|
: Constant::SecondaryChannel;
|
||||||
@ -55,7 +55,7 @@ void CheckStorageThread::run()
|
|||||||
Log::info("remove file {} success", path.toStdString());
|
Log::info("remove file {} success", path.toStdString());
|
||||||
}
|
}
|
||||||
// 从数据库清除这条记录
|
// 从数据库清除这条记录
|
||||||
db->remove(file.channel, file.time);
|
db->remove(file.channel, file.filename);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
emit diskNotFull();
|
emit diskNotFull();
|
||||||
|
@ -66,18 +66,15 @@ void DatabaseManager::close()
|
|||||||
bool DatabaseManager::insert(File file)
|
bool DatabaseManager::insert(File file)
|
||||||
{
|
{
|
||||||
QSqlQuery query;
|
QSqlQuery query;
|
||||||
query.prepare("insert into file (channel, year, month, day, time, filename) values (?, ?, ?, ?, ?, ?)");
|
query.prepare("insert into file (channel, datetime, filename) values (?, ?, ?)");
|
||||||
query.bindValue(0, file.channel);
|
query.addBindValue(file.channel);
|
||||||
query.bindValue(1, file.year);
|
query.addBindValue(file.datetime);
|
||||||
query.bindValue(2, file.month);
|
query.addBindValue(file.filename);
|
||||||
query.bindValue(3, file.day);
|
|
||||||
query.bindValue(4, file.time);
|
|
||||||
query.bindValue(5, file.filename);
|
|
||||||
if (query.exec()) {
|
if (query.exec()) {
|
||||||
return true;
|
return true;
|
||||||
} else {
|
} else {
|
||||||
Log::error("insert one record into database failed, reason: {}",
|
Log::error("insert one record into database failed, reason: {}",
|
||||||
query.lastError().databaseText().toStdString());
|
query.lastError().databaseText().toStdString() + "," + query.lastError().driverText().toStdString());
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -91,29 +88,24 @@ QList<DatabaseManager::File> DatabaseManager::get(QVariantMap params)
|
|||||||
{
|
{
|
||||||
QList<DatabaseManager::File> result;
|
QList<DatabaseManager::File> result;
|
||||||
QSqlQuery query;
|
QSqlQuery query;
|
||||||
QString sql = "select * from file where channel=? and year = ? and month = ? and day = ?";
|
QString sql = "select * from file where channel=? and datetime like \'%1\'";
|
||||||
QString year = params.value("year").toString();
|
QString year = params.value("year").toString();
|
||||||
QString month = params.value("month").toString();
|
QString month = params.value("month").toString();
|
||||||
QString day = params.value("day").toString();
|
QString day = params.value("day").toString();
|
||||||
Channel chn = static_cast<Channel>(params.value("channel").toInt());
|
Channel chn = static_cast<Channel>(params.value("channel").toInt());
|
||||||
query.prepare(sql);
|
|
||||||
query.bindValue(0, chn);
|
|
||||||
query.bindValue(1, year);
|
|
||||||
query.bindValue(2, month);
|
|
||||||
query.bindValue(3, day);
|
|
||||||
if (year.isEmpty() || month.isEmpty() || day.isEmpty() || (chn != MainChannel && chn != SecondaryChannel)) {
|
if (year.isEmpty() || month.isEmpty() || day.isEmpty() || (chn != MainChannel && chn != SecondaryChannel)) {
|
||||||
Log::error("select from database error, params error");
|
Log::error("select from database error, params error");
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
query.prepare(sql);
|
||||||
|
query.bindValue(0, chn);
|
||||||
|
query.bindValue(1, QString("%1-%2-%3%"));
|
||||||
if (query.exec()) {
|
if (query.exec()) {
|
||||||
while (query.next()) {
|
while (query.next()) {
|
||||||
DatabaseManager::File file;
|
DatabaseManager::File file;
|
||||||
file.id = query.value("id").toInt();
|
file.id = query.value("id").toInt();
|
||||||
file.year = query.value("year").toString();
|
|
||||||
file.month = query.value("month").toString();
|
|
||||||
file.day = query.value("day").toString();
|
|
||||||
file.channel = static_cast<DatabaseManager::Channel>(query.value("channel").toInt());
|
file.channel = static_cast<DatabaseManager::Channel>(query.value("channel").toInt());
|
||||||
file.time = query.value("time").toString();
|
file.datetime = query.value("datetime").toString();
|
||||||
file.filename = query.value("filename").toString();
|
file.filename = query.value("filename").toString();
|
||||||
result.push_back(file);
|
result.push_back(file);
|
||||||
}
|
}
|
||||||
@ -141,11 +133,8 @@ QList<DatabaseManager::File> DatabaseManager::get(DatabaseManager::Channel chn)
|
|||||||
while (query.next()) {
|
while (query.next()) {
|
||||||
DatabaseManager::File file;
|
DatabaseManager::File file;
|
||||||
file.id = query.value("id").toInt();
|
file.id = query.value("id").toInt();
|
||||||
file.year = query.value("year").toString();
|
|
||||||
file.month = query.value("month").toString();
|
|
||||||
file.day = query.value("day").toString();
|
|
||||||
file.channel = static_cast<DatabaseManager::Channel>(query.value("channel").toInt());
|
file.channel = static_cast<DatabaseManager::Channel>(query.value("channel").toInt());
|
||||||
file.time = query.value("time").toString();
|
file.datetime = query.value("datetime").toString();
|
||||||
file.filename = query.value("filename").toString();
|
file.filename = query.value("filename").toString();
|
||||||
result.push_back(file);
|
result.push_back(file);
|
||||||
}
|
}
|
||||||
@ -155,7 +144,6 @@ QList<DatabaseManager::File> DatabaseManager::get(DatabaseManager::Channel chn)
|
|||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief 获取前两条记录
|
* @brief 获取前两条记录
|
||||||
*/
|
*/
|
||||||
@ -168,11 +156,8 @@ QList<DatabaseManager::File> DatabaseManager::getTopTwo()
|
|||||||
while (query.next()) {
|
while (query.next()) {
|
||||||
DatabaseManager::File file;
|
DatabaseManager::File file;
|
||||||
file.id = query.value("id").toInt();
|
file.id = query.value("id").toInt();
|
||||||
file.year = query.value("year").toString();
|
|
||||||
file.month = query.value("month").toString();
|
|
||||||
file.day = query.value("day").toString();
|
|
||||||
file.channel = static_cast<DatabaseManager::Channel>(query.value("channel").toInt());
|
file.channel = static_cast<DatabaseManager::Channel>(query.value("channel").toInt());
|
||||||
file.time = query.value("time").toString();
|
file.datetime = query.value("datetime").toString();
|
||||||
file.filename = query.value("filename").toString();
|
file.filename = query.value("filename").toString();
|
||||||
result.push_back(file);
|
result.push_back(file);
|
||||||
}
|
}
|
||||||
@ -191,7 +176,11 @@ QStringList DatabaseManager::getAllYears(Channel chn)
|
|||||||
{
|
{
|
||||||
QStringList result;
|
QStringList result;
|
||||||
QSqlQuery query;
|
QSqlQuery query;
|
||||||
query.prepare("select distinct year from file");
|
query.prepare(R"(
|
||||||
|
select distinct strftime('%Y', datetime) as year
|
||||||
|
from file
|
||||||
|
order by year
|
||||||
|
)");
|
||||||
if (query.exec()) {
|
if (query.exec()) {
|
||||||
while (query.next()) {
|
while (query.next()) {
|
||||||
QString year = query.value(0).toString();
|
QString year = query.value(0).toString();
|
||||||
@ -214,7 +203,12 @@ QStringList DatabaseManager::getAllMonths(Channel chn, QString year)
|
|||||||
{
|
{
|
||||||
QStringList result;
|
QStringList result;
|
||||||
QSqlQuery query;
|
QSqlQuery query;
|
||||||
query.prepare("select distinct month from file where channel = ? and year=?");
|
query.prepare(R"(
|
||||||
|
select distinct strftime('%m', datetime) as month
|
||||||
|
from file
|
||||||
|
where channel = ? and strftime('%Y', datetime) = '?'
|
||||||
|
order by month
|
||||||
|
)");
|
||||||
query.bindValue(0, chn);
|
query.bindValue(0, chn);
|
||||||
query.bindValue(1, year);
|
query.bindValue(1, year);
|
||||||
if (query.exec()) {
|
if (query.exec()) {
|
||||||
@ -240,7 +234,14 @@ QStringList DatabaseManager::getAllDays(Channel chn, QString year, QString month
|
|||||||
{
|
{
|
||||||
QStringList result;
|
QStringList result;
|
||||||
QSqlQuery query;
|
QSqlQuery query;
|
||||||
query.prepare("select distinct day from file where channel = ? and year=? and month=?");
|
query.prepare(R"(
|
||||||
|
select distinct strftime('%d', datetime) as day
|
||||||
|
from file
|
||||||
|
where channel = ?
|
||||||
|
and strftime('%Y', datetime) = '?'
|
||||||
|
and strftime('%m', datetime) = '?'
|
||||||
|
order by day
|
||||||
|
)");
|
||||||
query.bindValue(0, chn);
|
query.bindValue(0, chn);
|
||||||
query.bindValue(1, year);
|
query.bindValue(1, year);
|
||||||
query.bindValue(2, month);
|
query.bindValue(2, month);
|
||||||
|
@ -13,11 +13,8 @@ public:
|
|||||||
struct File {
|
struct File {
|
||||||
int id; // id
|
int id; // id
|
||||||
Channel channel; // 通道
|
Channel channel; // 通道
|
||||||
QString year; // 年
|
QString datetime; // 时间 yyyy-MM-dd hh:mm:ss
|
||||||
QString month; // 月
|
QString filename; // 文件名
|
||||||
QString day; // 日
|
|
||||||
QString time; // 时分秒,hh:mm:ss
|
|
||||||
QString filename; // 真实路径
|
|
||||||
};
|
};
|
||||||
static DatabaseManager* getInstace();
|
static DatabaseManager* getInstace();
|
||||||
~DatabaseManager();
|
~DatabaseManager();
|
||||||
@ -30,7 +27,6 @@ public:
|
|||||||
bool remove(DatabaseManager::Channel chn, QString name);
|
bool remove(DatabaseManager::Channel chn, QString name);
|
||||||
|
|
||||||
QList<DatabaseManager::File> getTopTwo();
|
QList<DatabaseManager::File> getTopTwo();
|
||||||
|
|
||||||
QList<DatabaseManager::File> get(QVariantMap params);
|
QList<DatabaseManager::File> get(QVariantMap params);
|
||||||
QList<DatabaseManager::File> get(Channel chn);
|
QList<DatabaseManager::File> get(Channel chn);
|
||||||
QStringList getAllYears(Channel chn);
|
QStringList getAllYears(Channel chn);
|
||||||
|
2
Menu.cpp
2
Menu.cpp
@ -155,7 +155,7 @@ void Menu::renderContents()
|
|||||||
for (int i = 0; i < contentList.length(); i++) {
|
for (int i = 0; i < contentList.length(); i++) {
|
||||||
// 文件名格式: hhmmss,只将时分秒显示到界面上
|
// 文件名格式: hhmmss,只将时分秒显示到界面上
|
||||||
DatabaseManager::File file = contentList.at(i);
|
DatabaseManager::File file = contentList.at(i);
|
||||||
QString text = QString("%1:%2:%3").arg(file.time.mid(0, 2)).arg(file.time.mid(2, 2)).arg(file.time.mid(4, 2));
|
QString text = QDateTime::fromString(file.datetime, "yyyy-MM-dd hh:mm:ss").toString("hh:mm:ss");
|
||||||
QPushButton* btn = new QPushButton(text, ui->scrollArea);
|
QPushButton* btn = new QPushButton(text, ui->scrollArea);
|
||||||
btn->setProperty("name", file.filename);
|
btn->setProperty("name", file.filename);
|
||||||
btn->setMinimumHeight(CONTENT_CELL_HEIGHT);
|
btn->setMinimumHeight(CONTENT_CELL_HEIGHT);
|
||||||
|
@ -193,13 +193,10 @@ void TcpRequestHandler::getFileList(TcpRequest* request, TcpResponse* reponse)
|
|||||||
: DatabaseManager::SecondaryChannel;
|
: DatabaseManager::SecondaryChannel;
|
||||||
QString interface = params.value("interface").toString();
|
QString interface = params.value("interface").toString();
|
||||||
QList<DatabaseManager::File> fileList = db->get(channel);
|
QList<DatabaseManager::File> fileList = db->get(channel);
|
||||||
QVariantList result;
|
QStringList result;
|
||||||
for (const DatabaseManager::File& file : fileList) {
|
for (const DatabaseManager::File& file : fileList) {
|
||||||
QString time = file.year + file.month + file.day + file.time;
|
|
||||||
QVariantMap fileInfo;
|
QVariantMap fileInfo;
|
||||||
fileInfo["time"] = time;
|
result.push_back(file.filename);
|
||||||
fileInfo["filename"] = file.filename;
|
|
||||||
result.push_back(fileInfo);
|
|
||||||
}
|
}
|
||||||
reponse->success("获取文件成功", QVariant::fromValue(result));
|
reponse->success("获取文件成功", QVariant::fromValue(result));
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user