fcoin/migrate/walletdb4to5.js
2017-07-31 18:21:02 -07:00

75 lines
1.4 KiB
JavaScript

'use strict';
const assert = require('assert');
const bcoin = require('../');
let file = process.argv[2];
let batch;
assert(typeof file === 'string', 'Please pass in a database path.');
file = file.replace(/\.ldb\/?$/, '');
const db = bcoin.ldb({
location: file,
db: 'leveldb',
compression: true,
cacheSize: 32 << 20,
createIfMissing: false,
bufferKeys: true
});
async function updateVersion() {
const bak = `${process.env.HOME}/walletdb-bak-${Date.now()}.ldb`;
console.log('Checking version.');
const data = await db.get('V');
assert(data, 'No version.');
let ver = data.readUInt32LE(0, true);
if (ver !== 4)
throw Error(`DB is version ${ver}.`);
console.log('Backing up DB to: %s.', bak);
await db.backup(bak);
ver = Buffer.allocUnsafe(4);
ver.writeUInt32LE(5, 0, true);
batch.put('V', ver);
}
async function updateTXDB() {
const keys = await db.keys({
gte: Buffer.from([0x00]),
lte: Buffer.from([0xff])
});
for (let i = 0; i < keys.length; i++) {
const key = keys[i];
switch (key[0]) {
case 0x62: // b
case 0x63: // c
case 0x65: // e
case 0x74: // t
batch.del(key);
break;
}
}
await batch.write();
}
(async () => {
await db.open();
batch = db.batch();
console.log('Opened %s.', file);
await updateVersion();
await updateTXDB();
await db.close();
})().then(() => {
console.log('Migration complete.');
process.exit(0);
});