summaryrefslogtreecommitdiff
path: root/tools/restore.cpp
diff options
context:
space:
mode:
authorEliot Horowitz <eliot@10gen.com>2009-09-15 13:48:26 -0400
committerEliot Horowitz <eliot@10gen.com>2009-09-15 13:48:26 -0400
commit265af2d1f9c438903d23569e250bd5f54d354212 (patch)
treef657a0f5fc7bc8eb1d610ce39da6c740d18a9176 /tools/restore.cpp
parent94f07156f71a8771b1da2e2772a2f1cab33cc774 (diff)
downloadmongo-265af2d1f9c438903d23569e250bd5f54d354212.tar.gz
restore can import 64-bit data files with 32-bit mongorestore SERVER-141
Diffstat (limited to 'tools/restore.cpp')
-rw-r--r--tools/restore.cpp56
1 files changed, 34 insertions, 22 deletions
diff --git a/tools/restore.cpp b/tools/restore.cpp
index 5d2d795dd35..f49f72524c8 100644
--- a/tools/restore.cpp
+++ b/tools/restore.cpp
@@ -45,6 +45,7 @@ public:
}
void drillDown( path root ) {
+ log(2) << "drillDown: " << root.string() << endl;
if ( is_directory( root ) ) {
directory_iterator end;
@@ -80,40 +81,51 @@ public:
ns += "." + l;
}
- if ( boost::filesystem::file_size( root ) == 0 ) {
+ long long fileLength = file_size( root );
+
+ if ( fileLength == 0 ) {
out() << "file " + root.native_file_string() + " empty, skipping" << endl;
return;
}
out() << "\t going into namespace [" << ns << "]" << endl;
-
- MemoryMappedFile mmf;
- long fileLength;
- assert( mmf.map( root.string().c_str() , fileLength ) );
-
+
+ string fileString = root.string();
+ ifstream file( fileString.c_str() , ios_base::in | ios_base::binary);
+ if ( ! file.is_open() ){
+ log() << "error opening file: " << fileString << endl;
+ return;
+ }
+
log(1) << "\t file size: " << fileLength << endl;
+
+ long long read = 0;
+ long long num = 0;
- char * data = (char*)mmf.viewOfs();
- long read = 0;
-
- long num = 0;
-
- int msgDelay = (int)(1000 * ( 1 + ( mmf.length() / ( 1024.0 * 1024 * 400 ) ) ) );
+ int msgDelay = (int)(1000 * ( 1 + ( fileLength / ( 1024.0 * 1024 * 400 ) ) ) );
log(1) << "\t msg delay: " << msgDelay << endl;
-
- while ( read < mmf.length() ) {
- BSONObj o( data );
-
+
+ const int BUF_SIZE = 1024 * 1024 * 5;
+ char * buf = (char*)malloc( BUF_SIZE );
+
+ while ( read < fileLength ) {
+ file.read( buf , 4 );
+ int size = ((int*)buf)[0];
+ assert( size < BUF_SIZE );
+
+ file.read( buf + 4 , size - 4 );
+
+ BSONObj o( buf );
conn().insert( ns.c_str() , o );
-
+
read += o.objsize();
- data += o.objsize();
-
num++;
- if ( logLevel > 0 && num < 10 || ! ( num % msgDelay ) )
- out() << "read " << read << "/" << mmf.length() << " bytes so far. (" << (int)( (read * 100) / mmf.length()) << "%) " << num << " objects" << endl;
+
+ if ( ( logLevel > 0 && num < 10 ) || ! ( num % msgDelay ) )
+ out() << "read " << read << "/" << fileLength << " bytes so far. (" << (int)( (read * 100) / fileLength) << "%) " << num << " objects" << endl;
}
-
+
+ free( buf );
out() << "\t " << num << " objects" << endl;
}
};