/*
$Log$
+Revision 1.6 2007/10/16 14:37:16 jgrosseo
+changing to AMANDA protocol version 2
+
+Revision 1.5 2007/10/05 12:40:55 acolla
+
+Result error code added to AliDCSClient data members (it was "lost" with the new implementation of TMap* GetAliasValues and GetDPValues).
+
+Revision 1.4 2007/09/14 16:46:14 jgrosseo
+1) Connect and Close are called before and after each query, so one can
+keep the same AliDCSClient object.
+2) The splitting of a query is moved to GetDPValues/GetAliasValues.
+3) Splitting interval can be specified in constructor
+
Revision 1.3 2007/09/11 16:42:02 jgrosseo
starting modifying AliDCSClient to transparently switch between single and multi query
first step: same alidcsclient can be used for several queries
AliDCSClient::AliDCSClient(const char* host, Int_t port, UInt_t timeout,
Int_t retries, Int_t multiSplit):
fSocket(NULL), fHost(host), fPort(port), fTimeout(timeout), fRetries(retries), fMultiSplit(multiSplit),
- fServerErrorCode(AliDCSMessage::kNoneError), fServerError("")
+ fServerErrorCode(AliDCSMessage::kNoneError), fServerError(""), fResultErrorCode(0)
{
//
// host: DCS server host
}
//______________________________________________________________________
-Int_t AliDCSClient::ReceiveMessage(AliDCSMessage& message)
+Int_t AliDCSClient::ReceiveMessage(AliDCSMessage& message)
{
// receive message from the DCS server
return sResult;
}
- sResult = ReceiveValueSet(result);
+ Int_t receivedValues = 0;
+
+ while (1)
+ {
+ Int_t tmp = 0;
+ sResult = ReceiveValueSet(result, tmp);
+ if (sResult <= 0)
+ break;
+ receivedValues += sResult;
+ }
Close();
- return sResult;
+ return receivedValues;
}
//______________________________________________________________________
for (Int_t subsetBegin = startIndex; subsetBegin < endIndex; subsetBegin += fMultiSplit)
{
- Connect();
-
- if (!IsConnected())
+ Connect();
+
+ if (!IsConnected())
{
- AliError("Not connected!");
- delete result;
- return 0;
- }
+ AliError("Not connected!");
+ delete result;
+ fResultErrorCode = fgkBadState;
+ return 0;
+ }
Int_t subsetEnd = subsetBegin + fMultiSplit;
if (subsetEnd > endIndex)
AliDCSMessage requestMessage;
if (fMultiSplit == 1)
{
- // single dp request
-
- TObjString* aRequest = (TObjString*) list->At(subsetBegin);
- requestMessage.CreateRequestMessage(reqType, startTime, endTime, aRequest->String());
+ // single dp request
+
+ TObjString* aRequest = (TObjString*) list->At(subsetBegin);
+ requestMessage.CreateRequestMessage(reqType, startTime, endTime, aRequest->String());
}
else
{
- // multi dp request
-
- requestMessage.CreateMultiRequestMessage(reqType,
- startTime, endTime);
+ // multi dp request
+
+ requestMessage.CreateMultiRequestMessage(reqType,
+ startTime, endTime);
for (Int_t i=subsetBegin; i<subsetEnd; i++)
{
TObjString* aRequest = (TObjString*) list->At(i);
if (!requestMessage.AddRequestString(aRequest->String()))
+ {
+ delete result;
+ fResultErrorCode = fgkBadMessage;
return 0;
- }
- }
-
- Int_t sResult = 0;
- if ((sResult = SendMessage(requestMessage)) < 0)
- {
- AliError(Form("Can't send request message! Reason: %s",
- GetErrorString(sResult)));
- Close();
- delete result;
- return 0;
+ }
+ }
+ }
+
+ if ((fResultErrorCode = SendMessage(requestMessage)) < 0)
+ {
+ AliError(Form("Can't send request message! Reason: %s",
+ GetErrorString(fResultErrorCode)));
+ Close();
+ delete result;
+ return 0;
}
-
- for (Int_t i=subsetBegin; i<subsetEnd; i++)
- {
- TObjString* aRequest = (TObjString*) list->At(i);
-
- TObjArray* resultSet = new TObjArray();
- resultSet->SetOwner(1);
-
- if ((sResult = ReceiveValueSet(resultSet)) < 0)
- {
- AliError(Form("Can't get values for %s!" ,
- aRequest->String().Data()));
-
- delete resultSet;
- result->DeleteValues();
- delete result;
- return 0;
- }
-
- result->Add(aRequest, resultSet);
- }
-
- Close();
-
- AliInfo(Form("Retrieved entries %d..%d (total %d..%d); E.g. %s has %d values collected",
- subsetBegin, subsetEnd, startIndex, endIndex, list->At(subsetBegin)->GetName(), ((TObjArray*)
- result->GetValue(list->At(subsetBegin)->GetName()))->GetEntriesFast()));
-
- }
- return result;
-}
-
-//______________________________________________________________________
-Int_t AliDCSClient::ReceiveValueSet(TObjArray* result)
-{
-// receive set of values
+ while (1)
+ {
+ TObjArray* resultSet = new TObjArray();
+ resultSet->SetOwner(1);
- Int_t sResult;
+ Int_t ownerIndex = -1;
+ fResultErrorCode = ReceiveValueSet(resultSet, ownerIndex);
- AliDCSMessage responseMessage;
- if ((sResult = ReceiveMessage(responseMessage)) < 0) {
- AliError(Form("Can't receive response message! Reason: %s",
- GetErrorString(sResult)));
- return sResult;
- }
+ if (fResultErrorCode < 0)
+ {
+ AliError("Can't get values");
- UInt_t valueCount;
+ delete resultSet;
+ result->DeleteValues();
+ delete result;
+ return 0;
+ }
- if (responseMessage.GetType() == AliDCSMessage::kCount) {
- valueCount = responseMessage.GetCount();
+ if (ownerIndex < 0)
+ {
+ // no more values
+ delete resultSet;
+ break;
+ }
- } else if (responseMessage.GetType() == AliDCSMessage::kError) {
- fServerErrorCode = responseMessage.GetErrorCode();
- fServerError = responseMessage.GetErrorString();
+ TObjString* aRequest = (TObjString*) list->At(ownerIndex + subsetBegin);
+ //AliInfo(Form("Received %d values for entry %d, that is %s", resultSet->GetEntries(),
+ // ownerIndex + subsetBegin, aRequest->String().Data()));
+
+ TObjArray* target = dynamic_cast<TObjArray*> (result->GetValue(aRequest));
+ if (target)
+ {
+ target->AddAll(resultSet);
+ //AliInfo(Form("Now we have %d entries", target->GetEntries()));
+ resultSet->SetOwner(0);
+ delete resultSet;
+ }
+ else
+ result->Add(aRequest, resultSet);
+ }
- return AliDCSClient::fgkServerError;
+ Close();
- } else {
- AliError("Bad message type received!");
- return AliDCSClient::fgkBadMessage;
+ Int_t nValues = 0;
+ TObjArray* example = (TObjArray*) result->GetValue(list->At(subsetBegin));
+ if (example)
+ nValues = example->GetEntries();
+ AliInfo(Form("Retrieved entries %d..%d (total %d..%d); E.g. %s has %d values collected",
+ subsetBegin, subsetEnd-1, startIndex, endIndex-1, list->At(subsetBegin)->GetName(), nValues));
}
- UInt_t receivedValues = 0;
-
- AliDCSValue::Type valueType = AliDCSValue::kInvalid;
-
- while (receivedValues < valueCount) {
+ return result;
+}
+
+//______________________________________________________________________
+Int_t AliDCSClient::ReceiveValueSet(TObjArray* result, Int_t& ownerIndex)
+{
+ // receive set of values
- AliDCSMessage message;
+ AliDCSMessage message;
+ Int_t sResult = ReceiveMessage(message);
+ if (sResult < 0)
+ {
+ AliError(Form("Can't receive message! Reason: %s", GetErrorString(sResult)));
+ return sResult;
+ }
- if ((sResult = ReceiveMessage(message)) < 0) {
- AliError(Form("Can't receive message! Reason: %s",
- GetErrorString(sResult)));
- return sResult;
- }
+ if (message.GetType() == AliDCSMessage::kResultSet)
+ {
+ // this was the last message
+ ownerIndex = message.GetOwnerIndex();
+ if (ownerIndex < 0)
+ return 0;
- if (message.GetType() == AliDCSMessage::kResultSet) {
+ sResult = message.GetValues(result);
- if (valueType == AliDCSValue::kInvalid) {
- valueType = message.GetValueType();
- } else {
- if (valueType != message.GetValueType()) {
- AliError("Unexpected value type!");
- return AliDCSClient::fgkBadMessage;
- }
- }
+ AliDCSMessage nextMessage;
+ nextMessage.CreateNextMessage();
- receivedValues += message.GetValues(result);
+ if ((fResultErrorCode = SendMessage(nextMessage)) < 0)
+ {
+ AliError(Form("Can't send next message! Reason: %s",
+ GetErrorString(fResultErrorCode)));
+ Close();
+ return AliDCSClient::fgkCommError;
+ }
- if (receivedValues > valueCount) {
- AliError("Message contains more values than expected!");
- return AliDCSClient::fgkBadMessage;
- }
+ return sResult;
+ }
+ else if (message.GetType() == AliDCSMessage::kError)
+ {
+ fServerErrorCode = message.GetErrorCode();
+ fServerError = message.GetErrorString();
- } else if (message.GetType() == AliDCSMessage::kError) {
- fServerErrorCode =
- responseMessage.GetErrorCode();
- fServerError = responseMessage.GetErrorString();
+ return AliDCSClient::fgkServerError;
+ }
- return AliDCSClient::fgkServerError;
- } else {
- AliError("Bad message type received!");
- return AliDCSClient::fgkBadMessage;
- }
- }
-
- return receivedValues;
+ AliError("Bad message type received!");
+ return AliDCSClient::fgkBadMessage;
}
-
+
//______________________________________________________________________
Int_t AliDCSClient::GetDPValues(const char* dpName, UInt_t startTime,
UInt_t endTime, TObjArray* result)