summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAaron <aaron@10gen.com>2009-05-18 16:03:10 -0400
committerAaron <aaron@10gen.com>2009-05-18 16:03:10 -0400
commit46275dbed5f923976c7495e7fb9b2fdb9776fc2f (patch)
treeee0ad82a4155e75e52f52f7bdfb088b3ea720564
parent6c0692a9000df2b525b4d414005c5512d9df588e (diff)
downloadmongo-46275dbed5f923976c7495e7fb9b2fdb9776fc2f.tar.gz
support renaming capped collection
-rw-r--r--db/cloner.cpp34
-rw-r--r--jstests/rename.js18
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} ) );