import Database from "better-sqlite3" import fs from "node:fs" const path = process.argv[2] ?? "./mikrotik.db" if (!fs.existsSync(path)) { console.error("NO_SQLITE", path) process.exit(2) } const st = fs.statSync(path) const db = new Database(path, { readonly: true, fileMustExist: true }) const tables = db .prepare(`SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%' ORDER BY 1`) .all() console.log("FILE_BYTES", st.size) console.log("TABLES", tables.length) for (const t of tables) { const c = db.prepare(`SELECT COUNT(*) AS c FROM "${t.name}"`).get() console.log(`COUNT\t${t.name}\t${c.c}`) } try { const d = db.prepare(`SELECT COUNT(*) AS c FROM ( SELECT dedupe_key FROM alert_outbox GROUP BY dedupe_key HAVING COUNT(*) > 1 )`).get() console.log("DUP_DEDUPE_KEYS", d.c) } catch (e) { console.log("DUP_DEDUPE_ERR", e instanceof Error ? e.message : e) } for (const [label, sql] of [ ["ORPHAN_FLOW_MINUTE", `SELECT COUNT(*) c FROM flow_minute_stats s WHERE s.server_id NOT IN (SELECT id FROM servers)`], ["ORPHAN_FLOW_BUCKETS", `SELECT COUNT(*) c FROM flow_buckets s WHERE s.server_id NOT IN (SELECT id FROM servers)`], ["ORPHAN_BINDINGS", `SELECT COUNT(*) c FROM user_interface_bindings s WHERE s.server_id NOT IN (SELECT id FROM servers)`], ]) { try { console.log(label, db.prepare(sql).get().c) } catch (e) { console.log(label + "_ERR", e instanceof Error ? e.message : e) } } db.close()