fcoin/migrate/chaindb0to1.js
Christopher Jeffrey 60bd3e751e
migrate: minor.
2016-08-18 02:09:30 -07:00

113 lines
2.1 KiB
JavaScript

var bcoin = require('../');
var assert = require('assert');
var file = process.argv[2];
assert(typeof file === 'string', 'Please pass in a database path.');
var db = bcoin.ldb({
location: file,
db: 'leveldb',
compression: true,
cacheSize: 16 << 20,
writeBufferSize: 8 << 20,
createIfMissing: false,
bufferKeys: true
});
function makeKey(data) {
var height = data.readUInt32LE(1, true);
var key = new Buffer(5);
key[0] = 0x48;
key.writeUInt32BE(height, 1, true);
return key;
}
function updateState(callback) {
var hash, batch, ver, p;
console.log('Updating chain state.');
db.get('R', function(err, data) {
if (err)
return callback(err);
if (!data || data.length < 32)
return callback(new Error('No chain state.'));
hash = data.slice(0, 32);
p = new bcoin.writer();
p.writeHash(hash);
p.writeU64(0);
p.writeU64(0);
p.writeU64(0);
p = p.render();
batch = db.batch();
batch.put('R', p);
ver = new Buffer(4);
ver.writeUInt32LE(1, 0, true);
batch.put('V', ver);
batch.write(function(err) {
if (err)
return callback(err);
console.log('Updated chain state.');
callback();
});
});
}
function updateEndian(callback) {
var lo = new Buffer('4800000000', 'hex');
var hi = new Buffer('48ffffffff', 'hex');
var batch = db.batch();
var total = 0;
console.log('Updating endianness.');
console.log('Iterating...');
db.iterate({
gte: lo,
lte: hi,
values: true,
parse: function(key, value) {
batch.del(key);
batch.put(makeKey(key), value);
total++;
}
}, function(err) {
if (err)
throw err;
console.log('Migrating %d items.', total);
batch.write(function(err) {
if (err)
throw err;
console.log('Migrated endianness.');
callback();
});
});
}
db.open(function(err) {
if (err)
throw err;
console.log('Opened %s.', file);
updateState(function(err) {
if (err)
throw err;
updateEndian(function(err) {
if (err)
throw err;
console.log('Migration complete.');
process.exit(0);
});
});
});