/* * Executes the migration of the indexes format that were saved before 0.3 **/ void DBController::migrateIndex0_3(const char* db, const char* ns, InputStream* stream, IndexAlgorithm* impl) { long currentPos = stream->currentPos(); stream->seek(0); int records = 0; BSONInputStream* bis = new BSONInputStream(stream); while (!stream->eof()) { BSONObj* obj = bis->readBSON(); if (!impl) { std::set<std::string> skeys; for (BSONObj::const_iterator i = obj->begin(); i != obj->end(); i++) { std::string key = i->first; skeys.insert(key); } } long indexPos = stream->readLong(); long posData = stream->readLong(); if (obj->has("_id")) { insertIndex(db, ns, obj, posData); records++; } delete obj; } stream->close(); if (_logger->isInfo()) _logger->info("db: %s, ns: %s, Index migrated to version 0.3. Records: %d", db, ns, records); delete bis; }
void BSONOutputStream::writeBSON(const BSONObj& bson) { Logger* log = getLogger(NULL); if (log->isDebug()) log->debug("BSONOutputStream::writeBSON bson elements: %d", bson.length()); _outputStream->writeLong(bson.length()); for (std::map<t_keytype, BSONContent* >::const_iterator i = bson.begin(); i != bson.end(); i++) { t_keytype key = i->first; if (log->isDebug()) log->debug("BSONOutputStream::writeBSON name: %s", key.c_str()); _outputStream->writeString(key); BSONContent* cont = i->second; // If the type is PTRCHAR_TYPE change it to string_type, to remove this type in future _outputStream->writeLong(cont->type() != PTRCHAR_TYPE? cont->type(): STRING_TYPE); char* text; BSONObj* inner; switch (cont->type()) { case BSON_TYPE: inner = (BSONObj*)cont->_element; writeBSON(*inner); break; case INT_TYPE: _outputStream->writeInt(*((int*)cont->_element)); break; case LONG_TYPE: _outputStream->writeLong(*((long*)cont->_element)); break; case DOUBLE_TYPE: _outputStream->writeDoubleIEEE(*((double*)cont->_element)); break; case PTRCHAR_TYPE: text = (char*)cont->_element; _outputStream->writeString(std::string(text)); break; case STRING_TYPE: { string* str = (string*)cont->_element; _outputStream->writeString(*str); break; } case BSONARRAY_TYPE: { BSONArrayObj* array = (BSONArrayObj*)cont->_element; writeBSONArray(array); break; } } } delete log; }