/
DATKAI
/
label_system
Обзор
Документация
Войти
/
DATKAI
/
label_system
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
main
lib/db.js
79 строк
3 KB
DATKAI
Перенос БД на SQLite (node:sqlite) + конвертер старой базы
30 июн 2026, 05:50
30 июн 2026, 05:50
9b01437
Код
Авторство
О чём код?
'use strict'; const fs = require('fs'); const path = require('path'); const crypto = require('crypto'); const store = require('./store'); const DB_PATH = path.join(__dirname, '..', 'db.json'); // legacy — для авто-импорта const BACKUPS = path.join(__dirname, '..', 'backups'); // ── Кеш полного объекта (совместимость с прежним readDB/writeDB) ── // Роуты по-прежнему работают с одним объектом; хранилище под капотом — SQLite. let _cache = null; function _clone(o){ return JSON.parse(JSON.stringify(o)); } function readDB(){ if(_cache === null) _cache = store.loadAll(); return _clone(_cache); } function writeDB(data){ store.saveAll(data); // атомарная транзакция в SQLite _cache = _clone(data); } function addLog(db, action, detail, user){ if(!db.log) db.log = []; db.log.unshift({ ts: new Date().toISOString(), action, detail: detail || '', user: user || '' }); if(db.log.length > 2000) db.log = db.log.slice(0, 2000); } function genId(prefix){ return (prefix || 'id_') + Date.now().toString(36) + '_' + crypto.randomBytes(3).toString('hex'); } // Быстрая дозапись одной строки журнала (1 INSERT вместо перезаписи всего журнала). // Держит кеш в согласованном состоянии. function appendLog(entry){ store.appendLog(entry); if(_cache){ if(!_cache.log) _cache.log = []; _cache.log.unshift(entry); if(_cache.log.length > 2000) _cache.log = _cache.log.slice(0, 2000); } } function initDB(){ if(!fs.existsSync(BACKUPS)) fs.mkdirSync(BACKUPS, { recursive: true }); store.open(); // Авто-импорт старой базы: если SQLite пустой, а db.json есть — переносим один раз. const counts = store.rowCounts(); const empty = !counts.users && !counts.decors && !counts.tasks && !counts.log && !counts.kv; if(empty && fs.existsSync(DB_PATH)){ try{ const src = JSON.parse(fs.readFileSync(DB_PATH, 'utf8')); store.saveAll(src); const stamp = new Date().toISOString().replace(/[:.]/g, '-'); fs.renameSync(DB_PATH, DB_PATH + '.imported-' + stamp); // чтобы не импортировать повторно console.log('[DB] db.json импортирован в SQLite (label.db) и сохранён как db.json.imported-' + stamp); }catch(e){ console.error('[DB] Авто-импорт db.json не удался:', e.message); } } // Значения по умолчанию (для чистой установки) const db = store.loadAll(); const defs = { decors: [], operators: [], users: [], templates: [], products: [], cutting_orders: [], tasks: [], log: [], feedback: [], adminPassword: 'admin', companyName: 'Участок резки плёнки', defaultTemplateId: null, }; let changed = false; for(const k in defs){ if(db[k] === undefined){ db[k] = defs[k]; changed = true; } } if(changed) store.saveAll(db); _cache = null; // следующий readDB перечитает из БД } module.exports = { readDB, writeDB, addLog, appendLog, initDB, genId, DB_PATH, BACKUPS };