Files
timeline/server/database.js
licsber 17bbbe7fbc
Some checks failed
Build and Push Docker Image / buildx (push) Has been cancelled
fix: docker permission again two.
2025-11-11 15:28:38 +08:00

78 lines
2.1 KiB
JavaScript

const sqlite3 = require('sqlite3').verbose();
const { DB_PATH } = require('./config');
const fs = require('fs');
const path = require('path');
// Ensure the directory exists
const dbDir = path.dirname(DB_PATH);
if (!fs.existsSync(dbDir)) {
try {
fs.mkdirSync(dbDir, { recursive: true });
console.log('Created database directory:', dbDir);
} catch (err) {
console.error('Failed to create database directory:', err.message);
}
}
// Try to create the database file if it doesn't exist
try {
fs.closeSync(fs.openSync(DB_PATH, 'a'));
console.log('Database file is accessible:', DB_PATH);
} catch (err) {
console.error('Failed to access database file:', err.message);
}
const db = new sqlite3.Database(DB_PATH, (err) => {
if (err) {
console.error('数据库连接失败:', err.message);
console.error('数据库路径:', DB_PATH);
console.error('当前工作目录:', process.cwd());
process.exit(1);
}
console.log('已连接到 SQLite 数据库');
});
function initializeDatabase() {
db.serialize(() => {
db.run(`CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
username TEXT UNIQUE NOT NULL,
password_hash TEXT NOT NULL,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
)`);
db.run(`CREATE TABLE IF NOT EXISTS calendar_marks (
id INTEGER PRIMARY KEY AUTOINCREMENT,
user_id INTEGER NOT NULL,
date TEXT NOT NULL,
status TEXT NOT NULL,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,
UNIQUE(user_id, date),
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
)`);
db.run(`CREATE INDEX IF NOT EXISTS idx_user_date ON calendar_marks(user_id, date)`);
});
}
initializeDatabase();
function closeDatabase() {
return new Promise((resolve) => {
db.close((err) => {
if (err) {
console.error('关闭数据库失败:', err.message);
} else {
console.log('数据库连接已关闭');
}
resolve();
});
});
}
module.exports = {
db,
closeDatabase
};