Notes/compare.js

81 lines
3.2 KiB
JavaScript
Raw Normal View History

2017-11-23 23:19:45 -05:00
"use strict";
require('colors');
const jsdiff = require('diff');
const sqlite = require('sqlite');
const sql = require('./sql');
function printDiff(one, two) {
const diff = jsdiff.diffChars(one, two);
diff.forEach(function(part){
// green for additions, red for deletions
// grey for common parts
const color = part.added ? 'green' :
part.removed ? 'red' : 'grey';
process.stderr.write(part.value[color]);
});
}
2017-12-12 23:16:38 -05:00
function checkMissing(table, name, ids1, ids2) {
const missing = ids1.filter(item => ids2.indexOf(item) < 0);
if (missing.length > 0) {
console.log("Missing IDs from " + name + " table " + table + ": ", missing);
}
}
function compareRows(table, rsLeft, rsRight, column) {
const leftIds = Object.keys(rsLeft);
const rightIds = Object.keys(rsRight);
checkMissing(table, "right", leftIds, rightIds);
checkMissing(table, "left", rightIds, leftIds);
const commonIds = leftIds.filter(item => rightIds.includes(item));
for (const id of commonIds) {
const left = JSON.stringify(rsLeft[id], null, 2);
const right = JSON.stringify(rsRight[id], null, 2);
if (left !== right) {
console.log("Table " + table + " row with " + column + "=" + id + " differs:");
console.log("Left: ", left);
console.log("Right: ", right);
printDiff(left, right);
2017-11-23 23:19:45 -05:00
}
}
}
async function main() {
const dbLeftPath = process.argv[2];
const dbRightPath = process.argv[3];
2017-11-23 23:19:45 -05:00
const dbLeft = await sqlite.open(dbLeftPath, { Promise });
const dbRight = await sqlite.open(dbRightPath, { Promise });
2017-11-23 23:19:45 -05:00
async function compare(table, column, query) {
const rsLeft = await sql.getIndexed(dbLeft, column, query);
const rsRight = await sql.getIndexed(dbRight, column, query);
2017-11-23 23:19:45 -05:00
compareRows(table, rsLeft, rsRight, column);
2017-11-23 23:19:45 -05:00
}
2018-06-01 23:13:21 -04:00
await compare("branches", "branchId", "SELECT branchId, noteId, parentNoteId, notePosition, dateCreated, dateModified, isDeleted, prefix, hash FROM branches");
await compare("notes", "noteId", "SELECT noteId, title, content, dateModified, isProtected, isDeleted, hash FROM notes");
await compare("note_history", "noteHistoryId", "SELECT noteRevisionId, noteId, title, content, dateModifiedFrom, dateModifiedTo, isProtected, hash FROM note_revisions");
await compare("images", "imageId", "SELECT imageId, format, checksum, name, isDeleted, dateCreated, dateModified, hash FROM images");
await compare("note_images", "noteImageId", "SELECT noteImageId, noteId, imageId, isDeleted, dateCreated, dateModified, hash FROM note_images");
await compare("recent_notes", "branchId", "SELECT branchId, notePath, dateCreated, isDeleted, hash FROM recent_notes");
await compare("options", "name", `SELECT optionId, name, value, hash, dateCreated, dateModified FROM options WHERE isSynced = 1`);
await compare("labels", "labelId", "SELECT labelId, noteId, name, value, dateCreated, dateModified, hash FROM labels");
await compare("api_tokens", "apiTokenId", "SELECT apiTokenId, token, dateCreated, isDeleted, hash FROM api_tokens");
2017-11-23 23:19:45 -05:00
}
(async () => {
try {
await main();
} catch (e) {
console.error(e);
}
})();