fix(qbank): ручная транзакция вместо db.transaction (node:sqlite не имеет её)
DatabaseSync (node:sqlite) не имеет .transaction() как better-sqlite3 — в контроллерах она добавлена обёрткой в db/db.js, а скрипт открывает БД напрямую. Заменил на runTx() с ручным BEGIN/COMMIT/ROLLBACK. Применение предложений (--apply) теперь работает; перегенерация JSON не требуется. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -26,6 +26,8 @@ const OUT = path.join(__dirname, `_qbank_proposals_${MODE}.json`);
|
|||||||
|
|
||||||
const db = new DatabaseSync(DB_PATH);
|
const db = new DatabaseSync(DB_PATH);
|
||||||
try { db.exec('PRAGMA busy_timeout=8000'); } catch (e) {}
|
try { db.exec('PRAGMA busy_timeout=8000'); } catch (e) {}
|
||||||
|
// node:sqlite (DatabaseSync) НЕ имеет .transaction() — оборачиваем вручную.
|
||||||
|
function runTx(fn) { db.exec('BEGIN'); try { fn(); db.exec('COMMIT'); } catch (e) { try { db.exec('ROLLBACK'); } catch (_) {} throw e; } }
|
||||||
|
|
||||||
/* ── провайдер Kilo ── */
|
/* ── провайдер Kilo ── */
|
||||||
function aset(k) { const r = db.prepare('SELECT value FROM app_settings WHERE key=?').get(k); return r && r.value != null ? r.value : null; }
|
function aset(k) { const r = db.prepare('SELECT value FROM app_settings WHERE key=?').get(k); return r && r.value != null ? r.value : null; }
|
||||||
@@ -67,11 +69,11 @@ function applyProposals() {
|
|||||||
let n = 0;
|
let n = 0;
|
||||||
if (MODE === 'broken') {
|
if (MODE === 'broken') {
|
||||||
const upd = db.prepare('UPDATE options SET is_correct = 1 WHERE id = ? AND question_id = ?');
|
const upd = db.prepare('UPDATE options SET is_correct = 1 WHERE id = ? AND question_id = ?');
|
||||||
db.transaction(() => { for (const p of props) { if (p.optionId) { upd.run(p.optionId, p.id); n++; } } })();
|
runTx(() => { for (const p of props) { if (p.optionId) { upd.run(p.optionId, p.id); n++; } } });
|
||||||
console.log(`Применено: отмечено верных вариантов — ${n}`);
|
console.log(`Применено: отмечено верных вариантов — ${n}`);
|
||||||
} else {
|
} else {
|
||||||
const upd = db.prepare('UPDATE questions SET topic_id = ? WHERE id = ? AND topic_id IS NULL');
|
const upd = db.prepare('UPDATE questions SET topic_id = ? WHERE id = ? AND topic_id IS NULL');
|
||||||
db.transaction(() => { for (const p of props) { if (p.topicId) { upd.run(p.topicId, p.id); n++; } } })();
|
runTx(() => { for (const p of props) { if (p.topicId) { upd.run(p.topicId, p.id); n++; } } });
|
||||||
console.log(`Применено: привязано тем — ${n}`);
|
console.log(`Применено: привязано тем — ${n}`);
|
||||||
}
|
}
|
||||||
process.exit(0);
|
process.exit(0);
|
||||||
|
|||||||
Reference in New Issue
Block a user