diff options
author | Aaron <aaron@10gen.com> | 2009-05-18 16:03:10 -0400 |
---|---|---|
committer | Aaron <aaron@10gen.com> | 2009-05-18 16:03:10 -0400 |
commit | 46275dbed5f923976c7495e7fb9b2fdb9776fc2f (patch) | |
tree | ee0ad82a4155e75e52f52f7bdfb088b3ea720564 | |
parent | 6c0692a9000df2b525b4d414005c5512d9df588e (diff) | |
download | mongo-46275dbed5f923976c7495e7fb9b2fdb9776fc2f.tar.gz |
support renaming capped collection
-rw-r--r-- | db/cloner.cpp | 34 | ||||
-rw-r--r-- | jstests/rename.js | 18 |
2 files changed, 38 insertions, 14 deletions
diff --git a/db/cloner.cpp b/db/cloner.cpp index 774f3037383..b97b544a846 100644 --- a/db/cloner.cpp +++ b/db/cloner.cpp @@ -549,24 +549,33 @@ namespace mongo { return false; } - DBDirectClient bridge; - { - dbtemprelease t; - if ( !bridge.findOne( target, BSONObj() ).isEmpty() ) { - errmsg = "target namespace not empty"; - return false; - } - } + setClient( source.c_str() ); + NamespaceDetails *nsd = nsdetails( source.c_str() ); + uassert( "source namespace does not exist", nsd ); + bool capped = nsd->capped; + long long size = 0; + if ( capped ) + for( DiskLoc i = nsd->firstExtent; !i.isNull(); i = i.ext()->xnext ) + size += i.ext()->length; + + setClient( target.c_str() ); + BSONObjBuilder spec; + if ( capped ) { + spec.appendBool( "capped", true ); + spec.append( "size", double( size ) ); + } + if ( !userCreateNS( target.c_str(), spec.done(), errmsg, true ) ) + return false; + auto_ptr< DBClientCursor > c; - setClient( target.c_str() ); + DBDirectClient bridge; + { - dbtemprelease t; c = bridge.query( source, BSONObj() ); } while( 1 ) { { - dbtemprelease t; if ( !c->more() ) break; } @@ -580,12 +589,10 @@ namespace mongo { nsToClient( target.c_str(), cl ); string targetIndexes = string( cl ) + ".system.indexes"; { - dbtemprelease t; c = bridge.query( sourceIndexes, QUERY( "ns" << source ) ); } while( 1 ) { { - dbtemprelease t; if ( !c->more() ) break; } @@ -607,7 +614,6 @@ namespace mongo { } { - dbtemprelease t; if ( !bridge.dropCollection( source ) ) { errmsg = "failed to drop old name collection"; return false; diff --git a/jstests/rename.js b/jstests/rename.js index a6421b7128e..0b8bf954328 100644 --- a/jstests/rename.js +++ b/jstests/rename.js @@ -22,3 +22,21 @@ assert.eq( 0, a.find().count() ); assert.eq( 2, b.find().count() ); assert.eq( 3, db.system.indexes.find( {ns:"test.jstests_rename_b"} ).count() ); assert( b.find( {a:1} ).explain().cursor.match( /^BtreeCursor/ ) ); + +// now try renaming a capped collection + +a.drop(); +b.drop(); +c.drop(); + +db.createCollection( "jstests_rename_a", {capped:true,size:100} ); +for( i = 0; i < 10; ++i ) { + a.save( { i: i } ); +} +assert.commandWorked( admin.runCommand( {renameCollection:"test.jstests_rename_a", to:"test.jstests_rename_b"} ) ); +assert.eq( 1, b.count( {i:9} ) ); +for( i = 10; i < 20; ++i ) { + b.save( { i: i } ); +} +assert.eq( 0, b.count( {i:9} ) ); +assert.eq( 1, b.count( {i:19} ) ); |