Database::Database(TransactionExperiment* txn, const char *nm, bool& newDb, const string& path ) : _name(nm), _path(path), _namespaceIndex( _path, _name ), _extentManager(new MmapV1ExtentManager(_name, _path, storageGlobalParams.directoryperdb)), _profileName(_name + ".system.profile"), _namespacesName(_name + ".system.namespaces"), _indexesName(_name + ".system.indexes"), _collectionLock( "Database::_collectionLock" ) { Status status = validateDBName( _name ); if ( !status.isOK() ) { warning() << "tried to open invalid db: " << _name << endl; uasserted( 10028, status.toString() ); } try { newDb = _namespaceIndex.exists(); _profile = serverGlobalParams.defaultProfile; checkDuplicateUncasedNames(true); // If already exists, open. Otherwise behave as if empty until // there's a write, then open. if (!newDb) { _namespaceIndex.init( txn ); openAllFiles(txn); // upgrade freelist string oldFreeList = _name + ".$freelist"; NamespaceDetails* details = _namespaceIndex.details( oldFreeList ); if ( details ) { if ( !details->firstExtent().isNull() ) { _extentManager->freeExtents(txn, details->firstExtent(), details->lastExtent()); } _namespaceIndex.kill_ns( txn, oldFreeList ); } } _magic = 781231; } catch(std::exception& e) { log() << "warning database " << path << " " << nm << " could not be opened" << endl; DBException* dbe = dynamic_cast<DBException*>(&e); if ( dbe != 0 ) { log() << "DBException " << dbe->getCode() << ": " << e.what() << endl; } else { log() << e.what() << endl; } _extentManager.reset(); throw; } }
Database::Database(const char *nm, bool& newDb, const string& path ) : _name(nm), _path(path), _namespaceIndex( _path, _name ), _extentManager( _name, _path, directoryperdb /* this is a global right now */ ), _profileName(_name + ".system.profile"), _namespacesName(_name + ".system.namespaces"), _collectionLock( "Database::_collectionLock" ) { Status status = validateDBName( _name ); if ( !status.isOK() ) { warning() << "tried to open invalid db: " << _name << endl; uasserted( 10028, status.toString() ); } try { newDb = _namespaceIndex.exists(); _profile = cmdLine.defaultProfile; checkDuplicateUncasedNames(true); // If already exists, open. Otherwise behave as if empty until // there's a write, then open. if (!newDb) { _namespaceIndex.init(); openAllFiles(); } _magic = 781231; } catch(std::exception& e) { log() << "warning database " << path << " " << nm << " could not be opened" << endl; DBException* dbe = dynamic_cast<DBException*>(&e); if ( dbe != 0 ) { log() << "DBException " << dbe->getCode() << ": " << e.what() << endl; } else { log() << e.what() << endl; } _extentManager.reset(); throw; } }