What is the difference between "MAXSTRING" and "STRINGSTACK" error?
Hello,
We have recently received the two following errors as part of a PDF extraction process and I am trying to figure what the difference is between the two errors?
1. ERROR <Ens>ErrException: <MAXSTRING>zGetReferralDocFromStream+30^UCLH.SIP.Operation.PBT.HTTP.V1.RefDocRequest.1 -- logged as '-' number - @' set file=object.%Get(i).file'
2. ERROR <Ens>ErrException: <STRINGSTACK>zGetReferralDocFromStream+30^UCLH.SIP.Operation.PBT.HTTP.V1.RefDocRequest.1 -- logged as '-' number - @' set file=object.%Get(i).file'
Can someone please explain what the difference is?
Thanks!
From the docs:
MAXSTRING is always related to maximum length of 3,641,144 characters for one string (assuming long strings are enabled). STRINGSTACK can be raised in several different circumstances, including a lot of small strings, recursion and so on.
Increasing bbsiz may help avoid STRINGSTACK error, but not MAXSTRING.
In your case use streams by replacing:
set file=object.%Get(i).file
with:
set file=object.%Get(i).%Get("file",,"stream")
Great reply, Eduard, very thorough!
Eduard, can't the MAXSTRING one also mean that you've exceeded a specified MAXLEN parameter on a string? Like if I have a Property LastName As %String (MAXLEN = 30) and you try to save the object with a 50 character last name, doesn't that also give a "MAXSTRING" error?
No. %Save never throws an exception, just returns a %Status variable. In your scenario it would return an error indicating validation failure on LastName.
Class User.Person Extends %Persistent { Property LastName As %String(MAXLEN = 30); /// do ##class(User.Person).Test() ClassMethod Test() { set obj = ..%New() set obj.LastName = $j("", 50) set sc = obj.%Save() w $System.Status.GetErrorText(sc) } }
ERROR #7201: Datatype value ' ' length longer than MAXLEN allowed of 30 > ERROR #5802: Datatype validation failed on property 'User.Person:LastName', with value equal to " "