Eduard Lebedyuk · Nov 1, 2018 go to post

Use ValidateStream method of Ens.Util.XML.Validator class. It does exactly what you need.

Eduard Lebedyuk · Oct 25, 2018 go to post

As I'm the author of RESTForms, I'd recommend that. The advantage is that it offers not only JSON<->object transformation, but a complete CRUD REST API for your data.

Calling @Stefan Cronje

Eduard Lebedyuk · Oct 25, 2018 go to post

All approaches you are considering can work. if you're storing everything in one database, I'd recommend RLS.

Much more important question is do you need storing everything separately or in the same place.

Advantages of separated databases/servers:

  • Easy to scale
  • Would work faster on a lot of cases
  • Easy to delete/rebuild a chunk
  • Easier security

Advantages of unified database/server:

  • Cross-chunk queries are easier (For example: This venue is sold out on the dates you need. We recommend the following nearby venues)
  • Simple Backup/HA strategies
Eduard Lebedyuk · Oct 22, 2018 go to post

You can just pass the stream directly, no need to read from it:

set parObj = {}.%FromJSON(%request.Content)
Eduard Lebedyuk · Oct 18, 2018 go to post

Achieving  FIFO with Ensemble is an interesting task.

Do you control queue population?

If so  you can send the message only if the queue is empty and process is idle.

For example create a proxy process that sends only one message at a time.

Eduard Lebedyuk · Oct 16, 2018 go to post

There are far more efficient ways to do that.

  1. Move tables you want shared into a separate Namespace with separate Code/Data databases.
  2. Map your data and code into original namespace.
  3. Verify that it all works as expected. So far it should work as before.
  4. Create a mirroring configuration.
  5. Add 2 created databases to the mirror configuration.
  6. Add second server as a DR mirror.
  7. Move databases to a DR mirror and mount them there.
  8. (Optional) Create a namespace with 2 mirrored databases.
  9. Add desired mappings on a second system.

Docs.

Eduard Lebedyuk · Oct 15, 2018 go to post

InterSystems Caché supports passwords with Unicode characters for basic authentication starting 2018.1.

Earlier versions should require ascii-compliant passwords.

You can use PasswordValidationRoutine to enforce that.

Eduard Lebedyuk · Oct 15, 2018 go to post

Just installed  Webterminal 4.8 on Cache for UNIX (SUSE Linux Enterprise Server for x86-64) 2015.2.1 (Build 705U) Mon Aug 31 2015 16:58:02 EDT [HealthShare Modules:Core:14.01.7952 + Linkage Engine:14.0.7952] and it seems to work.

Do you see /terminal web app in SMP? If it's not a production system try to give %ALL role to check if it helps.

The link should be:

http://host:port/terminal/
Eduard Lebedyuk · Oct 9, 2018 go to post

Do you have IMAP available?

If not you can use DavMail to convert exchange to POP3 and that's easily consumable from InterSystems IRIS.

Eduard Lebedyuk · Oct 2, 2018 go to post

Instead of

$zutil(96,39) 

you can use

 $$$MaxStringLength

for the same effect, but greater readability.

Eduard Lebedyuk · Sep 28, 2018 go to post

I completely agree with you.

Objects should be instantiated only when they are relevant.

Calling object methods where it's possible to call class methods makes code harder to read.

Eduard Lebedyuk · Sep 27, 2018 go to post

Redefine HTTP adapter like this:

Class Production.Adapter.HTTPOutboundAdapter Extends EnsLib.HTTP.OutboundAdapter
{

Method PostURL(pURL As %String, Output pHttpResponse As %Net.HttpResponse, pFormVarNames As %String, pData...) As %Status [ CodeMode = expression ]
{
..SendFormDataArray(.pHttpResponse, "POST", ..GetRequest(), .pFormVarNames, .pData, pURL)
}

ClassMethod GetRequest() As %Net.HttpRequest
{
    set request = ##class(%Net.HttpRequest).%New()
    set request.Timeout = 300 // Wait 300 seconds for response
    quit request
}

}

And use it instead of default adapter.