I think the function you might be looking for may be:

W $SYSTEM.Mirror.GetMemberType()

The return values are: Indeterminate, Not Member, Failover, Async, Disaster Recovery, Read-Only Reporting or Read-Write Reporting.

You can also get a lot more info than just if it's a primary or not from:

W $SYSTEM.Mirror.GetStatus()

Hope this helps!

Would this section of documentation help with your situation?

https://docs.intersystems.com/latest/csp/docbook/DocBook.UI.Page.cls?KEY=GJSON_create#GJSON_create_serialize_streams

(I'm aware this is from the latest documentation online, but I did confirm that this section also exists in my HealthShare 2017.2 version as well.)

That section appears to basically describe how to save the JSON to a temporary file on the filesystem, then re-open the file as an Object and access the key successfully without hitting <MAXSTRING>. Yes, I'm aware that does cause extra storage I/O, so for busy servers this could have a negative impact on I/O performance.

It looks like they also offer a possible solution changing the JSON entity to a %Stream.GlobalCharacter which can handle strings much larger than <MAXSTRING> which may help with not adding nearly so much storage I/O as the solution in the previous paragraph.

Hope this helps!

43, if you have to read in the variable. -4 if it's assumed to already be there. +4 if you need to see a carriage return between the input and the output:

R Z F I=1:1:$L(Z) S J=$E(Z,I) F K=1:1:J W J

Here's the '-4' code if you assume the Z variable has the initial integers:

F I=1:1:$L(Z) S J=$E(Z,I) F K=1:1:J W J

And, here's the +4 code to add the carriage return between input & output:

R Z W ! F I=1:1:$L(Z) S J=$E(Z,I) F K=1:1:J W J

Enjoy!

[edited to add other cases.]

Brandon,

All may not be lost; you may just need a different (smaller) FOIA database. Indian Health Service uses an offshoot of the VA's VistA Database which IHS calls RPMS (Resource and Patient Management System). As IHS is a government entity, they also have to release a FOIA version of their database, and last I checked it's around 4G, which should allow you to run it under the free release of IRIS.

I will warn you - a lot of the menus will look different and there's a lot of added / modified functionality due to the database customization to bring it inline for the needs of the Native American population, but the core is still VistA and can still be used free as a learning tool.

To download it, go here: https://www.ihs.gov/rpms/applications/ftp/

and click on the FOIA link to see the .zip downloads. The most recent version was released on 03 March 2021. Oh, and for some reason, Firefox on Linux tries to download the .zip as a .pdf, so either use Chrome or download it and manually change the extension back to .zip to extract the database.

Hope this helps!

The 31-character limitation is there in 2018 (I'm using 2017 for this demonstration) - although anything longer doesn't technically error out, only the first 31 characters are recognized.

A quick demo I pulled from a test server:

NAME>s ^HH.LookupLabResultsToPhysiciansD(0)="fluffy"
 
NAME>zw ^HH.LookupLabResultsToPhysiciansD
^HH.LookupLabResultsToPhysicians(0)="fluffy"
 
NAME>s ^HH.LookupLabResultsToPhysiciansDoTryToDemonstrateLongGlobalNames(0)="More Fluffy"
 
NAME>zw ^HH.LookupLabResultsToPhysiciansDoNoFluffy
^HH.LookupLabResultsToPhysicians(0)="More Fluffy"

I underlined the characters that are 'ignored' - you can see on the ZWRITE command that the last 'D' (or anything after it) isn't displayed, and you can type all sorts of characters after that final 'D' and it still changes the 'base' 31-character global.

InterSystems probably put that check in because folks were using longer global names thinking all of the characters were significant, but some data was getting changed inadvertently.

Does that help?

Give the ^rINDEX global a look.

I made a QTEST routine in Studio, and saved it but did not compile it.

QTEST ; JUST A TEST.
 Q
EN ; JUST A TEST.
 Q
 ;

and then I executed this at the programmer prompt:

ZW ^rINDEX("QTEST")
^rINDEX("QTEST","INT")=$lb("2021-08-06 13:21:58.061867",49)

I changed the routine a bit:

QTEST ; JUST A BIGGER TEST.
 Q
EN ; JUST A BIGGER TEST.
 Q
 ;

and I ZW'd the global again:

ZW ^rINDEX("QTEST")
^rINDEX("QTEST","INT")=$lb("2021-08-06 13:24:50.38743",63)

It may be safe to assume that the underlined parameter is the length or number of bytes of storage required.

Now once I compile the routine in Studio, and ZW the global again, this is the output:

ZW ^rINDEX("QTEST")
^rINDEX("QTEST","INT")=$lb("2021-08-06 13:24:50.38743",63)
^rINDEX("QTEST","OBJ")=$lb("2021-08-06 13:26:30",152)

Hope this helps!

Yes, you can!

Access your XML file as a binary stream, then you can use the LoadStream command to load & compile the stream.

STREAM=##class(%Stream.FileBinary).%New()
 STFILE=STREAM.LinkToFile("c:\where\is\your\file.xml")
 STREAM.Rewind()
 ; test loading the stream, doesn't actually create it yet. The last '1' parameter means test & report.
 $System.OBJ.LoadStream(STREAM,"ckfsbry/lock=0",.ERR,.LOADED,1)
 ; You can check the ERR variable to see if it errors out with no changes to the system. Assuming none, rewind & load it "for real"
 STREAM.Rewind()
 $System.OBJ.LoadStream(STREAM,"ckfsbry/lock=0",.ERR,.LOADED)

I haven't tested this in this manner, as I actually have the XML Base-64 encoded in a global... but hopefully this should get you started. PM me if you'd like to see my full code; it's too long to add here.

I'll leave the scheduling part as an exercise to the reader. :-)

Hope this helps!

I'm not sure if I understand your first question - if you're asking if there's a single "$command" that will just give you a length of a subscript? I don't think so, as you can have multiple subscripts, and I don't think there'd be a command that would let you pick which one you wanted output. However, if you're asking can you get a length of a subscript in a single line of code, then you certainly can - M is quite powerful with what you can do at the command prompt without utilizing Studio/Atelier. Imagine you have these globals:

 S ^ZTEST("ME")=1
 S ^ZTEST("YOU")=2
 S ^ZTEST("THEM")=3
 S ^ZTEST("OTHERS")=4

If you run this one line:

S I="" F  S I=$O(^ZTEST(I)) Q:I=""  W "SUB: "_I_" WITH LENGTH OF: "_$L(I),!

you'll get the output of each of the subscripts and the length of each:

SUB: ME WITH LENGTH OF: 2
SUB: OTHERS WITH LENGTH OF: 6
SUB: THEM WITH LENGTH OF: 4
SUB: YOU WITH LENGTH OF: 3

The F is a FOR loop, the $O(RDER) can retrieve the next or previous subscript, and the $L(ENGTH) function gives you the length.

For the 2nd half of your question, you surely can test maximum length of a subscript using a Try/Catch test. Try this code:

ZSUBTEST ; TEST LENGTH OF SUBSCRIPT.
 N I,I2,I3,J,J2,J3
 S I=1,J="B",J2=0
 DO {
     TRY {
         S ^ZTEST(J)="YUP"
         S I=I+1,J=J_"A"
         ; W I,*9,J,!
     } CATCH {
         W "A "_$ZERROR_" occured, caused by a subscript of "_I_" characters.",!
         S J2=1
     }
 } WHILE 'J2
 Q

You should see the output:

A <SUBSCRIPT>ZSUBTEST+6^ZSUBTEST ^ZTEST("BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAA occured, caused by a subscript of 505 characters.

Or something similar. The program simply starts with a subscript one character long and keeps adding a character until the error occurs (caught by the CATCH part of the code) and displays the length of the subscript it couldn't handle.

Hope this helps!

This is for educational use only, so if you break your system, lose your cat, or your ice cream goes all melty by using my example below, please don't hold me accountable.

Also, I would like to mention that I borrowed the base structure from the ^%SS utility in the %SYS namespace.

I would also like to mention that in my *very* limited testing, you'll only have a CSP Session ID while there's actually "stuff" going on in the CSP Page. If you're executing a two-minute query in a CSP Page, whilst that query is running you can see (and clobber) that session. If the query is complete and you're just scrollin' round the results not generating new HTTP requests into the CSP Page, you may not be able to see the CSP Session ID.

That said, this did work for me to kill a CSP Session mid-query:

ZZPROCKILL ; 
 OLDNS=$NAMESPACE
 $NAMESPACE="%SYS"
 query="",parm=1
 Set Rset=##class(%Library.ResultSet).%New("SYS.Process:SS")
 Do Rset.Execute(parm)
 POP=0
 While Rset.Next() {
Username=Rset.Get("User")
CONTINUE:Username'="UnknownUser"
NameSpace=Rset.Get("Namespace")
NameSpace="" NameSpace="%SYS" 
; i (Dir'=""),(NameSpace'=Dir) continue
Set Pid=Rset.Get("Process")
Process=##CLASS(%SYS.ProcessQuery).Open(Pid)
SID=Process.CSPSessionID
Process.%Close()
!,$J($s(($zversion(1)=1):$ZH(+Pid),1:Pid),8)_$Case(JobType,1:"*",:""),?20,Username,?40,NameSpace,?50,SID,!
    SID'="" $SYSTEM.Process.Terminate(Pid)
 }
 Rset.%Close()
 
 $NAMESPACE=OLDNS
 Q
 ;

I have 'embiggened' the line of code that actually terminates the process, and I did make one further assumption in my code: That the CSP Sessions would be run under the user: UnknownUser - If your system uses a different user to execute CSP, you'll need to change the username in the CONTINUE: line (ZZPROCKILL+10).

If you want to just see if you can find CSP sessions and not actually terminate them, comment out that final 'embiggened' line in the While loop (that starts with i SID'="").

Hope this helps!

Mr. Petrole,

Per the documentation here: https://docs.intersystems.com/latest/csp/documatic/%25CSP.Documatic.cls?&LIBRARY=%25SYS&PRIVATE=1&CLASSNAME=%25Library.DynamicAbstractObject#%25FromJSON

is it possible that at some point your data stream is not encoded as UTF-8? That seems to be a requirement of the %FromJSON method, and if your data string isn't UTF-8 you may need to employ a call to $ZCONVERT, or for a "non-compliant" stream you may need to set the TranslateTable attribute of the stream to "UTF8."

Hope this helps!