144 lines
4.2 KiB
C++
144 lines
4.2 KiB
C++
|
#include "GetInterfaceData.h"
|
|||
|
|
|||
|
/**
|
|||
|
* @brief 安全地将字符串转换为整数
|
|||
|
* @param str 要转换的字符串
|
|||
|
* @param defaultValue 转换失败时的默认值
|
|||
|
* @return 转换后的整数值
|
|||
|
*/
|
|||
|
static int safe_stoi(const std::string &str, int defaultValue = 0)
|
|||
|
{
|
|||
|
if (str.empty()) {
|
|||
|
return defaultValue;
|
|||
|
}
|
|||
|
try {
|
|||
|
return std::stoi(str);
|
|||
|
} catch (const std::exception &) {
|
|||
|
return defaultValue;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* @brief 回调函数,用于处理查询结果
|
|||
|
* @param data 用户数据指针
|
|||
|
* @param argc 列数
|
|||
|
* @param argv 列值数组
|
|||
|
* @param azColName 列名数组
|
|||
|
* @return 0表示成功
|
|||
|
*/
|
|||
|
static int callback(void *data, int argc, char **argv, char **azColName)
|
|||
|
{
|
|||
|
if (!data || !argv || !azColName) {
|
|||
|
return 0;
|
|||
|
}
|
|||
|
auto *allData = static_cast<AllInterfaceData *>(data);
|
|||
|
static bool isFirstRecord = true;
|
|||
|
std::string currentSystemName;
|
|||
|
std::string currentPlaneName;
|
|||
|
std::string currentATAName;
|
|||
|
std::string currentModelStructName;
|
|||
|
InterfaceData currentInterfaceData;
|
|||
|
|
|||
|
//先把数据都读出来
|
|||
|
for (int i = 0; i < argc; i++) {
|
|||
|
std::string colName = azColName[i];
|
|||
|
std::string value = argv[i] ? argv[i] : "";
|
|||
|
if (colName == "SystemName") {
|
|||
|
currentSystemName = value;
|
|||
|
} else if (colName == "PlaneName") {
|
|||
|
currentPlaneName = value;
|
|||
|
} else if (colName == "ATAName") {
|
|||
|
currentATAName = value;
|
|||
|
} else if (colName == "ModelStructName") {
|
|||
|
currentModelStructName = value;
|
|||
|
} else if (colName == "InterfaceName") {
|
|||
|
currentInterfaceData.interfaceName = value;
|
|||
|
} else if (colName == "InterfaceType") {
|
|||
|
currentInterfaceData.interfaceType = value;
|
|||
|
} else if (colName == "InterfaceIsArray") {
|
|||
|
currentInterfaceData.interfaceIsArray = safe_stoi(value);
|
|||
|
} else if (colName == "InterfaceArraySize_1") {
|
|||
|
currentInterfaceData.interfaceArraySize_1 = safe_stoi(value);
|
|||
|
} else if (colName == "InterfaceArraySize_2") {
|
|||
|
currentInterfaceData.interfaceArraySize_2 = safe_stoi(value);
|
|||
|
} else if (colName == "InterfaceNotes") {
|
|||
|
currentInterfaceData.interfaceNotes = value;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// 如果是第一条记录,初始化系统名称和飞机名称
|
|||
|
if (isFirstRecord) {
|
|||
|
allData->systemName = currentSystemName;
|
|||
|
allData->planeName = currentPlaneName;
|
|||
|
isFirstRecord = false;
|
|||
|
}
|
|||
|
|
|||
|
// 检查系统名称和飞机名称是否匹配
|
|||
|
if (currentSystemName != allData->systemName || currentPlaneName != allData->planeName) {
|
|||
|
return 0;
|
|||
|
}
|
|||
|
|
|||
|
//检查ATA是否已存在
|
|||
|
for (auto &ata : allData->ataInterfaceData) {
|
|||
|
if (ata.ataName == currentATAName) {
|
|||
|
for (auto &structData : ata.structInterfaceData) {
|
|||
|
if (structData.modelStructName == currentModelStructName) {
|
|||
|
for (auto &interfaceData : structData.interfaceData) {
|
|||
|
if (interfaceData.interfaceName == currentInterfaceData.interfaceName) {
|
|||
|
return 0;
|
|||
|
}
|
|||
|
}
|
|||
|
structData.interfaceData.push_back(currentInterfaceData);
|
|||
|
return 0;
|
|||
|
}
|
|||
|
}
|
|||
|
StructInterfaceData structData;
|
|||
|
structData.modelStructName = currentModelStructName;
|
|||
|
structData.interfaceData.push_back(currentInterfaceData);
|
|||
|
ata.structInterfaceData.push_back(structData);
|
|||
|
return 0;
|
|||
|
}
|
|||
|
}
|
|||
|
ATAInterfaceData ataData;
|
|||
|
ataData.ataName = currentATAName;
|
|||
|
StructInterfaceData structData;
|
|||
|
structData.modelStructName = currentModelStructName;
|
|||
|
structData.interfaceData.push_back(currentInterfaceData);
|
|||
|
ataData.structInterfaceData.push_back(structData);
|
|||
|
allData->ataInterfaceData.push_back(ataData);
|
|||
|
return 0;
|
|||
|
}
|
|||
|
|
|||
|
/**
|
|||
|
* @brief 从指定表中读取接口数据
|
|||
|
* @param tableName 数据库表名
|
|||
|
* @return 接口数据
|
|||
|
*/
|
|||
|
AllInterfaceData GetInterfaceData::getInterfaceData(const std::string &tableName,
|
|||
|
std::string &errorMsg)
|
|||
|
{
|
|||
|
AllInterfaceData allData;
|
|||
|
std::string dbPath = GetXNCoreEnv() + "/database/XNSim.db";
|
|||
|
sqlite3 *db;
|
|||
|
int rc = sqlite3_open(dbPath.c_str(), &db);
|
|||
|
if (rc != SQLITE_OK) {
|
|||
|
errorMsg = "无法打开数据库: " + std::string(sqlite3_errmsg(db));
|
|||
|
return allData;
|
|||
|
}
|
|||
|
|
|||
|
char *errMsg = nullptr;
|
|||
|
|
|||
|
std::string sql = "SELECT * FROM " + tableName;
|
|||
|
|
|||
|
rc = sqlite3_exec(db, sql.c_str(), callback, &allData, &errMsg);
|
|||
|
if (rc != SQLITE_OK) {
|
|||
|
std::string error = errMsg;
|
|||
|
sqlite3_free(errMsg);
|
|||
|
errorMsg = "SQL错误: " + error;
|
|||
|
return allData;
|
|||
|
}
|
|||
|
|
|||
|
sqlite3_close(db);
|
|||
|
|
|||
|
return allData;
|
|||
|
}
|