Yes, like that.
Is it the same OS?
You can also try running:
openssl s_client -connect <URL or IP>:<port>- Log in to post comments
Yes, like that.
Is it the same OS?
You can also try running:
openssl s_client -connect <URL or IP>:<port>Would it work with Enabled cipherlist (TLSv1.2 and below): ALL
Can you set Maximum Protocol Version to TLSv1.3?
As process spawning is expensive, parallel queries are processed using Work Queue Manager. It works by having a queue managing process spawn worker processes at the system startup. When a new parallel query needs to be executed, it is distributed to workers.
That is why the $zparent value is not what you expected. It is a value of a work queue managing process.
You can use it instead, as it's relatively constant.
Before executing your main query, run this query to get Work Queue Manager JobId:
Class Test.Parallel
{
Query Test() As%SQLQuery
{
SELECT Test.Parallel_Parent() UNION %PARALLEL
SELECT Test.Parallel_Parent()
}
ClassMethod Parent() As%Integer [ CodeMode = expression, SqlProc ]
{
$zparent
}
/// do ##class(Test.Parallel).Try()ClassMethodTry()
{
set rs = ..TestFunc()
do rs.%Next()
write"Work Queue Manager Job: ", rs.%GetData(1)
}
}
Then, store your data subscribed by Work Queue Manager JobId, and all Work Queue Workers can pick it up using $zparent.
IIS can't access <IRIS>\CSP\bin\CSP.ini.
You can make IRISLIB DB RW, but you'll lose changes on update.
Parameter values are static values* and the same for all objects.
Property values are different for each object.
Small example:
Class Circle Extends%RegisteredObject {
Parameter PI = 3.14;Property Radius;
Method GetArea()
{
quit ..#PI * ..Radius * ..Radius
}
ClassMethod Test()
{
set circle = ..%New()
set circle.Radius = 25write circle.GetArea()
}
}* parameters can be calculated but not set by user.
Checking every 5 seconds should be good enough I think (with 10 being a default timeout in several places).
This is actually for a PEX adapter but it looks like a fast check.
Thank you! That is exectly what I need.
Database is a physical file containing globals.
Namespace is a logical combination of one or more databases.
By default Namespace has two databases:
In addition to that, namespace can have any amount of mappings. Mappings map specified globals/code from a specified database.
When you try to access a global, first global mappings are searched for this global, if no mappings are found, the GLOBALS database is used.
When you try to access some code, first package/routine mappings are searched for this code, if no mappings are found, the ROUTINES database is used.
To split data innto a separate DB:
scheduled task that run every 5 mins
Assuming task is scheduled like this:
.png)
it would be scheduled to run again 5 minutes after the completion of a last task execution, so there's no issue with several copies of a task running in parallel.
I would not recommend regexp for that. If you have one place with such a date, you can use transient/calculated property pair:
Class User.JSON Extends (%RegisteredObject, %JSON.Adaptor)
{
Property tsjson As%String(%JSONFIELDNAME = "ts") [ Transient ];Property ts As%TimeStamp(%JSONINCLUDE = "none") [ SqlComputeCode = {set {*}=$replace({tsjson}," ", "T")_"Z"}, SqlComputed ];/// d ##class(User.JSON).Test()ClassMethod Test()
{
set json = {"ts":"2022-02-02 01:01:34"}
set obj = ..%New()
zw obj.%JSONImport(json)
w"ts:" _ obj.ts
}
}
If you have a lot of json properties, use a custom datatype to do automatic conversion:
Class User.JSONTS Extends%Library.TimeStamp
{
ClassMethod IsValidDT(%valAs%RawString) As%Status
{
/// replace it with a real checkq$$$OK
}
/// Converts the Objectscript value to the JSON number value.ClassMethod JSONToLogical(%valAs%Decimal) As%String [ CodeMode = generator, ServerOnly = 1 ]
{
/// $replace({tsjson}," ", "T")_"Z"If1,($$$getClassType(%class)=$$$cCLASSCLASSTYPEDATATYPE) || $$$comMemberKeyGet(%class,$$$cCLASSparameter,"%JSONENABLED",$$$cPARAMdefault) {
Set%codemode=$$$cMETHCODEMODEEXPRESSIONSet%code="$replace(%val,"" "", ""T"")_""Z"""
} Else {
Set%code=0
}
Quit$$$OK
}
}And use it instead of the standard timestamp:
Class User.JSON Extends (%RegisteredObject, %JSON.Adaptor)
{
Property ts As User.JSONTS;/// d ##class(User.JSON).Test()ClassMethod Test()
{
set json = {"ts":"2022-02-02 01:01:34"}
set obj = ..%New()
zw obj.%JSONImport(json)
w"ts:" _ obj.ts
}
}
You can do it like this:
1. Get active production:
w##class(EnsPortal.Utils).GetCurrentProductionName()2. Get a list of all BSes in an active production:
SELECT i.Name
FROM Ens_Config.Item i
JOIN %Dictionary.ClassDefinition_SubclassOf('Ens.BusinessService') c ON c.Name = i.ClassName
WHERE Production = ?3. Disable all BSes (info)
for stop = 1, 0 {
for i=1:1:$ll(bhList) {
set host = $lg(bhList, i)
set sc = ##class(Ens.Director).TempStopConfigItem(host, stop, 0)
}
set sc = ##class(Ens.Director).UpdateProduction()
}4. Wait for all queues to empty:
SELECT TOP 11AS"Processing"FROM Ens.Queue_Enumerate()
WHERE"Count">05. Check that there are no active async BPs (extent size of all BPs must be 0 - here's an example)
6. Stop the production.
w##class(Ens.Director).StopProduction()After that and assuming deferred sending is not used (docs) it would be guaranteed that there are no in-flight messages.
IIS?
Are you setting Accept header in request to application/json?
What do you mean empty queues? Stop accepting new messages and process all messages before shutting down interoperability?
Globals are cached in global buffer and you can use that.
This will give you an in-memory LRU cache. If you also follow @Dmitry Maslennikov's suggestion and use PPG, nothing would be persisted. Otherwise you'll need to invalidate the persisted cache manually/by a task.
In a third party application, there's usually a driver configuration page, you need to add IRIS driver there. That is done by one of two ways:
Here's the code I use (by @Dmitry Zasypkin):
/// Canonicalize XML./// in: XML string or stream to canonicalize./// out: Canonicalized XML is returned in this argument. If it's a string, out must be passed by refrence./// elementId: attrubute Id to canonicalize. If elementId="", the entire document would be canonicalized./// prefixList: a local of namespace=prefix pairs to add to a root tag, only in a case of exclusive canonicalization.ClassMethod canonicalize(in As%Stream.Object, ByRef out As%Stream.Object, isInclusive As%Boolean = {$$$NO}, keepWhitespace = {$$$YES}, elementId As%String = "", ByRef prefixList As%String = "", writer As%XML.Writer = {##class(%XML.Writer).%New()}) As%Status
{
#dim sc As%Status = $$$OK#dim importHandler As%XML.Document = ##class(%XML.Document).%New()
set importHandler.KeepWhitespace = keepWhitespace
if$isObject(in)
{
set sc = ##class(%XML.SAX.Parser).ParseStream(in, importHandler,, $$$SAXFULLDEFAULT-$$$SAXVALIDATIONSCHEMA)
}
else
{
set sc = ##class(%XML.SAX.Parser).ParseString(in, importHandler,, $$$SAXFULLDEFAULT-$$$SAXVALIDATIONSCHEMA)
}
if$$$ISERR(sc) quit sc
if$isObject(in) && $isObject($get(out)) && (in = out) do in.Clear()
if$isObject($get(out))
{
set sc = writer.OutputToStream(out)
}
else
{
set sc = writer.OutputToString()
}
if$$$ISERR(sc) quit sc
#dim node As%XML.Node = importHandler.GetDocumentElement()
if (elementId '= "") set node = importHandler.GetNode(importHandler.GetNodeById(elementId))
// Main partif isInclusive
{
set sc = writer.Canonicalize(node, "c14n")
}
else
{
if (+$data(prefixList) >= 10)
{
#dim prefix As%String = ""for
{
set prefix = $order(prefixList(prefix))
if (prefix = "") quitdo writer.AddNamespace(prefixList(prefix), prefix)
}
}
set sc = writer.Canonicalize(node)
}
if$$$ISERR(sc) quit sc
if '$isObject($get(out))
{
set out = writer.GetXMLString(.sc)
if$$$ISERR(sc) quit sc
}
do writer.Reset()
quit$$$OK
}Do you have /api/atelier defined?
If you have a web application /csp/SomeApp and users need to login to access this application, it is enough to go to a /csp/SomeApp web application configuration page and set Serve Files to Use InterSystems Security to get the effect you want. After making this change, users would not be able to access /csp/SomeApp/image.png without logging into your application first.
Hashes are available on the WRC download page:
.png)
Yes, Studio terminal is not a true terminal and does not work with Unicode, try:
w"Привет"and you'll also get a similarly garbled output.
How do I set up the application folder and it's sub-folders to be inaccessible to casual browsing, and only allow the application to access them?
Depending on your goal, there are different approaches available. Do you want user to see images only after logging into the application (so a general control on resources) or do you want individual access (only some users can see a specified image)?
If it's a first one, go to the web application configuration page and set Serve Files to Use InterSystems Security. In that case if the user has permissions to view a csp/cls page in this application then allow them to view a static file, if they do not have permissions to view a csp/cls page then return a 404 page not found page.
For a second case, use REST Broker to serve files and implement arbitrary checks in the broker.
Stop it first
It is unfortunately impossible.
Thanks for that detailed reply, @Michael.Cronin.
This is a lot of overhead. Also, "do oSDA.StreamOref.Rewind()" and "oSDA.StreamPos = 1" fails to re-initialize the ..StreamBuffer.
That (StreamBuffer reinitialization by calling FillBuffer) is the first thing GetNextSDA does, so I thought it's okay? Is it not?
That depends on the precision you need.
1. If you need just close enough you can do this:
2. If you need to run your BS at exactly at 10:00 AM use this task to achieve that.
Great! Why not keep the service running but idle all the time?
$lf, $lg, $li, $lts
O(n)
list concatenation by "_", $listnext
O(1)