/
45case
/
ptable
Обзор
Документация
Войти
/
45case
/
ptable
Код
Запросы
3
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
dev
electron/database.ts
92 строки
2 KB
Olya
feat: клик по легенде категорий/фаз и корректная окраска по температуре
17 июл 2026, 11:22
17 июл 2026, 11:22
4fc2553
Код
Авторство
О чём код?
import { app } from "electron"; import { readFileSync } from "fs"; import path from "path"; import initSqlJs, { type Database } from "sql.js"; let db: Database | null = null; function getSqlJsDir(appRoot: string) { if (app.isPackaged) { return path.join(process.resourcesPath, "sql.js"); } return path.join(appRoot, "node_modules/sql.js/dist"); } function getElementsPath(appRoot: string) { if (app.isPackaged) { return path.join(process.resourcesPath, "data/elements.json"); } return path.join(appRoot, "src/entities/element/api/elements.json"); } export async function initDatabase() { const appRoot = process.env.APP_ROOT!; const SQL = await initSqlJs({ locateFile: (file) => path.join(getSqlJsDir(appRoot), file), }); db = new SQL.Database(); db.run("PRAGMA foreign_keys=ON"); createTables(); seedData(appRoot); } function createTables() { const db = getDb(); db.run(` CREATE TABLE IF NOT EXISTS elements ( atomicNumber INTEGER PRIMARY KEY, symbol TEXT NOT NULL, name TEXT NOT NULL, nameEn TEXT NOT NULL, slug TEXT NOT NULL, row INTEGER, column INTEGER, period INTEGER, "group" INTEGER, series TEXT, category TEXT, phaseAtStp TEXT, state TEXT, summary TEXT, atomicMass REAL, meltingPointKelvin REAL, boilingPointKelvin REAL ) `); } function seedData(appRoot: string) { const db = getDb(); const elementsPath = getElementsPath(appRoot); const elements = JSON.parse(readFileSync(elementsPath, "utf-8")); const stmt = db.prepare(` INSERT OR REPLACE INTO elements (atomicNumber, symbol, name, nameEn, slug, row, column, period, "group", series, category, phaseAtStp, state, summary, atomicMass, meltingPointKelvin, boilingPointKelvin) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) `); for (const el of elements) { stmt.bind([ el.atomicNumber, el.symbol, el.name, el.nameEn, el.slug, el.row, el.column, el.period, el.group, el.series, el.category, el.phaseAtStp, el.state, el.summary, el.atomicMass, el.meltingPointKelvin, el.boilingPointKelvin, ]); stmt.step(); stmt.reset(); } stmt.free(); } export function getDb() { if (!db) throw new Error("DB not initialized"); return db; }