feat: add MariaDB schema and connection pool
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,19 @@
|
|||||||
|
CREATE TABLE IF NOT EXISTS conversion_jobs (
|
||||||
|
id CHAR(36) NOT NULL PRIMARY KEY,
|
||||||
|
status ENUM('pending', 'processing', 'done', 'failed') NOT NULL DEFAULT 'pending',
|
||||||
|
family VARCHAR(32) NOT NULL,
|
||||||
|
source_format VARCHAR(16) NOT NULL,
|
||||||
|
target_format VARCHAR(16) NOT NULL,
|
||||||
|
original_filename VARCHAR(255) NOT NULL,
|
||||||
|
input_path VARCHAR(255) NOT NULL,
|
||||||
|
output_path VARCHAR(255) NULL,
|
||||||
|
input_mime_type VARCHAR(128) NOT NULL,
|
||||||
|
output_mime_type VARCHAR(128) NULL,
|
||||||
|
error_message VARCHAR(255) NULL,
|
||||||
|
error_log TEXT NULL,
|
||||||
|
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||||
|
expires_at DATETIME NOT NULL,
|
||||||
|
INDEX idx_status (status),
|
||||||
|
INDEX idx_expires_at (expires_at)
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
import mariadb from 'mariadb';
|
||||||
|
|
||||||
|
let pool;
|
||||||
|
|
||||||
|
export function getPool(config) {
|
||||||
|
if (!pool) {
|
||||||
|
pool = mariadb.createPool({
|
||||||
|
host: config.db.host,
|
||||||
|
user: config.db.user,
|
||||||
|
password: config.db.password,
|
||||||
|
database: config.db.database,
|
||||||
|
connectionLimit: 10,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return pool;
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function closePool() {
|
||||||
|
if (pool) {
|
||||||
|
await pool.end();
|
||||||
|
pool = undefined;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
import { describe, it, expect, afterAll } from 'vitest';
|
||||||
|
import { getPool, closePool } from '../src/db.js';
|
||||||
|
import { loadConfig } from '../src/config.js';
|
||||||
|
|
||||||
|
describe('getPool', () => {
|
||||||
|
afterAll(async () => {
|
||||||
|
await closePool();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('returns a working pool that can run a query', async () => {
|
||||||
|
const config = loadConfig();
|
||||||
|
const pool = getPool(config);
|
||||||
|
|
||||||
|
const rows = await pool.query('SELECT 1 AS value');
|
||||||
|
|
||||||
|
expect(Number(rows[0].value)).toBe(1);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('returns the same pool instance on repeated calls', () => {
|
||||||
|
const config = loadConfig();
|
||||||
|
const poolA = getPool(config);
|
||||||
|
const poolB = getPool(config);
|
||||||
|
|
||||||
|
expect(poolA).toBe(poolB);
|
||||||
|
});
|
||||||
|
});
|
||||||
Reference in New Issue
Block a user