const sqlite3 = require('sqlite3').verbose(); const { DB_PATH } = require('./config'); const fs = require('fs'); const path = require('path'); // Ensure the directory exists with proper permissions 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 };