#include #include std::vector getFutureDates(int days) { std::vector futureDates; // 获取当前时间点 auto now = std::chrono::system_clock::now(); for (int i = 0; i < days; i++) { // 将当前时间点加上指定天数 auto future = now + std::chrono::hours(24 * i); // 将时间转换为时间结构体 std::time_t futureTime = std::chrono::system_clock::to_time_t(future); // 将时间结构体格式化为 "年月日" 的字符串 std::tm* futureTm = std::localtime(&futureTime); std::ostringstream oss; oss << futureTm->tm_year + 1900 << '-' << std::setw(2) << std::setfill('0') << futureTm->tm_mon + 1 << '-' << std::setw(2) << std::setfill('0') << futureTm->tm_mday; futureDates.push_back(oss.str()); } return futureDates; } std::string getCurrentDate() { std::time_t now = std::time(nullptr); std::tm* localTime = std::localtime(&now); std::ostringstream oss; oss << localTime->tm_year + 1900 << "-" << std::setw(2) << std::setfill('0') << localTime->tm_mon + 1 << "-" << std::setw(2) << std::setfill('0') << localTime->tm_mday; return oss.str(); } std::string getPreviousDate() { std::time_t now = std::time(nullptr); const std::time_t oneDay = 24 * 60 * 60; std::time_t previousTime = now - oneDay; std::tm* previousLocalTime = std::localtime(&previousTime); std::ostringstream oss; oss << previousLocalTime->tm_year + 1900 << "-" << std::setw(2) << std::setfill('0') << previousLocalTime->tm_mon + 1 << "-" << std::setw(2) << std::setfill('0') << previousLocalTime->tm_mday; return oss.str(); } void sqlManager::uninitlize() { mutex.lock(); sqlite3_close(db); mutex.unlock(); } std::vector sqlManager::getTableList() { /*sqlTableDatas output; dbPtr->Select("", std::vector(),"","", output);*/ return dbPtr->getTableList(); } sqlTableDatas sqlManager::selectSingleData(std::string selectStr, std::string SN) { mutex.lock(); sqlTableDatas selectResult; dbPtr->Select(getCurrentDate(), { selectStr }, "SN", SN, selectResult); if (selectResult.rowDatas.size() == 0)//无指定数据 查找前一天 dbPtr->Select(getPreviousDate(), { selectStr }, "SN", SN, selectResult); mutex.unlock(); return selectResult; } sqlTableDatas sqlManager::selectAllData(std::string SN) { mutex.lock(); //dbPtr->Update(getCurrentTableName(), { {"send","1" } }, "sn", SN); sqlTableDatas selectResult; dbPtr->Select(getCurrentDate(), {}, "SN", SN, selectResult); if(selectResult.rowDatas.size()==0)//无指定数据 查找前一天 dbPtr->Select(getPreviousDate(), {}, "SN", SN, selectResult); mutex.unlock(); return selectResult; } void sqlManager::initialization(appConfig* _appConfig,std::string dataBasePath, bool backup) { mutex.lock(); std::cout << "SQL runing Init..." << std::endl; dbPtr = new sqliteModule(dataBasePath);//初始化 dbPtr->backup(dataBasePath + getCurrentDate() + ".db");//备份 std::vectortables = getFutureDates(30); //整合所需要的数据名 std::vectordataStr; for (auto data : _appConfig->_sqlConfigStruct.datas) dataStr.push_back(data.first); //创建未来180天的表格 for (auto table : tables) dbPtr->createTable(table, dataStr); //查询是否有后期添加未创建的表格 for (auto table : tables) { std::vector res = dbPtr->getColumn(table); std::unordered_map map; for (auto str : res) map.insert({ str,0 }); for (auto str : dataStr)//判断此值是否存在 { auto iter = map.find(str);//寻找 if (iter == map.end())//找不到 { dbPtr->addColumn(table, str, "REAL");//插入 } } } std::cout << "SQL init end" << std::endl; std::vector input=getTableList(); mutex.unlock(); } //将数据存入数据库 bool sqlManager::addData(std::string SN,std::vector data) { mutex.lock(); //SN码为空,停止处理 if (SN.empty()) { qDebug() << "[INFO] " << " SN empty!"; mutex.unlock(); return false; } sqlTableDatas selectResult; std::string currentTableName = getCurrentDate(); sqlErr res=dbPtr->Select(currentTableName, {},"sn", SN, selectResult); //查询出错 if (res.customType != sqlOK) { qDebug() << "[INFO] " << "select False SN:"<Update(currentTableName, data, "sn", SN); mutex.unlock(); return true; } //未找到SN插入数据 res= dbPtr->Insert(currentTableName, SN, data); //插入失败,新增列后再次尝试 if (res.customType == sqlFalse) { for (auto keyName : data) { dbPtr->addColumn(currentTableName, keyName.key, "text"); std::cout << "new col insert" << keyName.key << std::endl; } dbPtr->Insert(currentTableName, SN, data); } mutex.unlock(); return true; }