Files
danmaku/utils/db.js

148 lines
3.7 KiB
JavaScript

const sqlite3 = require('sqlite3').verbose();
let dbConnected = true; // 连接状态
let db;
if (dbConnected) {
db = new sqlite3.Database(
'./db/danmaku.db',
sqlite3.OPEN_READWRITE,
function (err) {
if (err) {
console.log(err.message);
dbConnected = false; // 更新连接状态
} else {
console.log('Connected to the database successfully');
}
}
);
}
// 封装一个异步的 SQL 查询函数
function all(sql, params = []) {
if (!dbConnected) return []; // 返回默认值
return new Promise((resolve, reject) => {
db.all(sql, params, (err, rows) => {
if (err) {
reject(err);
} else {
resolve(rows);
}
});
});
}
function run(sql, params = []) {
if (!dbConnected) return null; // 返回默认值
return new Promise((resolve, reject) => {
db.run(sql, params, function(err) {
if (err) {
reject(err);
} else {
resolve(this);
}
});
});
}
async function errorInsert(record) {
if (!dbConnected) return null; // 返回默认值
try {
const rows = await run("INSERT INTO Error(ip, url, err, created_at) VALUES(?, ?, ?, datetime('now'))",
[record.ip, record.url, record.err]
);
return rows;
} catch (err) {
console.error('Error during data insertion:', err.message);
}
}
async function accessInsert(record) {
if (!dbConnected) return null; // 返回默认值
try {
const rows = await run("INSERT INTO Access(ip, url, UA, created_at) VALUES(?, ?, ?, datetime('now'))",
[record.ip, record.url, record.UA]
);
return rows;
} catch (err) {
console.error('Error during data insertion:', err.message);
}
}
async function accessCountQuery() {
if (!dbConnected) return {'today_visited': "null", 'lastday_visited': "null", 'month_visited': "null"}; // 返回默认值
try {
const ret = await all("SELECT * FROM AccessStatistics");
return ret[0];
} catch (err) {
console.error('Error during data query:', err.message);
return {'today_visited': "null", 'lastday_visited': "null", 'month_visited': "null"};
}
}
async function videoInfoInsert(record) {
if (!dbConnected) return null; // 返回默认值
try {
const rows = await run("INSERT INTO videoinfo(url, title) VALUES(?, ?)",
[record.url, record.title]
);
return rows;
} catch (err) {
console.error('Error during data insertion:', err.message);
}
}
async function hotlistQuery() {
if (!dbConnected) return []; // 返回默认值
try {
return await all("SELECT * FROM YesterdayHotlist;");
} catch (err) {
console.error('Error during data query:', err.message);
return null;
}
}
// 删除三个月以前的记录Access,Error
async function deleteAccess() {
if (!dbConnected) return null; // 返回默认值
try {
// vacuum
await run("vacuum");
let result,changes = 0;
result = await run("DELETE FROM Access WHERE created_at < datetime('now', '-3 month')");
changes += result.changes;
result = await run("DELETE FROM Error WHERE created_at < datetime('now', '-3 month')");
changes += result.changes;
// vacuum
await run("vacuum");
return changes; // 提取删除的行数
} catch (err) {
console.error('Error during data deletion:', err.message);
return null;
}
}
async function main() {
const ret = await deleteAccess();
console.log(ret);
}
if (!module.parent) {
accessInsert({
'ip': '127.0.0.1',
'url': 'https://www.mgtv.com/b/336727/8087768.html',
'UA': 'PostmanRuntime/7.37.3'
});
videoInfoInsert({
'url': 'https://www.mgtv.com/b/336727/8087768.html',
'title': '婚前21天'
});
main();
}
module.exports = { errorInsert, accessInsert, accessCountQuery, videoInfoInsert, hotlistQuery, deleteAccess };