]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - SHUTTLE/DCSClient/AliDCSClient.cxx
Bugfix (Gustavo)
[u/mrichter/AliRoot.git] / SHUTTLE / DCSClient / AliDCSClient.cxx
index 80ea035b4fabafd9f7e91bdfc840a81603167910..f0903e532a71f23662aaa9715ab05c94452bbff6 100644 (file)
 
 /*
 $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
@@ -102,7 +115,7 @@ const char* AliDCSClient::fgkServerErrorString = "ServerError";
 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
@@ -250,7 +263,7 @@ Int_t AliDCSClient::SendMessage(AliDCSMessage& message)
 }
 
 //______________________________________________________________________
-Int_t AliDCSClient::ReceiveMessage(AliDCSMessage& message) 
+Int_t AliDCSClient::ReceiveMessage(AliDCSMessage& message)
 {
 // receive message from the DCS server
        
@@ -312,11 +325,20 @@ Int_t AliDCSClient::GetValues(AliDCSMessage::RequestType reqType,
                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;
 }
 
 //______________________________________________________________________
@@ -338,14 +360,15 @@ TMap* AliDCSClient::GetValues(AliDCSMessage::RequestType reqType,
 
        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)
@@ -354,145 +377,140 @@ TMap* AliDCSClient::GetValues(AliDCSMessage::RequestType reqType,
                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)