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; };