/*
$Log$
+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.
}
//______________________________________________________________________
-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;
+ AliError("Not connected!");
+ delete result;
fResultErrorCode = fgkBadState;
- return 0;
- }
+ 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++)
{
fResultErrorCode = fgkBadMessage;
return 0;
}
- }
- }
-
- if ((fResultErrorCode = SendMessage(requestMessage)) < 0)
- {
- AliError(Form("Can't send request message! Reason: %s",
- GetErrorString(fResultErrorCode)));
- 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();
+
+ while (1)
+ {
+ TObjArray* resultSet = new TObjArray();
resultSet->SetOwner(1);
-
- if ((fResultErrorCode = 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
+ Int_t ownerIndex = -1;
+ fResultErrorCode = ReceiveValueSet(resultSet, ownerIndex);
- Int_t sResult;
+ if (fResultErrorCode < 0)
+ {
+ AliError("Can't get values");
- AliDCSMessage responseMessage;
- if ((sResult = ReceiveMessage(responseMessage)) < 0) {
- AliError(Form("Can't receive response message! Reason: %s",
- GetErrorString(sResult)));
- return sResult;
- }
+ delete resultSet;
+ result->DeleteValues();
+ delete result;
+ return 0;
+ }
- UInt_t valueCount;
+ if (ownerIndex < 0)
+ {
+ // no more values
+ delete resultSet;
+ break;
+ }
- if (responseMessage.GetType() == AliDCSMessage::kCount) {
- valueCount = responseMessage.GetCount();
+ 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);
+ }
- } else if (responseMessage.GetType() == AliDCSMessage::kError) {
- fServerErrorCode = responseMessage.GetErrorCode();
- fServerError = responseMessage.GetErrorString();
+ Close();
- return AliDCSClient::fgkServerError;
+ 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(), ((TObjArray*)
+ result->GetValue(list->At(subsetBegin)->GetName()))->GetEntriesFast()));
- } else {
- AliError("Bad message type received!");
- return AliDCSClient::fgkBadMessage;
}
- 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)
/*
$Log$
+Revision 1.1 2006/11/06 14:22:47 jgrosseo
+major update (Alberto)
+o) reading of run parameters from the logbook
+o) online offline naming conversion
+o) standalone DCSclient package
+
Revision 1.7 2006/10/02 16:38:39 jgrosseo
update (alberto):
fixed memory leaks
TObject(), fMessage(NULL), fMessageSize(0), fType(kInvalid),
fRequestType(kNoneType), fStartTime(0), fEndTime(0),
fRequestString(""), fCount(0),
- fValueType(AliDCSValue::kInvalid), fValues(),
+ fOwnerIndex(0), fValueType(AliDCSValue::kInvalid), fValues(),
fErrorCode(kNoneError), fErrorString(""),
fRequestStrings()
{
TObject(), fMessage(NULL), fMessageSize(size), fType(kInvalid),
fRequestType(kNoneType), fStartTime(0), fEndTime(0),
fRequestString(""), fCount(0),
- fValueType(AliDCSValue::kInvalid), fValues(),
+ fOwnerIndex(0), fValueType(AliDCSValue::kInvalid), fValues(),
fErrorCode(kNoneError), fErrorString(""),
fRequestStrings()
{
TObject(), fMessage(NULL), fMessageSize(0), fType(kInvalid),
fRequestType(kNoneType), fStartTime(0), fEndTime(0),
fRequestString(""), fCount(0),
- fValueType(AliDCSValue::kInvalid), fValues(),
+ fOwnerIndex(0), fValueType(AliDCSValue::kInvalid), fValues(),
fErrorCode(kNoneError), fErrorString(""),
fRequestStrings()
{
fErrorString = errorString;
}
-/*
+
void AliDCSMessage::CreateNextMessage() {
DestroyMessage();
fType = AliDCSMessage::kNext;
-} */
+}
//______________________________________________________________________
void AliDCSMessage::DestroyMessage()
}
//______________________________________________________________________
-UChar_t AliDCSMessage::GetUByte(const char* buf)
+UChar_t AliDCSMessage::GetUByte(const char* buf)
{
// get ubyte value from buf
}
//______________________________________________________________________
-void AliDCSMessage::StoreHeader()
+void AliDCSMessage::StoreHeader()
{
// store header message
SetUByte(fMessage + ID_OFFSET, 'A');
SetUByte(fMessage + ID_OFFSET + 1, 'D');
- SetUByte(fMessage + VERSION_OFFSET, 1);
+ SetUByte(fMessage + VERSION_OFFSET, 2);
SetUByte(fMessage + TYPE_OFFSET, fType);
}
//______________________________________________________________________
-void AliDCSMessage::StoreRequestMessage()
+void AliDCSMessage::StoreRequestMessage()
{
// store request message
}
//______________________________________________________________________
-void AliDCSMessage::StoreMultiRequestMessage()
+void AliDCSMessage::StoreMultiRequestMessage()
{
// store multi request message
TObjString* anObjString;
while ((anObjString = (TObjString*) iter.Next())) {
- assert(anObjString->String().Length() <= 255);
requestDataSize += anObjString->String().Length() + 1;
}
while ((anObjString = (TObjString*) iter.Next())) {
UChar_t strLength = anObjString->String().Length();
- SetUByte(fMessage + cursor, strLength);
- cursor += 1;
- strncpy(fMessage + cursor, anObjString->String().Data(),
+ strncpy(fMessage + cursor, anObjString->String().Data(),
strLength);
cursor += strLength;
+ SetUByte(fMessage + cursor, 0);
+ cursor += 1;
}
}
//______________________________________________________________________
-/*
-void AliDCSMessage::StoreNextMessage() {
-
+void AliDCSMessage::StoreNextMessage()
+{
fMessageSize = HEADER_SIZE;
fMessage = new char[fMessageSize];
- StoreHeader();
-} */
+ StoreHeader();
+}
//______________________________________________________________________
-Bool_t AliDCSMessage::ValidateHeader(const char* buf)
+Bool_t AliDCSMessage::ValidateHeader(const char* buf)
{
// validate message header
return kFALSE;
}
- if (buf[VERSION_OFFSET] != 1) {
+ if (buf[VERSION_OFFSET] != 2) {
AliError("Bad message version!");
return kFALSE;
}
return;
}
+ fOwnerIndex = GetInt(fMessage + INDEX_OFFSET);
+
fValueType = (AliDCSValue::Type) GetUByte(fMessage + SVT_OFFSET);
UInt_t count = GetUInt(fMessage + VALUE_COUNT_OFFSET);
UInt_t cursor = VALUES_OFFSET;
- if (fValueType == AliDCSValue::kBool) {
- if (VALUES_OFFSET + count + count * sizeof(UInt_t) >
- fMessageSize) {
- AliError("Too many bool values for this buffer size!");
- return;
- }
-
- for (UInt_t k = 0; k < count; k ++) {
- Bool_t aBool = GetBool(fMessage + cursor);
- cursor += 1;
- UInt_t timeStamp = GetUInt(fMessage + cursor);
- cursor += sizeof(UInt_t);
- fValues->Add(new AliDCSValue(aBool, timeStamp));
- }
- } else if (fValueType == AliDCSValue::kChar) {
- if (VALUES_OFFSET + count + count * sizeof(UInt_t) >
- fMessageSize) {
- AliError("Too many byte values for this buffer size!");
- return;
- }
-
- for (UInt_t k = 0; k < count; k ++) {
- Char_t aByte = GetByte(fMessage + cursor);
- cursor += sizeof(Char_t);
- UInt_t timeStamp = GetUInt(fMessage + cursor);
- cursor += sizeof(UInt_t);
- fValues->Add(new AliDCSValue(aByte, timeStamp));
- }
- } else if (fValueType == AliDCSValue::kInt) {
- if (VALUES_OFFSET + count * sizeof(Int_t) +
- count * sizeof(UInt_t) > fMessageSize) {
- AliError("Too many int values for this buffer size!");
- return;
- }
-
- for (UInt_t k = 0; k < count; k ++) {
- Int_t aInt = GetInt(fMessage + cursor);
- cursor += sizeof(Int_t);
- UInt_t timeStamp = GetUInt(fMessage + cursor);
- cursor += sizeof(UInt_t);
- fValues->Add(new AliDCSValue(aInt, timeStamp));
- }
-
- } else if (fValueType == AliDCSValue::kUInt) {
- if (VALUES_OFFSET + count * sizeof(UInt_t) +
- count * sizeof(UInt_t) > fMessageSize) {
- AliError("Too many uint values for this buffer size!");
- return;
- }
-
- for (UInt_t k = 0; k < count; k ++) {
- UInt_t aUInt = GetUInt(fMessage + cursor);
- cursor += sizeof(UInt_t);
- UInt_t timeStamp = GetUInt(fMessage + cursor);
- cursor += sizeof(UInt_t);
- fValues->Add(new AliDCSValue(aUInt, timeStamp));
- }
- } else if (fValueType == AliDCSValue::kFloat) {
- if (VALUES_OFFSET + count * sizeof(Float_t) +
- count * sizeof(UInt_t) > fMessageSize) {
- AliError("Too many float values for this buffer size!");
- return;
- }
-
- for (UInt_t k = 0; k < count; k ++) {
- Float_t aFloat = GetFloat(fMessage + cursor);
- cursor += sizeof(Float_t);
- UInt_t timeStamp = GetUInt(fMessage + cursor);
- cursor += sizeof(UInt_t);
- fValues->Add(new AliDCSValue(aFloat, timeStamp));
+ // -1 end of results
+ if (fOwnerIndex >= 0)
+ {
+ if (fValueType == AliDCSValue::kBool) {
+ if (VALUES_OFFSET + count + count * sizeof(UInt_t) >
+ fMessageSize) {
+ AliError("Too many bool values for this buffer size!");
+ return;
+ }
+
+ for (UInt_t k = 0; k < count; k ++) {
+ Bool_t aBool = GetBool(fMessage + cursor);
+ cursor += 1;
+ UInt_t timeStamp = GetUInt(fMessage + cursor);
+ cursor += sizeof(UInt_t);
+ fValues->Add(new AliDCSValue(aBool, timeStamp));
+ }
+ } else if (fValueType == AliDCSValue::kChar) {
+ if (VALUES_OFFSET + count + count * sizeof(UInt_t) >
+ fMessageSize) {
+ AliError("Too many byte values for this buffer size!");
+ return;
+ }
+
+ for (UInt_t k = 0; k < count; k ++) {
+ Char_t aByte = GetByte(fMessage + cursor);
+ cursor += sizeof(Char_t);
+ UInt_t timeStamp = GetUInt(fMessage + cursor);
+ cursor += sizeof(UInt_t);
+ fValues->Add(new AliDCSValue(aByte, timeStamp));
+ }
+ } else if (fValueType == AliDCSValue::kInt) {
+ if (VALUES_OFFSET + count * sizeof(Int_t) +
+ count * sizeof(UInt_t) > fMessageSize) {
+ AliError("Too many int values for this buffer size!");
+ return;
+ }
+
+ for (UInt_t k = 0; k < count; k ++) {
+ Int_t aInt = GetInt(fMessage + cursor);
+ cursor += sizeof(Int_t);
+ UInt_t timeStamp = GetUInt(fMessage + cursor);
+ cursor += sizeof(UInt_t);
+ fValues->Add(new AliDCSValue(aInt, timeStamp));
+ }
+
+ } else if (fValueType == AliDCSValue::kUInt) {
+ if (VALUES_OFFSET + count * sizeof(UInt_t) +
+ count * sizeof(UInt_t) > fMessageSize) {
+ AliError("Too many uint values for this buffer size!");
+ return;
+ }
+
+ for (UInt_t k = 0; k < count; k ++) {
+ UInt_t aUInt = GetUInt(fMessage + cursor);
+ cursor += sizeof(UInt_t);
+ UInt_t timeStamp = GetUInt(fMessage + cursor);
+ cursor += sizeof(UInt_t);
+ fValues->Add(new AliDCSValue(aUInt, timeStamp));
+ }
+ } else if (fValueType == AliDCSValue::kFloat) {
+ if (VALUES_OFFSET + count * sizeof(Float_t) +
+ count * sizeof(UInt_t) > fMessageSize) {
+ AliError("Too many float values for this buffer size!");
+ return;
+ }
+
+ for (UInt_t k = 0; k < count; k ++) {
+ Float_t aFloat = GetFloat(fMessage + cursor);
+ cursor += sizeof(Float_t);
+ UInt_t timeStamp = GetUInt(fMessage + cursor);
+ cursor += sizeof(UInt_t);
+ fValues->Add(new AliDCSValue(aFloat, timeStamp));
+ }
+
+ } else {
+ AliError("Unknown or invalid value type!");
}
-
- } else {
- AliError("Unknown or invalid value type!");
}
fType = kResultSet;
}
//______________________________________________________________________
-/*
-void AliDCSMessage::LoadNextMessage() {
-
+void AliDCSMessage::LoadNextMessage()
+{
+ //
+
fType = kNext;
-} */
+}
//______________________________________________________________________
void AliDCSMessage::StoreToBuffer()
case kMultiRequest:
StoreMultiRequestMessage();
break;
-/* case kNext:
+ case kNext:
StoreNextMessage();
- break; */
+ break;
default:
AliError("Can't store to buffer invalid message!");
}
case kMultiRequest:
LoadMultiRequestMessage();
break;
-/* case kNext:
+ case kNext:
LoadNextMessage();
- break; */
+ break;
default:
AliError("Invalid message type!");
}
//______________________________________________________________________
-void AliDCSMessage::Print(Option_t* /*option*/) const
+void AliDCSMessage::Print(Option_t* /*option*/) const
{
// print message
case kResultSet: {
printString += "ResultSet\n";
+ printString += " OwnerIndex: ";
+ printString += fOwnerIndex;
+ printString += '\n';
printString += " SimpleValueType: ";
printString += fValueType;
printString += '\n';
break;
}
-/* case kNext: {
+ case kNext: {
printString += "Next\n";
break;
- } */
+ }
default:
printString += "Invalid\n";
#define COUNT_OFFSET HEADER_SIZE
-#define SVT_OFFSET HEADER_SIZE
-#define VALUE_COUNT_OFFSET (HEADER_SIZE + 1)
-#define VALUES_OFFSET (HEADER_SIZE + 5)
+#define INDEX_OFFSET HEADER_SIZE
+#define SVT_OFFSET (INDEX_OFFSET + 4)
+#define VALUE_COUNT_OFFSET (SVT_OFFSET + 1)
+#define VALUES_OFFSET (VALUE_COUNT_OFFSET + 4)
#define ERROR_CODE_OFFSET HEADER_SIZE
#define ERROR_STRING_OFFSET (HEADER_SIZE + 1)
kCount = 2,
kResultSet = 3,
kError = 4,
- kMultiRequest = 5
-// kNext = 6
+ kMultiRequest = 5,
+ kNext = 6
};
enum RequestType {
};
- AliDCSMessage();
+ AliDCSMessage();
AliDCSMessage(const char* buffer, UInt_t size);
-
virtual ~AliDCSMessage();
-
- void CreateRequestMessage(RequestType type,
+ void CreateRequestMessage(RequestType type,
UInt_t startTime, UInt_t endTime, const char* request);
- void CreateMultiRequestMessage(RequestType type,
+ void CreateMultiRequestMessage(RequestType type,
UInt_t startTime, UInt_t endTime);
void CreateCountMessage(UInt_t count);
-
void CreateResultSetMessage(AliDCSValue::Type type);
-
void CreateErrorMessage(ErrorCode code, const char* errorString);
-
- //void CreateNextMessage();
+
+ void CreateNextMessage();
void DestroyMessage();
// ResultSetType Message getters ans setters
AliDCSValue::Type GetValueType() const;
- UInt_t GetValueCount() const;
+ Int_t GetOwnerIndex() const { return fOwnerIndex; }
+
+ UInt_t GetValueCount() const;
UInt_t GetValues(TObjArray* result) const;
private:
AliDCSMessage(const AliDCSMessage& other);
- AliDCSMessage& operator= (const AliDCSMessage& other);
+ AliDCSMessage& operator= (const AliDCSMessage& other);
char* fMessage; // Array of bytes building the message
UInt_t fCount; // count counter
//ResultSet message fields
+ Int_t fOwnerIndex; // owner index of this result
AliDCSValue::Type fValueType; // Simple value type
TObjArray* fValues; // array of received values
void StoreMultiRequestMessage();
- //void StoreNextMessage();
+ void StoreNextMessage();
Bool_t ValidateHeader(const char* buf);
void LoadMultiRequestMessage();
- //void LoadNextMessage();
+ void LoadNextMessage();
// Buffer helpers
static void SetBool(char* buf, Bool_t val);