You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

163 lines
4.5 KiB
JavaScript

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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