优化命名
This commit is contained in:
@@ -0,0 +1,316 @@
|
||||
#include <sqliteManager/sqliteModule.h>
|
||||
#include <iostream>
|
||||
#include <qdebug.h>
|
||||
#include <io.h>
|
||||
#include <direct.h>
|
||||
#include <iomanip>
|
||||
#include <sstream>
|
||||
|
||||
std::string getCurrentDateTimeHMSx() {
|
||||
// 获取当前时间点
|
||||
std::chrono::system_clock::time_point now = std::chrono::system_clock::now();
|
||||
|
||||
// 转换为字符串
|
||||
std::time_t currentTime = std::chrono::system_clock::to_time_t(now);
|
||||
std::tm* localTime = std::localtime(¤tTime);
|
||||
std::stringstream ss;
|
||||
ss << std::put_time(localTime, "%H:%M:%S");
|
||||
|
||||
return ss.str();
|
||||
}
|
||||
sqliteModule::sqliteModule(std::string path)
|
||||
{
|
||||
sqliteDbPtr = nullptr; // 初始化 sqliteDbPtr
|
||||
int rc = sqlite3_open(path.c_str(), &sqliteDbPtr);
|
||||
if (rc != SQLITE_OK) {
|
||||
std::cerr << "无法打开数据库: " << sqlite3_errmsg(sqliteDbPtr) << std::endl;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
sqliteModule::~sqliteModule()
|
||||
{
|
||||
if (sqliteDbPtr) {
|
||||
sqlite3_close(sqliteDbPtr);
|
||||
sqliteDbPtr = nullptr;
|
||||
}
|
||||
}
|
||||
bool sqliteModule::backup(std::string path)
|
||||
{
|
||||
//备份数据库
|
||||
if (!sqliteDbPtr) {
|
||||
std::cout << "数据库未打开无法备份 " << path << std::endl;
|
||||
qDebug() << "[ERROR] " << QString::fromStdString(path) << "数据库未打开,无法备份";
|
||||
return false;
|
||||
}
|
||||
|
||||
sqlite3* sqliteDbPtr_dst;
|
||||
int rc = sqlite3_open(path.c_str(), &sqliteDbPtr_dst);
|
||||
if (rc != SQLITE_OK) {
|
||||
std::cerr << "无法打开备份数据库,检查路径: " << sqlite3_errmsg(sqliteDbPtr_dst) << std::endl;
|
||||
sqlite3_close(sqliteDbPtr_dst);
|
||||
return false;
|
||||
}
|
||||
sqlite3_backup* backupHandle;
|
||||
|
||||
backupHandle = sqlite3_backup_init(sqliteDbPtr_dst, "main", sqliteDbPtr, "main");
|
||||
if (!backupHandle) {
|
||||
std::cout << "无法初始化数据库备份: " << sqlite3_errmsg(sqliteDbPtr) << std::endl;
|
||||
sqlite3_close(sqliteDbPtr_dst);
|
||||
return false;
|
||||
}
|
||||
|
||||
rc = sqlite3_backup_step(backupHandle, -1);
|
||||
if (rc != SQLITE_DONE) {
|
||||
std::cout << "备份数据库失败: " << sqlite3_errmsg(sqliteDbPtr) << std::endl;
|
||||
sqlite3_backup_finish(backupHandle);
|
||||
sqlite3_close(sqliteDbPtr_dst);
|
||||
return false;
|
||||
}
|
||||
|
||||
sqlite3_backup_finish(backupHandle);
|
||||
sqlite3_close(sqliteDbPtr_dst);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool sqliteModule::createTable(std::string tableName, std::vector<std::string>dataVec)
|
||||
{
|
||||
std::string query = "CREATE TABLE IF NOT EXISTS \'" + tableName
|
||||
+"\' (SN TEXT PRIMARY KEY, timeCode TEXT,saveHour TEXT";
|
||||
for (auto data : dataVec)
|
||||
query += ","+data + " REAL";
|
||||
query += ",updateTime TEXT);";
|
||||
int rc = sqlite3_exec(sqliteDbPtr, query.c_str(), 0, 0, 0);
|
||||
if (rc != SQLITE_OK) {
|
||||
std::string errStr = sqlite3_errmsg(sqliteDbPtr);
|
||||
std::cout << "创建表失败: " << errStr << ";" << query;
|
||||
qDebug() << "[ERROR] " << QString::fromStdString(errStr);
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
bool sqliteModule::deleteTable(std::string tableName)
|
||||
{
|
||||
std::string query = "DROP TABLE IF EXISTS \'" + tableName + "\';";
|
||||
int rc = sqlite3_exec(sqliteDbPtr, query.c_str(), nullptr, nullptr, nullptr);
|
||||
if (rc != SQLITE_OK) {
|
||||
std::string errStr = sqlite3_errmsg(sqliteDbPtr);
|
||||
std::cout << "删除表失败: " << errStr << ";" << query;
|
||||
qDebug() << "[ERROR] " << QString::fromStdString(errStr);
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
std::vector<std::string> sqliteModule::getTable() {
|
||||
std::vector<std::string> tableNames;
|
||||
|
||||
// SQL 查询语句,选择类型为 "table" 的项,并提取表名
|
||||
const char* query = "SELECT name FROM sqlite_master WHERE type='table';";
|
||||
|
||||
// 准备 SQL 查询
|
||||
sqlite3_stmt* stmt;
|
||||
if (sqlite3_prepare_v2(sqliteDbPtr, query, -1, &stmt, nullptr) != SQLITE_OK) {
|
||||
// 查询准备失败,返回空的表名列表
|
||||
return tableNames;
|
||||
}
|
||||
|
||||
// 执行 SQL 查询并获取结果
|
||||
while (sqlite3_step(stmt) == SQLITE_ROW) {
|
||||
// 提取结果中的表名并加入到表名列表中
|
||||
const unsigned char* tableName = sqlite3_column_text(stmt, 0);
|
||||
tableNames.push_back(reinterpret_cast<const char*>(tableName));
|
||||
}
|
||||
|
||||
// 释放 SQL 语句资源
|
||||
sqlite3_finalize(stmt);
|
||||
|
||||
return tableNames;
|
||||
}
|
||||
|
||||
bool sqliteModule::addColumn(
|
||||
std::string &tableName,
|
||||
std::string &columnName,
|
||||
std::string columnType)
|
||||
{
|
||||
std::string query = "ALTER TABLE '" + tableName + "' ADD COLUMN '" + columnName + "' " + columnType + ";";
|
||||
int rc = sqlite3_exec(sqliteDbPtr, query.c_str(), nullptr, nullptr, nullptr);
|
||||
if (rc != SQLITE_OK) {
|
||||
std::cerr << "无法添加列: " << sqlite3_errmsg(sqliteDbPtr) << std::endl;
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
bool sqliteModule::deleteColumn(
|
||||
std::string tableName,
|
||||
std::string columnName)
|
||||
{
|
||||
std::string query = "ALTER TABLE '" + tableName + "' DROP COLUMN '" + columnName + "';";
|
||||
int rc = sqlite3_exec(sqliteDbPtr, query.c_str(), nullptr, nullptr, nullptr);
|
||||
if (rc != SQLITE_OK) {
|
||||
std::cerr << "无法删除列: " << sqlite3_errmsg(sqliteDbPtr) << std::endl;
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
std::vector<std::string> sqliteModule::getColumn(std::string tableName) {
|
||||
std::vector<std::string> columnNames;
|
||||
|
||||
// SQL 查询语句,选择指定表格的列名信息
|
||||
std::string query = "PRAGMA table_info('" + tableName + "');";
|
||||
|
||||
// 准备 SQL 查询
|
||||
sqlite3_stmt* stmt;
|
||||
if (sqlite3_prepare_v2(sqliteDbPtr, query.c_str(), -1, &stmt, nullptr) != SQLITE_OK) {
|
||||
// 查询准备失败,返回空的列名列表
|
||||
return columnNames;
|
||||
}
|
||||
|
||||
// 执行 SQL 查询并获取结果
|
||||
while (sqlite3_step(stmt) == SQLITE_ROW) {
|
||||
// 提取结果中的列名并加入到列名列表中
|
||||
const unsigned char* columnName = sqlite3_column_text(stmt, 1);
|
||||
columnNames.push_back(reinterpret_cast<const char*>(columnName));
|
||||
}
|
||||
|
||||
// 释放 SQL 语句资源
|
||||
sqlite3_finalize(stmt);
|
||||
|
||||
return columnNames;
|
||||
}
|
||||
|
||||
sqlErr sqliteModule::Insert(
|
||||
std::string tableName,
|
||||
std::string SN,
|
||||
std::vector<sqlData>dataVec)
|
||||
{
|
||||
std::string insertQuery = "INSERT INTO \'" + tableName + "\' (SN,";
|
||||
for (auto data : dataVec)
|
||||
insertQuery += data.key + ",";
|
||||
insertQuery += "updateTime,";
|
||||
insertQuery.replace(insertQuery.find_last_of(","), 1, ") VALUES (\'" + SN + "\',");
|
||||
for (auto data : dataVec)
|
||||
insertQuery += "\'" + data.value + "\',";
|
||||
insertQuery += "\'" + getCurrentDateTimeHMSx() + "\',";
|
||||
insertQuery.replace(insertQuery.find_last_of(","), 1, " );");
|
||||
|
||||
int rc = sqlite3_exec(sqliteDbPtr, insertQuery.c_str(), nullptr, nullptr, nullptr);
|
||||
if (rc != SQLITE_OK) {
|
||||
std::string errStr = sqlite3_errmsg(sqliteDbPtr);
|
||||
std::cout << "插入操作失败: " << errStr << ";" << insertQuery;
|
||||
qDebug() << "[ERROR] " << QString::fromStdString(errStr);
|
||||
return sqlFalse;
|
||||
}
|
||||
return sqlOK;
|
||||
}
|
||||
bool sqliteModule::Delete(
|
||||
std::string tableName,
|
||||
std::string Where,
|
||||
std::string equal)
|
||||
{
|
||||
std::string query = "DELETE FROM '" + tableName + "'";
|
||||
if (!Where.empty() && !equal.empty()) {
|
||||
query += " WHERE " + Where + " = '" + equal + "'";
|
||||
}
|
||||
query += ";";
|
||||
|
||||
int rc = sqlite3_exec(sqliteDbPtr, query.c_str(), nullptr, nullptr, nullptr);
|
||||
if (rc != SQLITE_OK) {
|
||||
std::string errStr = sqlite3_errmsg(sqliteDbPtr);
|
||||
std::cout << "删除操作失败: " << errStr << "; " << query << std::endl;
|
||||
qDebug() << "[ERROR] " << QString::fromStdString(errStr);
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
sqlErr sqliteModule::Select(
|
||||
std::string tableName,
|
||||
std::vector<std::string>selectStr,
|
||||
std::string Where,
|
||||
std::string equal,
|
||||
sqlTableDatas& output)
|
||||
{
|
||||
output.tableName = tableName;
|
||||
std::string query = "SELECT ";
|
||||
if(selectStr.size()>0)
|
||||
{
|
||||
for (auto str : selectStr)
|
||||
query += str + " ";
|
||||
}
|
||||
else
|
||||
{
|
||||
query += "* ";
|
||||
}
|
||||
query+=" FROM '" + tableName + "'";
|
||||
if (!Where.empty() && !equal.empty()) {
|
||||
query += " WHERE " + Where + " = '" + equal + "'";
|
||||
}
|
||||
query += ";";
|
||||
sqlite3_stmt* stmt;
|
||||
int rc = sqlite3_prepare_v2(sqliteDbPtr, query.c_str(), -1, &stmt, nullptr);
|
||||
if (rc != SQLITE_OK) {
|
||||
std::string errStr = sqlite3_errmsg(sqliteDbPtr);
|
||||
std::cout << "查询操作失败: " << errStr << "; " << query << std::endl;
|
||||
qDebug() << "[ERROR] " << QString::fromStdString(errStr);
|
||||
return sqlFalse; // 返回空的结果集
|
||||
}
|
||||
|
||||
while ((rc = sqlite3_step(stmt)) == SQLITE_ROW) {
|
||||
sqlRowDatas row;
|
||||
for (int i = 0; i < sqlite3_column_count(stmt); ++i) {
|
||||
const char* columnName = sqlite3_column_name(stmt, i);
|
||||
const char* columnValue = reinterpret_cast<const char*>(sqlite3_column_text(stmt, i));
|
||||
std::string columnNameStr = columnName ? std::string(columnName) : "";
|
||||
std::string columnValueStr = columnValue ? std::string(columnValue) : "";
|
||||
columnNameStr.erase(std::remove(columnNameStr.begin(), columnNameStr.end(), '\''), columnNameStr.end());
|
||||
|
||||
if (columnNameStr.find(columnValueStr) != std::string::npos) {
|
||||
columnValueStr = "";
|
||||
}
|
||||
row.push_back({ columnNameStr, columnValueStr });
|
||||
}
|
||||
output.rowDatas.push_back(row);
|
||||
}
|
||||
|
||||
sqlite3_finalize(stmt);
|
||||
return sqlOK;
|
||||
|
||||
|
||||
}
|
||||
bool sqliteModule::Update(
|
||||
std::string tableName,
|
||||
std::vector<sqlData>str,
|
||||
std::string Where,
|
||||
std::string equal)
|
||||
{
|
||||
if (str.empty()) {
|
||||
std::cout << "修改数组为空" << std::endl;
|
||||
qDebug() << u8"[ERROR] 修改数组为空" ;
|
||||
return false;
|
||||
}
|
||||
|
||||
std::string query = "UPDATE '" + tableName + "' SET ";
|
||||
for (size_t i = 0; i < str.size(); ++i) {
|
||||
query += "'" + str[i].key + "' = '" + str[i].value + "'";
|
||||
if (i < str.size() - 1) {
|
||||
query += ", ";
|
||||
}
|
||||
}
|
||||
|
||||
if (!Where.empty() && !equal.empty()) {
|
||||
query += " WHERE " + Where + " = '" + equal + "'";
|
||||
}
|
||||
|
||||
query += ";";
|
||||
|
||||
int rc = sqlite3_exec(sqliteDbPtr, query.c_str(), nullptr, nullptr, nullptr);
|
||||
if (rc != SQLITE_OK) {
|
||||
std::string errStr = sqlite3_errmsg(sqliteDbPtr);
|
||||
std::cout << "更新操作失败: " << errStr << "; " << query << std::endl;
|
||||
qDebug() << "[ERROR] " << QString::fromStdString(errStr);
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user