|
|
const sqlite3 = require("sqlite3").verbose();
|
|
|
const path = require("path");
|
|
|
|
|
|
// 获取数据库路径
|
|
|
function getDatabasePath() {
|
|
|
const dbPath = path.join(__dirname, "..", "..", "live_chat.db");
|
|
|
return dbPath;
|
|
|
}
|
|
|
|
|
|
// 更新配置值
|
|
|
function updateConfigValue(key, value) {
|
|
|
return new Promise((resolve, reject) => {
|
|
|
const db = new sqlite3.Database(getDatabasePath(), err => {
|
|
|
if (err) {
|
|
|
console.error("数据库连接错误:", err.message);
|
|
|
return reject(err);
|
|
|
}
|
|
|
});
|
|
|
// 先尝试更新,如果影响行数为0则插入新记录
|
|
|
db.run(
|
|
|
`UPDATE config SET value = ? WHERE key = ?`,
|
|
|
[value, key],
|
|
|
function (err) {
|
|
|
if (err) {
|
|
|
db.close();
|
|
|
return reject(err);
|
|
|
}
|
|
|
|
|
|
// 如果没有匹配的记录则插入
|
|
|
if (this.changes === 0) {
|
|
|
db.run(
|
|
|
`INSERT INTO config (key, value) VALUES (?, ?)`,
|
|
|
[key, value],
|
|
|
function (err) {
|
|
|
db.close();
|
|
|
if (err) return reject(err);
|
|
|
resolve({
|
|
|
success: true,
|
|
|
action: "insert",
|
|
|
changes: this.changes
|
|
|
});
|
|
|
}
|
|
|
);
|
|
|
} else {
|
|
|
db.close();
|
|
|
resolve({ success: true, action: "update", changes: this.changes });
|
|
|
}
|
|
|
}
|
|
|
);
|
|
|
});
|
|
|
}
|
|
|
|
|
|
// 获取配置值
|
|
|
function getConfigValue(key) {
|
|
|
return new Promise((resolve, reject) => {
|
|
|
const db = new sqlite3.Database(getDatabasePath(), err => {
|
|
|
if (err) {
|
|
|
return reject(err);
|
|
|
}
|
|
|
});
|
|
|
|
|
|
db.get(`SELECT value FROM config WHERE key = ?`, [key], (err, row) => {
|
|
|
db.close();
|
|
|
if (err) return reject(err);
|
|
|
resolve(row ? row.value : null);
|
|
|
});
|
|
|
});
|
|
|
}
|
|
|
// 批量插入系统消息
|
|
|
const bulkInsertSystemMessages = messages => {
|
|
|
return new Promise((resolve, reject) => {
|
|
|
if (!Array.isArray(messages) || messages.length === 0) {
|
|
|
reject(new Error("请提供有效的消息数组"));
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
try {
|
|
|
const db = new sqlite3.Database(getDatabasePath(), err => {
|
|
|
if (err) {
|
|
|
reject(err);
|
|
|
return;
|
|
|
}
|
|
|
// 清空表
|
|
|
db.run("DELETE FROM system_message", function (err) {
|
|
|
if (err) {
|
|
|
db.close();
|
|
|
reject(err);
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
// 重置自增计数器(SQLite特定)
|
|
|
db.run(
|
|
|
"DELETE FROM sqlite_sequence WHERE name = 'system_message'",
|
|
|
err => {
|
|
|
if (err) {
|
|
|
db.close();
|
|
|
reject(err);
|
|
|
return;
|
|
|
} else {
|
|
|
// 使用事务进行批量插入,提高性能
|
|
|
db.run("BEGIN TRANSACTION", err => {
|
|
|
if (err) {
|
|
|
reject(err);
|
|
|
db.close();
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
const stmt = db.prepare(
|
|
|
"INSERT INTO system_message (message) VALUES (?)"
|
|
|
);
|
|
|
let completed = 0;
|
|
|
let errorOccurred = null;
|
|
|
|
|
|
messages.forEach(message => {
|
|
|
stmt.run(message, function (err) {
|
|
|
if (err && !errorOccurred) {
|
|
|
errorOccurred = err;
|
|
|
}
|
|
|
|
|
|
completed++;
|
|
|
|
|
|
// 所有消息都处理完毕
|
|
|
if (completed === messages.length) {
|
|
|
stmt.finalize();
|
|
|
|
|
|
if (errorOccurred) {
|
|
|
db.run("ROLLBACK", () => {
|
|
|
reject(errorOccurred);
|
|
|
db.close();
|
|
|
});
|
|
|
} else {
|
|
|
db.run("COMMIT", err => {
|
|
|
if (err) {
|
|
|
reject(err);
|
|
|
} else {
|
|
|
resolve({
|
|
|
success: true,
|
|
|
count: messages.length
|
|
|
});
|
|
|
}
|
|
|
db.close();
|
|
|
});
|
|
|
}
|
|
|
}
|
|
|
});
|
|
|
});
|
|
|
});
|
|
|
}
|
|
|
}
|
|
|
);
|
|
|
});
|
|
|
});
|
|
|
} catch (error) {
|
|
|
reject(error);
|
|
|
}
|
|
|
});
|
|
|
};
|
|
|
module.exports = {
|
|
|
updateConfigValue,
|
|
|
getConfigValue,
|
|
|
bulkInsertSystemMessages
|
|
|
};
|