58 lines
2.2 KiB
JavaScript
58 lines
2.2 KiB
JavaScript
const Database = require('better-sqlite3');
|
|
const db = new Database('database/sqlite/deathwatch.db');
|
|
|
|
function slug(s){
|
|
return (s||'rule').toString().toLowerCase().trim()
|
|
.replace(/[^a-z0-9]+/g,'-')
|
|
.replace(/(^-|-$)/g,'');
|
|
}
|
|
|
|
try{
|
|
const staging = db.prepare('SELECT id,title,content,category,page,original_json,created_at FROM rules_staging ORDER BY id').all();
|
|
console.log('stagingCount', staging.length);
|
|
if(staging.length===0){ db.close(); process.exit(0); }
|
|
|
|
const insert = db.prepare('INSERT OR IGNORE INTO rules (rule_id, title, content, page, source, source_abbr, category) VALUES (?, ?, ?, ?, ?, ?, ?)');
|
|
const exists = db.prepare('SELECT COUNT(*) as c FROM rules WHERE rule_id = ?');
|
|
|
|
const inserted = [];
|
|
const processedIds = [];
|
|
|
|
const tx = db.transaction((rows)=>{
|
|
for(const r of rows){
|
|
const title = r.title || (r.original_json ? (JSON.parse(r.original_json).title || '') : '') || 'rule';
|
|
let base = slug(title);
|
|
if(!base) base = 'rule';
|
|
let candidate = base;
|
|
let i = 0;
|
|
while(exists.get(candidate).c > 0){ i++; candidate = base + '-' + i; }
|
|
const pageVal = (r.page && !isNaN(Number(r.page))) ? Number(r.page) : null;
|
|
const res = insert.run(candidate, r.title || title, r.content || '', pageVal, 'sanitized', 'SAN', r.category || 'skills');
|
|
if(res.changes && res.lastInsertRowid){
|
|
inserted.push({rule_id: candidate, title: r.title || title, page: r.page});
|
|
processedIds.push(r.id);
|
|
}
|
|
}
|
|
if(processedIds.length){
|
|
const placeholders = processedIds.map(()=>'?').join(',');
|
|
db.prepare(`DELETE FROM rules_staging WHERE id IN (${placeholders})`).run(...processedIds);
|
|
}
|
|
});
|
|
|
|
tx(staging);
|
|
|
|
const counts = {
|
|
staging: db.prepare('SELECT COUNT(*) as c FROM rules_staging').get().c,
|
|
rules_sanitized: db.prepare('SELECT COUNT(*) as c FROM rules WHERE source = ?').get('sanitized').c,
|
|
rules_total: db.prepare('SELECT COUNT(*) as c FROM rules').get().c
|
|
};
|
|
|
|
console.log(JSON.stringify({inserted, count: inserted.length, counts}, null, 2));
|
|
|
|
}catch(err){
|
|
console.error('ERROR', err && err.stack ? err.stack : err);
|
|
process.exit(1);
|
|
}finally{
|
|
try{ db.close(); }catch(e){}
|
|
}
|