Ka-Note/ka-note/server/restore-to-db.cjs

83 lines
6.8 KiB
JavaScript

'use strict';
const Database = require('better-sqlite3');
const { readFileSync, readdirSync, existsSync } = require('fs');
const { join } = require('path');
const BUNDLE = 'C:/Users/d-chrka/Downloads/bundle-restore';
const DB_PATH = 'C:/work/chrka/myNote/ka-note/server/ka-note.db';
const b = (v) => (v ? 1 : 0);
const db = new Database(DB_PATH);
db.pragma('journal_mode = WAL');
db.pragma('foreign_keys = OFF');
const userId = JSON.parse(readFileSync(join(BUNDLE, 'manifest.json'), 'utf8')).userId;
console.log('userId:', userId);
const ctxRows = JSON.parse(readFileSync(join(BUNDLE, 'contexts.json'), 'utf8'));
const ctxStmt = db.prepare(`INSERT INTO contexts (id,user_id,name,type,sort_order,meta,archived_at,is_favorite,updated_at,deleted_at,purged_at,version) VALUES (@id,@userId,@name,@type,@sortOrder,@meta,@archivedAt,@isFavorite,@updatedAt,@deletedAt,@purgedAt,@version) ON CONFLICT(id,user_id) DO UPDATE SET name=excluded.name,type=excluded.type,sort_order=excluded.sort_order,meta=excluded.meta,archived_at=excluded.archived_at,is_favorite=excluded.is_favorite,updated_at=excluded.updated_at,deleted_at=excluded.deleted_at,purged_at=excluded.purged_at,version=excluded.version`);
db.transaction(() => { for (const r of ctxRows) ctxStmt.run({...r, userId, meta: r.meta ? JSON.stringify(r.meta) : null, isFavorite: b(r.isFavorite)}); })();
console.log('contexts:', ctxRows.length);
const topRows = JSON.parse(readFileSync(join(BUNDLE, 'topics.json'), 'utf8'));
const topStmt = db.prepare(`INSERT INTO topics (id,user_id,context_id,title,status,snooze_until,sort_order,is_new,updated_at,deleted_at,purged_at,version) VALUES (@id,@userId,@contextId,@title,@status,@snoozeUntil,@sortOrder,@isNew,@updatedAt,@deletedAt,@purgedAt,@version) ON CONFLICT(id,user_id) DO UPDATE SET context_id=excluded.context_id,title=excluded.title,status=excluded.status,snooze_until=excluded.snooze_until,sort_order=excluded.sort_order,is_new=excluded.is_new,updated_at=excluded.updated_at,deleted_at=excluded.deleted_at,purged_at=excluded.purged_at,version=excluded.version`);
db.transaction(() => { for (const r of topRows) topStmt.run({...r, userId, isNew: b(r.isNew)}); })();
console.log('topics:', topRows.length);
const histDir = join(BUNDLE, 'history');
if (existsSync(histDir)) {
const files = readdirSync(histDir).filter(f => f.endsWith('.meta.json'));
const hStmt = db.prepare(`INSERT INTO history_entries (id,user_id,topic_id,date,text,sort_order,linked_context_id,done_at,wiedervorlage_date,wiedervorlage_resolved_at,is_private,updated_at,deleted_at,purged_at,version) VALUES (@id,@userId,@topicId,@date,@text,@sortOrder,@linkedContextId,@doneAt,@wiedervorlageDate,@wiedervorlageResolvedAt,@isPrivate,@updatedAt,@deletedAt,@purgedAt,@version) ON CONFLICT(id,user_id) DO UPDATE SET topic_id=excluded.topic_id,date=excluded.date,text=excluded.text,sort_order=excluded.sort_order,linked_context_id=excluded.linked_context_id,done_at=excluded.done_at,wiedervorlage_date=excluded.wiedervorlage_date,wiedervorlage_resolved_at=excluded.wiedervorlage_resolved_at,is_private=excluded.is_private,updated_at=excluded.updated_at,deleted_at=excluded.deleted_at,purged_at=excluded.purged_at,version=excluded.version`);
db.transaction(() => {
for (const f of files) {
const meta = JSON.parse(readFileSync(join(histDir, f), 'utf8'));
const mdFile = join(histDir, f.replace('.meta.json', '.md'));
const text = existsSync(mdFile) ? readFileSync(mdFile, 'utf8') : '';
hStmt.run({...meta, userId, text, isPrivate: b(meta.isPrivate)});
}
})();
console.log('history:', files.length);
}
const ratingRows = JSON.parse(readFileSync(join(BUNDLE, 'ratings.json'), 'utf8'));
console.log('ratings:', ratingRows.length);
const wikiDir = join(BUNDLE, 'wiki');
if (existsSync(wikiDir)) {
const wFiles = readdirSync(wikiDir).filter(f => f.endsWith('.meta.json'));
const pStmt = db.prepare(`INSERT INTO pages (id,user_id,title,body,is_private,is_favorite,sort_order,updated_at,deleted_at,purged_at,version) VALUES (@id,@userId,@title,@body,@isPrivate,@isFavorite,@sortOrder,@updatedAt,@deletedAt,@purgedAt,@version) ON CONFLICT(id,user_id) DO UPDATE SET title=excluded.title,body=excluded.body,is_private=excluded.is_private,is_favorite=excluded.is_favorite,sort_order=excluded.sort_order,updated_at=excluded.updated_at,deleted_at=excluded.deleted_at,purged_at=excluded.purged_at,version=excluded.version`);
db.transaction(() => {
for (const f of wFiles) {
const meta = JSON.parse(readFileSync(join(wikiDir, f), 'utf8'));
const mdFile = join(wikiDir, f.replace('.meta.json', '.md'));
const body = existsSync(mdFile) ? readFileSync(mdFile, 'utf8') : '';
pStmt.run({...meta, userId, body, isPrivate: b(meta.isPrivate), isFavorite: b(meta.isFavorite)});
}
})();
console.log('pages:', wFiles.length);
}
if (existsSync(join(BUNDLE, 'notebooks.json'))) {
const nbRows = JSON.parse(readFileSync(join(BUNDLE, 'notebooks.json'), 'utf8'));
if (nbRows.length) {
const nbStmt = db.prepare(`INSERT INTO notebooks (id,user_id,name,context_id,is_private,is_favorite,sort_order,updated_at,deleted_at,purged_at,version) VALUES (@id,@userId,@name,@contextId,@isPrivate,@isFavorite,@sortOrder,@updatedAt,@deletedAt,@purgedAt,@version) ON CONFLICT(id,user_id) DO UPDATE SET name=excluded.name,context_id=excluded.context_id,is_private=excluded.is_private,is_favorite=excluded.is_favorite,sort_order=excluded.sort_order,updated_at=excluded.updated_at,deleted_at=excluded.deleted_at,purged_at=excluded.purged_at,version=excluded.version`);
db.transaction(() => { for (const r of nbRows) nbStmt.run({...r, userId, isPrivate: b(r.isPrivate), isFavorite: b(r.isFavorite)}); })();
console.log('notebooks:', nbRows.length);
}
}
if (existsSync(join(BUNDLE, 'page_notebooks.json'))) {
const pnRows = JSON.parse(readFileSync(join(BUNDLE, 'page_notebooks.json'), 'utf8'));
if (pnRows.length) {
const pnStmt = db.prepare(`INSERT INTO page_notebooks (id,user_id,page_id,notebook_id,sort_order,updated_at,deleted_at,purged_at,version) VALUES (@id,@userId,@pageId,@notebookId,@sortOrder,@updatedAt,@deletedAt,@purgedAt,@version) ON CONFLICT(id,user_id) DO UPDATE SET sort_order=excluded.sort_order,updated_at=excluded.updated_at,deleted_at=excluded.deleted_at,purged_at=excluded.purged_at,version=excluded.version`);
db.transaction(() => { for (const r of pnRows) pnStmt.run({...r, userId}); })();
console.log('page_notebooks:', pnRows.length);
}
}
const counts = db.prepare(`SELECT (SELECT COUNT(*) FROM contexts WHERE user_id=?) as c,(SELECT COUNT(*) FROM topics WHERE user_id=?) as t,(SELECT COUNT(*) FROM history_entries WHERE user_id=?) as h,(SELECT COUNT(*) FROM pages WHERE user_id=?) as p`).get(userId,userId,userId,userId);
console.log('Final counts:', counts);
console.log('integrity_check:', db.pragma('integrity_check')[0].integrity_check);
db.close();
console.log('Done.');