const startTime = Date.now();
|
|
|
|
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(settings.dbType, settings.dbSettings, dbWrapperSettings, log4js.getLogger('ueberDB'));
|
|
|
|
const sqlFile = process.argv[2];
|
|
|
|
// stop if the settings file is not set
|
|
if (!sqlFile) {
|
|
console.error('Use: node importSqlFile.js $SQLFILE');
|
|
process.exit(1);
|
|
}
|
|
|
|
log('initializing db');
|
|
db.init((err) => {
|
|
// there was an error while initializing the database, output it and stop
|
|
if (err) {
|
|
console.error('ERROR: Problem while initializing the database');
|
|
console.error(err.stack ? err.stack : err);
|
|
process.exit(1);
|
|
} 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.doShutdown(() => {
|
|
log(`finished, imported ${keyNo} keys.`);
|
|
process.exit(0);
|
|
});
|
|
}
|
|
});
|
|
});
|
|
|
|
function log(str) {
|
|
console.log(`${(Date.now() - startTime) / 1000}\t${str}`);
|
|
}
|
|
|
|
unescape = function (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;
|
|
};
|