IVA/app/HxDataBase.cpp
2023-10-20 23:36:22 +08:00

249 lines
6.7 KiB
C++

#include "HxDataBase.h"
QMutex DataBase::mutex;
QSqlDatabase DataBase::database;
QString DataBase::device_id;
QString DataBase::ftp_address;
QString DataBase::ftp_username;
QString DataBase::ftp_password;
int DataBase::algorithm_type;
QString DataBase::dsm_video_input_source;
QString DataBase::adas_video_input_source;
QStringList DataBase::bsd_video_input_source;
QStringList DataBase::bsd_warn_regions;
QSqlDatabase DataBase::open(QString filepath, QString connectionName)
{
QSqlDatabase db;
if (QSqlDatabase::contains(connectionName))
db = QSqlDatabase::database(connectionName);
else
db = QSqlDatabase::addDatabase("QSQLITE", connectionName);
db.setDatabaseName(filepath);
if (!db.open())
{
QString bk_filepath = filepath + QString(".[%1].bk").arg(QDateTime::currentDateTime().toString("yyyyMMddHHmmss"));
QFile::copy(filepath, bk_filepath);
QFile::remove(filepath);
db.open();
}
return db;
}
/**
* @brief 关闭数据库
* @param connectionName 连接名
*/
void DataBase::close(QString connectionName) { QSqlDatabase::removeDatabase(connectionName); }
/**
* @brief 读取 Setting 表数据
* @param name name字段值
* @return 返回对应参数
*/
QVariant DataBase::read_setting(QString name)
{
QVariant value;
QMutexLocker lock(&mutex);
QSqlQuery query(database);
query.prepare("SELECT [value] FROM [Setting] WHERE [name]=:name");
query.bindValue(":name", name);
if (query.exec())
{
if (query.next())
value = query.value("value");
}
query.clear();
return value;
}
/**
* @brief 读取 Setting 表数据(int)
* @param name name字段值
* @param defaultValue 默认值(int)
* @return 返回对应参数(int)
*/
int DataBase::read_setting(QString name, int defaultValue)
{
auto value = read_setting(name);
return value.isNull() ? defaultValue : value.toInt();
}
/**
* @brief 读取 Setting 表数据(bool)
* @param name name字段值
* @param defaultValue 默认值(bool)
* @return 返回对应参数(bool)
*/
bool DataBase::read_setting(QString name, bool defaultValue)
{
auto value = read_setting(name);
return value.isNull() ? defaultValue : value.toBool();
}
/**
* @brief 读取 Setting 表数据(string)
* @param name name字段值
* @param defaultValue 默认值(string)
* @return 返回对应参数(string)
*/
QString DataBase::read_setting(QString name, QString defaultValue)
{
auto value = read_setting(name);
return value.isNull() ? defaultValue : value.toString();
}
/**
* @brief 写入 Setting 表数据
* @param name name字段值
* @param value 对应参数
*/
void DataBase::write_setting(QString name, QString value)
{
QMutexLocker lock(&mutex);
QSqlQuery query(database);
query.prepare("REPLACE INTO [Setting] ([name], [value]) VALUES (:name, :value);");
query.bindValue(":name", name);
query.bindValue(":value", value);
if (!query.exec())
{
qDebug("write_setting failed, name=%s, value=%s", name.toUtf8().data(), value.toUtf8().data());
}
query.clear();
}
void DataBase::initialization()
{
database = open("DataBase.db", "DataBase");
if (!database.isOpen())
{
qDebug("配置信息创建失败, 程序无法继续启动!");
return;
}
QSqlQuery query(database);
/* 创建 程序配置信息 表 */
if (!query.exec("CREATE TABLE IF NOT EXISTS [Setting] ("
" [name] TEXT NOT NULL PRIMARY KEY,"
" [value] TEXT"
");"))
{
qDebug("配置表创建失败");
return;
}
/* */
device_id = read_setting("device_id", QString("TVIS"));
/* */
ftp_address = read_setting("ftp_address", QString("192.168.10.10:7616"));
/* */
ftp_username = read_setting("ftp_username", QString("nvruser"));
/* */
ftp_password = read_setting("ftp_password", QString("Sztvis_789."));
/* 算法类型, 默认 BSD */
algorithm_type = read_setting("algorithm_type", 0x02);
/* DSM 视频输入源 (string) */
dsm_video_input_source = read_setting("dsm_video_input_source", QString(""));
/* Adas 视频输入源 (string) */
adas_video_input_source = read_setting("adas_video_input_source", QString(""));
/* BSD 视频输入源 (string) */
bsd_video_input_source = read_setting("bsd_video_input_source", QString(";;;;;;")).split(";");
bsd_warn_regions = read_setting(
"bsd_warn_regions",
QString("0,0 0,0 0,0 0,0$0,0 0,0 0,0 0,0$0,0 0,0 0,0 0,0*"
"0,0 0,0 0,0 0,0$0,0 0,0 0,0 0,0$0,0 0,0 0,0 0,0*"
"0,0 0,0 0,0 0,0$0,0 0,0 0,0 0,0$0,0 0,0 0,0 0,0*"
"0,0 0,0 0,0 0,0$0,0 0,0 0,0 0,0$0,0 0,0 0,0 0,0*"
"0,0 0,0 0,0 0,0$0,0 0,0 0,0 0,0$0,0 0,0 0,0 0,0*"
"0,0 0,0 0,0 0,0$0,0 0,0 0,0 0,0$0,0 0,0 0,0 0,0"))
.split("*");
}
bool DataBase::save_setting()
{
database.transaction();
write_setting("device_id", device_id);
write_setting("ftp_address", ftp_address);
write_setting("ftp_username", ftp_username);
write_setting("ftp_password", ftp_password);
write_setting("algorithm_type", QString::number(algorithm_type));
write_setting("dsm_video_input_source", dsm_video_input_source);
write_setting("adas_video_input_source", adas_video_input_source);
write_setting("bsd_video_input_source", bsd_video_input_source.join(";"));
write_setting("bsd_warn_regions", bsd_warn_regions.join("*"));
return database.commit();
}
/**
* @brief 获取BSD报警区域
* @param channel 通道号
* @return 返回 BsdWarnRegion 结构体
*/
BsdWarnRegion DataBase::get_bsd_warn_region(int channel)
{
BsdWarnRegion ret;
auto data = bsd_warn_regions[channel];
if (data == "")
data = "0,0 0,0 0,0 0,0$0,0 0,0 0,0 0,0$0,0 0,0 0,0 0,0";
auto array = data.split("$");
auto points = array[0].split(" ");
for (int a = 0; a < 4; a++)
{
auto p = points.at(a).split(",");
ret.tFirstRegionPoint[a].x = p[0].toInt();
ret.tFirstRegionPoint[a].y = p[1].toInt();
}
points = array[1].split(" ");
for (int a = 0; a < 4; a++)
{
auto p = points.at(a).split(",");
ret.tSecondRegionPoint[a].x = p[0].toInt();
ret.tSecondRegionPoint[a].y = p[1].toInt();
}
points = array[2].split(" ");
for (int a = 0; a < 4; a++)
{
auto p = points.at(a).split(",");
ret.tThirdRegionPoint[a].x = p[0].toInt();
ret.tThirdRegionPoint[a].y = p[1].toInt();
}
return ret;
}