2fdc737355
* bugfix, lint and refactor all bin scripts * for squash: throw Error(message) rather than log(message); throw Error() * for squash: Exit non-0 on unhandled Promise rejection Many of the recent lint changes have converted normal functions to async functions, and an error thrown in an async function does not cause Node.js to exit by default. * for squash: fix `require()` paths * for squash: remove erroneous `Object.keys()` call * for squash: fix missing `continue` statements * for squash: Fix HTTP method for deleteSession * for squash: delete erroneous throw Throw is only for errors, not successful completion. * for squash: redo migrateDirtyDBtoRealDB.js to fix async bugs * for squash: fix erroneous use of `for..of` * for squash: Add line break between statements * for squash: put closing paren on same line as last arg * for squash: Move `log()` back up where it was to minimize the diff to develop * for squash: indentation fixes * for squash: typo fix * for squash: wrap long lines * for squash: use `util.callbackify` to silence promise/no-callback-in-promise warning * for squash: use double quotes to improve readability Co-authored-by: Richard Hansen <rhansen@rhansen.org>
109 lines
3 KiB
JavaScript
109 lines
3 KiB
JavaScript
'use strict';
|
|
|
|
// As of v14, Node.js does not exit when there is an unhandled Promise rejection. Convert an
|
|
// unhandled rejection into an uncaught exception, which does cause Node.js to exit.
|
|
process.on('unhandledRejection', (err) => { throw err; });
|
|
|
|
const startTime = Date.now();
|
|
|
|
const log = (str) => {
|
|
console.log(`${(Date.now() - startTime) / 1000}\t${str}`);
|
|
};
|
|
|
|
const unescape = (val) => {
|
|
// value is a string
|
|
if (val.substr(0, 1) === "'") {
|
|
val = val.substr(0, val.length - 1).substr(1);
|
|
|
|
return val.replace(/\\[0nrbtZ\\'"]/g, (s) => {
|
|
switch (s) {
|
|
case '\\0': return '\0';
|
|
case '\\n': return '\n';
|
|
case '\\r': return '\r';
|
|
case '\\b': return '\b';
|
|
case '\\t': return '\t';
|
|
case '\\Z': return '\x1a';
|
|
default: return s.substr(1);
|
|
}
|
|
});
|
|
}
|
|
|
|
// value is a boolean or NULL
|
|
if (val === 'NULL') {
|
|
return null;
|
|
}
|
|
if (val === 'true') {
|
|
return true;
|
|
}
|
|
if (val === 'false') {
|
|
return false;
|
|
}
|
|
|
|
// value is a number
|
|
return val;
|
|
};
|
|
|
|
|
|
require('ep_etherpad-lite/node_modules/npm').load({}, (er, npm) => {
|
|
const fs = require('fs');
|
|
|
|
const ueberDB = require('ep_etherpad-lite/node_modules/ueberdb2');
|
|
const settings = require('ep_etherpad-lite/node/utils/Settings');
|
|
const log4js = require('ep_etherpad-lite/node_modules/log4js');
|
|
|
|
const dbWrapperSettings = {
|
|
cache: 0,
|
|
writeInterval: 100,
|
|
json: false, // data is already json encoded
|
|
};
|
|
const db = new ueberDB.database( // eslint-disable-line new-cap
|
|
settings.dbType,
|
|
settings.dbSettings,
|
|
dbWrapperSettings,
|
|
log4js.getLogger('ueberDB'));
|
|
|
|
const sqlFile = process.argv[2];
|
|
|
|
// stop if the settings file is not set
|
|
if (!sqlFile) throw new Error('Use: node importSqlFile.js $SQLFILE');
|
|
|
|
log('initializing db');
|
|
db.init((err) => {
|
|
// there was an error while initializing the database, output it and stop
|
|
if (err) {
|
|
throw err;
|
|
} else {
|
|
log('done');
|
|
|
|
log('open output file...');
|
|
const lines = fs.readFileSync(sqlFile, 'utf8').split('\n');
|
|
|
|
const count = lines.length;
|
|
let keyNo = 0;
|
|
|
|
process.stdout.write(`Start importing ${count} keys...\n`);
|
|
lines.forEach((l) => {
|
|
if (l.substr(0, 27) === 'REPLACE INTO store VALUES (') {
|
|
const pos = l.indexOf("', '");
|
|
const key = l.substr(28, pos - 28);
|
|
let value = l.substr(pos + 3);
|
|
value = value.substr(0, value.length - 2);
|
|
console.log(`key: ${key} val: ${value}`);
|
|
console.log(`unval: ${unescape(value)}`);
|
|
db.set(key, unescape(value), null);
|
|
keyNo++;
|
|
if (keyNo % 1000 === 0) {
|
|
process.stdout.write(` ${keyNo}/${count}\n`);
|
|
}
|
|
}
|
|
});
|
|
process.stdout.write('\n');
|
|
process.stdout.write('done. waiting for db to finish transaction. ' +
|
|
'depended on dbms this may take some time..\n');
|
|
|
|
db.close(() => {
|
|
log(`finished, imported ${keyNo} keys.`);
|
|
});
|
|
}
|
|
});
|
|
});
|