let sqlite = require('sqlite3').verbose(); let r = require('rethinkdb'); let util = require('util'); const config = { file: './storage.db', dbName: 'live', dropTables: true, maxBusy: 100, tables: [ 'characterList', 'stash', 'skins', 'login', 'leaderboard', 'customMap', 'mail', 'customChannels', 'error', 'modLog', 'accountInfo', 'character' ] }; let converter = { dbS: null, dbR: null, connection: null, res: null, busy: 0, records: [], currentTable: null, init: async function () { this.dbS = new sqlite.Database(config.file, this.onDbCreated.bind(this)); }, onDbCreated: async function () { this.connection = await r.connect({ host: 'localhost', port: 28015 }); await this.setupRethink(); await this.convertTables(); }, setupRethink: async function () { try { await r.dbCreate(config.dbName).run(this.connection); } catch (e) {} await this.connection.use(config.dbName); for (const table of config.tables) { try { if (config.dropTables) { try { await r.tableDrop(table).run(this.connection); } catch (e) {} } await r.tableCreate(table).run(this.connection); } catch (e) { if (!e.msg.includes('already exists')) console.log(e); } } }, convertTables: async function () { for (let table of config.tables) { this.currentTable = table; this.records = await util.promisify(this.dbS.all.bind(this.dbS))(`SELECT * FROM ${table}`); console.log(`${table}: ${this.records.length} records`); await this.startConvert(); console.log('done'); } }, startConvert: async function () { return new Promise(res => { this.res = res; this.work(); }); }, work: function () { if (!this.records.length) { this.res(); return; } if (this.busy === config.maxBusy) return; let record = this.records.pop(); if (record) { this.processRecord(record); this.work(); } }, processRecord: async function (record) { this.busy++; let id = record.key; let value = record.value .split('`') .join('\''); let obj = value; if (!['login'].includes(this.currentTable)) { if (this.currentTable === 'mail' && value === '') value = '{}'; obj = JSON.parse(value); } await r.table(this.currentTable) .insert({ id, value: obj }) .run(this.connection); this.busy--; this.work(); } }; converter.init();