/* * Delete all database entries */ bool CDbManager::deleteAllDatabases(CLog* log) { CHECK_DB_MGR_INIT(getDatabase, false); CTimestamp starttime = _LastUpdateTime; CTimestamp endtime; endtime.setToCurrent(); TDatabaseMap::iterator it; for (it=_DatabaseMap.begin(); it!=_DatabaseMap.end(); ++it) { CDatabase* db = (*it).second; if (db == NULL) { log->displayNL("Database '%d' left with as NULL", (*it).first); } else { // flush db if (!db->buildDelta(starttime, endtime)) nlwarning("failed to build delta for database '%d' '%s'", (*it).first, db->getName().c_str()); // delete it delete db; } // unreference it (*it).second = NULL; } _DatabaseMap.clear(); return true; }
/* * Update manager */ bool CDbManager::update() { H_AUTO(PDS_DbManager_update); CHECK_DB_MGR_INIT(update, false); // update stamp CTableBuffer::updateCommonStamp(); TDatabaseMap::iterator it; CDatabase::checkUpdateRates(); // check evently if database need to write some delta TTime tm = CTime::getLocalTime(); if (tm >= _NextTimeDelta) { CTimestamp starttime = _LastUpdateTime; CTimestamp endtime; endtime.setToCurrent(); std::vector<uint32> ack; for (it=_DatabaseMap.begin(); it!=_DatabaseMap.end(); ++it) { CDatabase* database = (*it).second; // generate deltas if (!database->buildDelta(starttime, endtime)) nlwarning("failed to build delta for database '%d' '%s'", (*it).first, database->getName().c_str()); // obsolete? since RBS build references and tells PDS of success/failure database->checkReferenceChange(); // acknowledge last updates database->flushUpdates(ack); if (!ack.empty() && database->getMappedService().get() != 0xffff) { CMessage msgack("PD_ACK_UPD"); uint32 databaseId = (*it).first; msgack.serial(databaseId); msgack.serialCont(ack); CUnifiedNetwork::getInstance()->send(database->getMappedService(), msgack); } } _NextTimeDelta = tm - (tm%(DeltaUpdateRate*1000)) + (DeltaUpdateRate*1000); _LastUpdateTime = endtime; } CTimestamp ts; ts.setToCurrent(); // check databases require some delta packing/reference generation for (it=_DatabaseMap.begin(); it!=_DatabaseMap.end(); ++it) { CDatabase* database = (*it).second; database->sendBuildCommands(ts); } // send messages to RBS if ready while (_RBSUp && !_RBSMessages.empty()) { CUnifiedNetwork::getInstance()->send("RBS", *(_RBSMessages.front())); delete _RBSMessages.front(); _RBSMessages.pop_front(); } return true; }