30 class FETPAPI_DLL_IMPORT_OR_EXPORT
FesapiHdfProxy :
public EML2_NS::AbstractHdfProxy
37 FesapiHdfProxy(
AbstractSession* session, COMMON_NS::DataObjectRepository * repo,
const std::string & guid,
const std::string & title,
const std::string & packageDirAbsolutePath,
const std::string & externalFilePath, COMMON_NS::DataObjectRepository::openingMode hdfPermissionAccess) :
38 EML2_NS::AbstractHdfProxy(packageDirAbsolutePath, externalFilePath, hdfPermissionAccess), session_(session), compressionLevel(0) {
39 xmlNs_ = repo->getDefaultEmlVersion() == COMMON_NS::DataObjectRepository::EnergisticsStandard::EML2_0 ?
"eml20" :
"eml23";
40 initGsoapProxy(repo, guid, title, 20);
47 EML2_NS::AbstractHdfProxy(fromGsoap), session_(session), compressionLevel(0), xmlNs_(
"eml20") {}
53 EML2_NS::AbstractHdfProxy(dor), session_(session), compressionLevel(0) {
54 std::string ct = dor.getContentType();
55 if (ct.find(
"2.0") != std::string::npos) {
58 else if (ct.find(
"2.3") != std::string::npos) {
62 throw std::invalid_argument(
"The HDF Proxy DataObjectReference does not look to be eml20 or eml23 neither : " + ct);
82 bool isOpened() const final {
return session_ !=
nullptr && !session_->isWebSocketSessionClosed(); }
92 COMMON_NS::AbstractObject::numericalDatatypeEnum getNumericalDatatype(
const std::string & groupName)
final;
113 const std::string & name,
114 COMMON_NS::AbstractObject::numericalDatatypeEnum cumulativeLengthDatatype,
115 const void * cumulativeLength,
116 uint64_t cumulativeLengthSize,
117 COMMON_NS::AbstractObject::numericalDatatypeEnum elementsDatatype,
118 const void * elements,
119 uint64_t elementsSize)
final;
131 void setCompressionLevel(
unsigned int newCompressionLevel)
final {
if (newCompressionLevel > 9) compressionLevel = 9;
else compressionLevel = newCompressionLevel; }
144 const std::string & name,
145 COMMON_NS::AbstractObject::numericalDatatypeEnum datatype,
147 const uint64_t * numValuesInEachDimension,
148 unsigned int numDimensions)
final;
160 const std::string& groupName,
161 const std::string& name,
162 COMMON_NS::AbstractObject::numericalDatatypeEnum datatype,
163 const uint64_t* numValuesInEachDimension,
164 unsigned int numDimensions)
final;
177 const std::string& groupName,
178 const std::string& name,
179 COMMON_NS::AbstractObject::numericalDatatypeEnum datatype,
181 const uint64_t* numValuesInEachDimension,
182 const uint64_t* offsetValuesInEachDimension,
183 unsigned int numDimensions)
final;
189 const std::vector<std::string>&,
190 const std::vector<std::string>&)
final {
191 throw std::logic_error(
"Group attributes are not supported in ETP1.2");
199 const std::vector<std::string>&)
final {
200 throw std::logic_error(
"Group attributes are not supported in ETP1.2");
207 const std::vector<std::string>&,
208 const std::vector<double>&) {
209 throw std::logic_error(
"Group attributes are not supported in ETP1.2");
216 const std::vector<std::string>&,
217 const std::vector<int>&)
final {
218 throw std::logic_error(
"Group attributes are not supported in ETP1.2");
225 const std::vector<std::string>&,
226 const std::vector<std::string>&)
final {
227 throw std::logic_error(
"Dataset attributes are not supported in ETP1.2");
235 const std::vector<std::string>&)
final {
236 throw std::logic_error(
"Dataset attributes are not supported in ETP1.2");
243 const std::vector<std::string>&,
244 const std::vector<double>&)
final {
245 throw std::logic_error(
"Dataset attributes are not supported in ETP1.2");
252 const std::vector<std::string>&,
253 const std::vector<int>&)
final {
254 throw std::logic_error(
"Dataset attributes are not supported in ETP1.2");
257 std::string readStringAttribute(
const std::string&,
258 const std::string&)
const final {
259 throw std::logic_error(
"Attributes are not supported in ETP1.2");
262 std::vector<std::string> readStringArrayAttribute(
const std::string&,
263 const std::string&)
const final {
264 throw std::logic_error(
"Attributes are not supported in ETP1.2");
267 double readDoubleAttribute(
const std::string&,
268 const std::string&)
const final {
269 throw std::logic_error(
"Attributes are not supported in ETP1.2");
272 int64_t readInt64Attribute(
const std::string&,
273 const std::string&)
const final {
274 throw std::logic_error(
"Attributes are not supported in ETP1.2");
293 const std::string & datasetName,
295 uint64_t
const * numValuesInEachDimension,
296 uint64_t
const * offsetInEachDimension,
297 unsigned int numDimensions)
final;
310 const std::string & datasetName,
double* values,
311 uint64_t
const * blockCountPerDimension,
312 uint64_t
const * offsetInEachDimension,
313 uint64_t
const * strideInEachDimension,
314 uint64_t
const * blockSizeInEachDimension,
315 unsigned int numDimensions)
final;
317 void selectArrayNdOfValues(
318 const std::string & datasetName,
319 uint64_t
const * blockCountPerDimension,
320 uint64_t
const * offsetInEachDimension,
321 uint64_t
const * strideInEachDimension,
322 uint64_t
const * blockSizeInEachDimension,
323 unsigned int numDimensions,
325 hdf5_hid_t & dataset,
326 hdf5_hid_t & filespace)
final;
337 hdf5_hid_t filespace,
339 uint64_t slabSize)
final;
357 const std::string & datasetName,
359 uint64_t
const * numValuesInEachDimension,
360 uint64_t
const * offsetInEachDimension,
361 unsigned int numDimensions)
final;
368 void readArrayNdOfInt64Values(
const std::string & datasetName, int64_t* values)
final { readArrayNdOfValues(datasetName, values); }
379 const std::string & datasetName,
381 uint64_t
const * numValuesInEachDimension,
382 uint64_t
const * offsetInEachDimension,
383 unsigned int numDimensions)
final;
397 void readArrayNdOfIntValues(
const std::string & datasetName,
int* values)
final { readArrayNdOfValues(datasetName, values); }
408 const std::string & datasetName,
410 uint64_t
const * numValuesInEachDimension,
411 uint64_t
const * offsetInEachDimension,
412 unsigned int numDimensions
420 void readArrayNdOfUIntValues(
const std::string & datasetName,
unsigned int* values)
final { readArrayNdOfValues(datasetName, values); }
435 void readArrayNdOfUShortValues(
const std::string & datasetName,
unsigned short* values)
final { readArrayNdOfValues(datasetName, values); }
442 void readArrayNdOfInt8Values(
const std::string & datasetName, int8_t* values)
final { readArrayNdOfValues(datasetName, values); }
448 void readArrayNdOfUInt8Values(
const std::string & datasetName, uint8_t* values)
final { readArrayNdOfValues(datasetName, values); }
453 bool exist(
const std::string & absolutePathInHdfFile)
const final;
475 unsigned int compressionLevel;
477 size_t maxArraySize_{ 12000000 };
485 template<
typename T>
void readArrayNdOfValues(
const std::string & datasetName, T* values)
488 std::vector<uint64_t> dimensions;
491 size_t valueCount = 1;
492 for (int64_t dim : daMetadata.dimensions) {
496 size_t valueSize = 1;
497 switch (daMetadata.transportArrayType) {
498 case Energistics::Etp::v12::Datatypes::AnyArrayType::bytes:
499 case Energistics::Etp::v12::Datatypes::AnyArrayType::arrayOfBoolean:
break;
500 case Energistics::Etp::v12::Datatypes::AnyArrayType::arrayOfInt: valueSize = 6;
break;
501 case Energistics::Etp::v12::Datatypes::AnyArrayType::arrayOfFloat: valueSize = 4;
break;
502 case Energistics::Etp::v12::Datatypes::AnyArrayType::arrayOfLong: valueSize = 10;
break;
503 case Energistics::Etp::v12::Datatypes::AnyArrayType::arrayOfDouble: valueSize = 8;
break;
504 default:
throw std::logic_error(
"Array of strings are not implemented yet");
506 size_t wholeSize = valueCount * valueSize;
509 const size_t maxAllowedDataArraySize = session_->getMaxWebSocketMessagePayloadSize()
511 - (daMetadata.dimensions.size() * 2 + 1) * 8;
514 auto specializedHandler = std::make_shared<GetFullDataArrayHandlers<T>>(session_, values);
515 if (wholeSize + (valueCount + 1) * 8 <= maxAllowedDataArraySize) {
517 const int64_t msgId = session_->sendWithSpecificHandler(
518 buildGetDataArraysMessage(datasetName),
523 while (session_->isMessageStillProcessing(msgId)) {}
527 std::vector<int64_t> counts(daMetadata.dimensions.size(), 1);
530 size_t subArrayValueCount = 1;
531 for (int64_t dimIndex = daMetadata.dimensions.size() - 1; dimIndex >= 0; --dimIndex) {
532 int64_t maxCountOnDim = daMetadata.preferredSubarrayDimensions.empty()
533 ? daMetadata.dimensions[dimIndex]
534 : daMetadata.preferredSubarrayDimensions[dimIndex];
535 subArrayValueCount *= maxCountOnDim;
536 int64_t allowedCountOnDim = maxCountOnDim;
537 while (subArrayValueCount * valueSize + (subArrayValueCount + 1) * 8 > maxAllowedDataArraySize) {
538 subArrayValueCount /= allowedCountOnDim;
539 allowedCountOnDim /= 2;
540 subArrayValueCount *= allowedCountOnDim;
542 counts[dimIndex] = allowedCountOnDim;
543 if (allowedCountOnDim != maxCountOnDim) {
550 size_t subArrayIndex = 0;
551 std::vector<int64_t> starts(daMetadata.dimensions.size(), 0);
552 std::vector<int64_t> currentCounts = counts;
553 bool hasParsedAllArray =
false;
554 while (!hasParsedAllArray) {
555 std::string subArrayIndexStr = std::to_string(subArrayIndex);
556 msg.dataSubarrays[subArrayIndexStr].uid = buildDataArrayIdentifier(datasetName);
557 msg.dataSubarrays[subArrayIndexStr].counts = currentCounts;
558 msg.dataSubarrays[subArrayIndexStr].starts = starts;
562 hasParsedAllArray =
true;
563 for (int64_t dimIndex = daMetadata.dimensions.size() - 1; dimIndex >= 0; --dimIndex) {
564 if (starts[dimIndex] + currentCounts[dimIndex] < daMetadata.dimensions[dimIndex]) {
565 starts[dimIndex] += currentCounts[dimIndex];
566 if (starts[dimIndex] + currentCounts[dimIndex] > daMetadata.dimensions[dimIndex]) {
567 currentCounts[dimIndex] = daMetadata.dimensions[dimIndex] - starts[dimIndex];
570 for (
size_t dimIndex2 = dimIndex + 1; dimIndex2 < daMetadata.dimensions.size(); ++dimIndex2) {
571 starts[dimIndex2] = 0;
572 currentCounts[dimIndex2] = counts[dimIndex2];
574 hasParsedAllArray =
false;
579 specializedHandler->setDataSubarrays(subArrayIndexStr, msg.dataSubarrays[subArrayIndexStr]);
583 const int64_t msgId = session_->sendWithSpecificHandler(
589 while (session_->isMessageStillProcessing(msgId)) {}