Question
Mathieu Van Sevenant · May 18

Error <MAXSTRING> (Stream to %xsd.base64Binary)

Hello everyone :-) A colleague wants to use data got from a stream into another type of object: %xsd.base64Binary (related to a webservice context).
His code works for regular data, but the following error appears when parsing large streams (~43 MB): "ERREUR #5002: Erreur Cache:    <MAXSTRING>"

Here is below his code:

Class (...).StampDataRequest Extends Ens.Request [ ProcedureBlock ]
{

Property DocumentData As %xsd.base64Binary;

}

Method OnRequest(pRequest As Ens.StreamContainer, Output pResponse As Ens.Response) As %Status
{              
       ...

       set fileStream = ##class(%Stream.GlobalCharacter).%New()

do fileStream.CopyFromAndSave(pRequest.Stream)

//fileStream contains bytes from pRequest
            
set tsRequest = ##class((...).StampDataRequest).%New()

       do fileStream.Rewind()
       while 'fileStream.AtEnd 
                   set tsRequest.DocumentData = tsRequest.DocumentData_fileStream.Read(30000)
        }
        …

}


What should he change in this code for not to have this size limitation ?

Best regards,

Mathieu

Product version: HealthShare 2017.2
$ZV: Cache for Windows (x86-64) 2018.1.4 (Build 505_1U) Thu May 28 2020 10:01:40 EDT
00
1 0 9 158
Log in or sign up to continue

Hi

Your request class tsRequest has a property DocumentData which I assume has a data type of %String. There is one thing you need to check and to things you can do in the request class:

1) Make sure that the setting for "Support Long Strings" setting in your Cache Instance is set to true. The setting can be found in the Management Portal at System Administration > Configuration > System Configuration > Memory and Startup
 

2) in the class definition for your request class use the following definition for your DocumentData specify the definition as follows:

Property DocumentData as %String(MAXLEN="", TRUNCATE);

Turning on Long Srinngs enables you to store up to 3,641,144 characters.

The Attribute MAXLEN="" says the Maximum Length of the property is the maximum string length supported i.e. 3,641,144 characters. 

The TRUNCATE attribute will chop off any characters that exceed the MAXLEN without throwing a MAXSTRING error

Nigel

In his class definition, DocumentData is a %xsd.base64Binary, not a string.

Replace:

do fileStream.Rewind()
while 'fileStream.AtEnd {
           set tsRequest.DocumentData = tsRequest.DocumentData_fileStream.Read(30000)
}

with

do tsRequest.DocumentData.CopyFrom(fileStream)

or even:

do tsRequest.DocumentData.CopyFrom(pRequest.Stream)

Hi,

This line :      

"do tsRequest.DocumentData.CopyFrom(fileStream)" don't work.

Error:

ERREUR #5002: Erreur Cache: <INVALID OREF>


tsRequest.DocumentData not recognized as a Stream !!! (In his class definition, DocumentData is a %xsd.base64Binary)

Thanks

Phil.


 

%xsd.base64Binary is essentially a string so you can't write more than 3,5 mb there.

Change property definition to %Stream.GlobalCharacter instead.

if i change property in the client webservice class, will the external webservice called still work ?

Thanks  

Hello,

In the client classes of the external  webservice, i  changed for the "DocumentData" property, in several places, ,"%xsd.base64Binary" to "%Stream.GlobalCharacter". I recompiled the classes.

After this, in the "Ensemble" connector, i had to do the conversion to Base64 imyself.

Indeed, with "%xsd.base64Binary" the conversion to base64 was done automatically during the transfer.

Now, in my example, fileStream is a base64 stream, and here's how my "DocumentData" property is assigned:

do tsRequest.DocumentData.CopyFrom (fileStream)

I tested and the return from the remote webservice is correct with the same hashing values.

Thank you very much for your help.