bool IsAHalfMatch( compat_classad::ClassAd *my, compat_classad::ClassAd *target ) { // The collector relies on this function to check the target type. // Eventually, we should move that check either into the collector // or into the requirements expression. char const *my_target_type = GetTargetTypeName(*my); char const *target_type = GetMyTypeName(*target); if( !my_target_type ) { my_target_type = ""; } if( !target_type ) { target_type = ""; } if( strcasecmp(target_type,my_target_type) && strcasecmp(my_target_type,ANY_ADTYPE) ) { return false; } classad::MatchClassAd *mad = compat_classad::getTheMatchAd( my, target ); bool result = mad->rightMatchesLeft(); compat_classad::releaseTheMatchAd(); return result; }
void ClassAdLog::LogState(FILE *fp) { LogRecord *log=NULL; ClassAd *ad=NULL; ExprTree *expr=NULL; HashKey hashval; MyString key; const char *attr_name = NULL; // This must always be the first entry in the log. log = new LogHistoricalSequenceNumber( historical_sequence_number, m_original_log_birthdate ); if (log->Write(fp) < 0) { EXCEPT("write to %s failed, errno = %d", logFilename(), errno); } delete log; table.startIterations(); while(table.iterate(ad) == 1) { table.getCurrentKey(hashval); hashval.sprint(key); log = new LogNewClassAd(key.Value(), GetMyTypeName(*ad), GetTargetTypeName(*ad)); if (log->Write(fp) < 0) { EXCEPT("write to %s failed, errno = %d", logFilename(), errno); } delete log; // Unchain the ad -- we just want to write out this ads exprs, // not all the exprs in the chained ad as well. AttrList *chain = dynamic_cast<AttrList*>(ad->GetChainedParentAd()); ad->Unchain(); ad->ResetName(); attr_name = ad->NextNameOriginal(); while (attr_name) { expr = ad->LookupExpr(attr_name); // This conditional used to check whether the ExprTree is // invisible, but no codepath sets any attributes // invisible for this call. if (expr) { log = new LogSetAttribute(key.Value(), attr_name, ExprTreeToString(expr)); if (log->Write(fp) < 0) { EXCEPT("write to %s failed, errno = %d", logFilename(), errno); } delete log; } attr_name = ad->NextNameOriginal(); } // ok, now that we're done writing out this ad, restore the chain ad->ChainToAd(chain); } if (fflush(fp) !=0){ EXCEPT("fflush of %s failed, errno = %d", logFilename(), errno); } if (condor_fsync(fileno(fp)) < 0) { EXCEPT("fsync of %s failed, errno = %d", logFilename(), errno); } }
bool ClassAdCollection::NewClassAd(const char* key, ClassAd* ad) { LogRecord* log=new LogNewClassAd(key,GetMyTypeName(*ad),GetTargetTypeName(*ad)); ClassAdLog::AppendLog(log); const char *name; ExprTree* expr; ad->ResetExpr(); while (ad->NextExpr(name, expr)) { LogRecord* l=new LogSetAttribute(key,name,ExprTreeToString(expr)); ClassAdLog::AppendLog(l); } // return AddClassAd(0,key); return true; }