database.js•2.81 kB
import sqlite3 from 'sqlite3';
import path from 'path';
import { fileURLToPath } from 'url';
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
class Database {
constructor() {
this.dbPath = path.join(__dirname, '..', 'data', 'example.db');
this.db = null;
}
async initialize() {
try {
// Ensure data directory exists
const fs = await import('fs');
const dataDir = path.dirname(this.dbPath);
if (!fs.existsSync(dataDir)) {
fs.mkdirSync(dataDir, { recursive: true });
}
this.db = new sqlite3.Database(this.dbPath);
// Create tables
await this.createTables();
// Insert sample data
await this.insertSampleData();
// Don't log to stdout as it interferes with JSON-RPC
// console.log('Database initialized successfully');
} catch (error) {
console.error('Database initialization error:', error);
throw error;
}
}
async createTables() {
return new Promise((resolve, reject) => {
this.db.run(`
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
email TEXT UNIQUE NOT NULL,
age INTEGER,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
)
`, (err) => {
if (err) reject(err);
else resolve();
});
});
}
async insertSampleData() {
const sampleUsers = [
{ name: 'John Doe', email: 'john@example.com', age: 30 },
{ name: 'Jane Smith', email: 'jane@example.com', age: 25 },
{ name: 'Bob Johnson', email: 'bob@example.com', age: 35 },
{ name: 'Alice Brown', email: 'alice@example.com', age: 28 }
];
for (const user of sampleUsers) {
await this.run(
'INSERT OR IGNORE INTO users (name, email, age) VALUES (?, ?, ?)',
[user.name, user.email, user.age]
);
}
}
async run(sql, params = []) {
return new Promise((resolve, reject) => {
this.db.run(sql, params, function(err) {
if (err) reject(err);
else resolve({ id: this.lastID, changes: this.changes });
});
});
}
async get(sql, params = []) {
return new Promise((resolve, reject) => {
this.db.get(sql, params, (err, row) => {
if (err) reject(err);
else resolve(row);
});
});
}
async all(sql, params = []) {
return new Promise((resolve, reject) => {
this.db.all(sql, params, (err, rows) => {
if (err) reject(err);
else resolve(rows);
});
});
}
async close() {
return new Promise((resolve, reject) => {
this.db.close((err) => {
if (err) reject(err);
else resolve();
});
});
}
}
export default Database;