#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; }