Skip to content

Instantly share code, notes, and snippets.

@lsm
Created July 1, 2011 05:24
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save lsm/1057920 to your computer and use it in GitHub Desktop.
Save lsm/1057920 to your computer and use it in GitHub Desktop.
Exporter/importer to fix crapped gridfs files for node-mongodb-native < 0.9.4.4
var mongodbSrc = require('./mongodb-0.9.4-3');
var mongodbDst = require('./mongodb-0.9.6-1');
/**** Edit start ****/
var SRC_HOST = '10.0.0.31';
var SRC_PORT = 27017;
var SRC_DB_NAME = 'mydb';
var SRC_ROOT_COLLECTION = 'images';
var FILE_QUERY = {}; // default to all
var DST_HOST = '127.0.0.1';
var DST_PORT = 27017;
var DST_DB_NAME = 'myotherdb';
var DST_ROOT_COLLECTION = 'images';
/**** Edit end ****/
var serverSrc = new mongodbSrc.Server(SRC_HOST, SRC_PORT);
var dbSrc = new mongodbSrc.Db(SRC_DB_NAME, serverSrc, {native_parser: false});
var GridStoreSrc = mongodbSrc.GridStore;
var serverDst = new mongodbDst.Server(DST_HOST, DST_PORT);
var dbDst = new mongodbDst.Db(DST_DB_NAME, serverDst, {native_parser: false});
var GridStoreDst = mongodbDst.GridStore;
var msg = ['You files will be pumped \nfrom\n%s:%s/%s.%s \nto\n%s:%s/%s.%s\n'];
msg = msg.concat(SRC_HOST, SRC_PORT, SRC_DB_NAME, SRC_ROOT_COLLECTION);
msg = msg.concat(DST_HOST, DST_PORT, DST_DB_NAME, DST_ROOT_COLLECTION);
console.log.apply(console, msg);
function saveToDst(file, content, callback) {
function write(err, db) {
if (err) throw err;
var options = {root: DST_ROOT_COLLECTION, 'content_type': file.contentType};
options.metadata = file.metadata;
options.chunk_size = file.chunkSize;
var gsDst = new GridStoreDst(db, file.filename, 'w', options);
gsDst.open(function(err, gsDst) {
if (err) throw err;
gsDst.write(content, true, function(err, gsDst) {
if (err) throw err;
callback(db);
});
});
}
dbDst.state === 'connected' ? write(null, dbDst) : dbDst.open(write);
}
dbSrc.open(function(err, db) {
if (err) throw err;
db.collection(SRC_ROOT_COLLECTION + '.files', function(err, collSrc) {
if (err) throw err;
collSrc.find(FILE_QUERY, null, {}, function(err, cursorSrc) {
cursorSrc.toArray(function(err, files) {
if (err) throw err;
console.log('Found %s files', files.length);
var count = 0;
function copy(fileSrc) {
if (!fileSrc) {
db.close();
return;
}
console.log('\nReading file `%s` from source...', fileSrc.filename);
var gsSrc = new GridStoreSrc(db, fileSrc.filename, 'r', {root: SRC_ROOT_COLLECTION});
gsSrc.open(function(err, gsSrc) {
if (err) throw err;
gsSrc.read(function(err, contentSrc) {
if (err) throw err;
console.log('length: %s\nWriting to destination...', contentSrc.length);
saveToDst(fileSrc, contentSrc, function(dbDst) {
console.log('finished writing `%s`', fileSrc.filename);
count++;
var nextFile = files.pop();
if (nextFile) {
copy(nextFile);
} else {
console.log('\nAll finished, %s files transfered', count);
db.close();
dbDst.close();
}
});
})
});
}
copy(files.pop());
});
});
});
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment