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);
|
2017-11-29 19:56:14 -05:00
|
|
|
|
|
|
|
if (missing.length > 0) {
|
|
|
|
console.log("Missing IDs from " + name + " table " + table + ": ", missing);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-12-14 22:31:49 -05:00
|
|
|
function compareRows(table, rsLeft, rsRight, column) {
|
2017-11-29 19:56:14 -05:00
|
|
|
const leftIds = Object.keys(rsLeft);
|
|
|
|
const rightIds = Object.keys(rsRight);
|
|
|
|
|
2018-12-16 23:17:13 +01:00
|
|
|
console.log(`${table} - ${leftIds.length}/${rightIds.length}`);
|
|
|
|
|
2017-11-29 19:56:14 -05:00
|
|
|
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) {
|
2017-12-14 22:31:49 -05:00
|
|
|
console.log("Table " + table + " row with " + column + "=" + id + " differs:");
|
2017-11-29 19:56:14 -05:00
|
|
|
console.log("Left: ", left);
|
|
|
|
console.log("Right: ", right);
|
|
|
|
printDiff(left, right);
|
2017-11-23 23:19:45 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
async function main() {
|
2017-11-29 19:56:14 -05:00
|
|
|
const dbLeftPath = process.argv[2];
|
|
|
|
const dbRightPath = process.argv[3];
|
2017-11-23 23:19:45 -05:00
|
|
|
|
2017-11-29 19:56:14 -05:00
|
|
|
const dbLeft = await sqlite.open(dbLeftPath, { Promise });
|
|
|
|
const dbRight = await sqlite.open(dbRightPath, { Promise });
|
2017-11-23 23:19:45 -05:00
|
|
|
|
2017-11-29 19:56:14 -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
|
|
|
|
2017-12-14 22:31:49 -05:00
|
|
|
compareRows(table, rsLeft, rsRight, column);
|
2017-11-23 23:19:45 -05:00
|
|
|
}
|
|
|
|
|
2018-12-16 23:17:13 +01:00
|
|
|
await compare("branches", "branchId",
|
2019-04-11 22:53:35 +02:00
|
|
|
"SELECT branchId, noteId, parentNoteId, notePosition, utcDateCreated, utcDateModified, isDeleted, prefix, hash FROM branches");
|
2018-12-16 23:17:13 +01:00
|
|
|
|
|
|
|
await compare("notes", "noteId",
|
2019-04-11 22:53:35 +02:00
|
|
|
"SELECT noteId, title, dateModified, utcDateModified, dateCreated, utcDateCreated, isProtected, isDeleted, hash FROM notes");
|
|
|
|
|
|
|
|
await compare("note_contents", "noteId",
|
2019-04-14 14:53:05 +02:00
|
|
|
"SELECT noteId, content, utcDateModified, hash FROM note_contents");
|
2018-12-16 23:17:13 +01:00
|
|
|
|
2019-04-14 14:53:05 +02:00
|
|
|
await compare("note_revisions", "noteRevisionId",
|
2019-04-11 22:53:35 +02:00
|
|
|
"SELECT noteRevisionId, noteId, title, content, dateModifiedFrom, dateModifiedTo, utcDateModifiedFrom, utcDateModifiedTo, isProtected, hash FROM note_revisions");
|
2018-12-16 23:17:13 +01:00
|
|
|
|
|
|
|
await compare("links", "linkId",
|
2019-04-11 22:53:35 +02:00
|
|
|
"SELECT linkId, noteId, targetNoteId, type, isDeleted, utcDateCreated, utcDateModified, hash FROM links");
|
2018-12-16 23:17:13 +01:00
|
|
|
|
|
|
|
await compare("recent_notes", "branchId",
|
2019-04-11 22:53:35 +02:00
|
|
|
"SELECT branchId, notePath, utcDateCreated, isDeleted, hash FROM recent_notes");
|
2018-12-16 23:17:13 +01:00
|
|
|
|
|
|
|
await compare("options", "name",
|
2019-04-11 22:53:35 +02:00
|
|
|
`SELECT name, value, utcDateCreated, utcDateModified, hash FROM options WHERE isSynced = 1`);
|
2018-12-16 23:17:13 +01:00
|
|
|
|
|
|
|
await compare("attributes", "attributeId",
|
2019-04-11 22:53:35 +02:00
|
|
|
"SELECT attributeId, noteId, type, name, value, utcDateCreated, utcDateModified, hash FROM attributes");
|
2018-12-16 23:17:13 +01:00
|
|
|
|
|
|
|
await compare("api_tokens", "apiTokenId",
|
2019-04-11 22:53:35 +02:00
|
|
|
"SELECT apiTokenId, token, utcDateCreated, isDeleted, hash FROM api_tokens");
|
2017-11-23 23:19:45 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
(async () => {
|
|
|
|
try {
|
|
|
|
await main();
|
|
|
|
} catch (e) {
|
|
|
|
console.error(e);
|
|
|
|
}
|
|
|
|
})();
|