Eduard Lebedyuk · Nov 26, 2018 go to post

Right you are!

I usually store files external from database and write a simple persistent class Document { GUID, DisplayName, FileStream }. User requests files by GUID, and it's served to him with Displayname in header.

Additionally files are never named on filesystem by Displayname,  or any kind of user input but rather by hash or a simple incremental counter.

Storing more than 1k (10k) files per directory is not recommended, if possible add more directories (by date, etc.)

Eduard Lebedyuk · Nov 26, 2018 go to post

If this is your own code block then you could initialise k1 first

As the error source is:

zS2+2^GWH.Messages.Eobs.AKISegmentCheck.Thread1.1

it's probably a generated BPL. I'd check The method S2 of GWH.Messages.Eobs.AKISegmentCheck.Thread1 class. From it you can determine what BPL activity it corresponds (probably something right at the beginning). After that it's easy to fix BPL error.

Eduard Lebedyuk · Nov 23, 2018 go to post

The rewards seem to be almost sold out after an hour.

Can we add some new ones in the future?

How about Raspberry PI board? Arduino board?

Eduard Lebedyuk · Nov 20, 2018 go to post

Also, if I follow your steps and open the eventlog I get the message ERROR #5580: SQL Privilege Violation: 'User Testuser is not privileged for the operation' SOURCE ELEMENT: %ZEN.Component.tablePane (table)

Testuser does not have required privileges to access Ens_Util.Log table. Add SELECT privilege for the Testuser. You may also need to add %DB_<DBNAME> role.

I previously got this error when trying to open the messagebank from the production configuration.

You'll need SELECT privilege on Ens.MessageHeader and %Ens_MessageHeader resource on U.

I have (sort of) accomplished this in Ensemble, but in HealthConnect/Share I just can't get it done.

How?

I should clarify when I say monitor, I mean being actually able to see the production and navigate the message bank. Being able to see the routingrules and/or transformations would be nice, but not necesary.

Check other available pages and resources. There are separate resources for message headers, message contents, visual trace, rules and so on. Production config page is exactly for configuring production.

Eduard Lebedyuk · Nov 20, 2018 go to post

You can use Event Log Viewer to monitor Ensemble production.

Create a role that has these resources:

  • %Ens_EventLog on U
  • %Ens_Portal on U

And give to the user only this role (plus RO access to the DB probably).

As a result user can access only Event Log:

There's a complete list of Ensemble resources with their descriptions in docs, so other pages could be made available to the user.

Eduard Lebedyuk · Nov 20, 2018 go to post

If you have ArchivePath setting specified, then the files would be moved there. Otherwise they are deleted.

Programs that restore deleted files may be able to restore these files.

Eduard Lebedyuk · Nov 20, 2018 go to post

I don't think that behavior can be easily modified. JSON_OBJECT checks first symbol of a value and if it's a { or a [, does the conversion.

You can try %ZEN.Auxiliary.altJSONSQLProvider class to generate JSON from SQL queries.

we don't always know which properties will contain these values

Why? Can a property contain JSON or not JSON? You can also try to parse JSON on a first save and save individual values instead.

Eduard Lebedyuk · Nov 20, 2018 go to post

Do you want to access properties without coding them?

Use $property for that:

set obj = ##class(A).%New()

for i=1:1:3 {

   set $property(obj, "Doctor" _ i) = ##class(%PopulateUtils).Name()

}

zwrite obj
Eduard Lebedyuk · Nov 19, 2018 go to post

What version are you using?

I think you can benefit from REST API architecture, so FilterDate would be a url parameter (esp. if it's the only one).

Eduard Lebedyuk · Nov 18, 2018 go to post

You need to write it. From docs:

You can execute your custom code when certain events occur. Two steps are required:

 1. Define the ^%ZSTART routine, the ^%ZSTOP routine, or both.

  • In these routines, you can define subroutines to execute when the certain activities start or stop.
  • ^%ZSTART and ^%ZSTOP must be defined in the %SYS namespace, although they can be mapped to a non-default database.

2. Use the Management Portal to configure Caché to invoke the desired subroutines.

Specifically, if you define the routine ^%ZSTART and ^%ZSTOP and you include subroutines with specific names, the system automatically calls these subroutines when the activity is beginning or ending. The subroutine names are as follows:

  • SYSTEM — Executed when Caché as a system starts or stops
  • LOGIN — Executed when a user performs a login or logout using the %Service_Console or Service_Telnet services.
  • JOB — Executed when a JOB begins or ends
  • CALLIN: — Executed when an external program begins or completes a CALLIN

For example, when a system starts, the system automatically invokes SYSTEM^%ZSTART, if that is defined and if you have used the Management Portal to enable this subroutine.

SYSTEM^%ZSTART and SYSTEM^%ZSTOP are run with $USERNAME set to $system and $ROLES set to %All. To run your code with a different username, use $SYSTEM.Security.Login() to set the desired name and then continue with your custom code. If you use JOB to launch any additional processes, those processes will inherit the same username (and roles) as the initiating process.

Enabling %ZSTART and %ZSTOP
Once the routines have been designed, developed, compiled, and are ready to be tested, individual entry points may be enabled through the Management Portal. Navigate to the Startup Settings page by selecting System Administration, then Configuration, then Additional Settings, then Startup Settings, and edit the appropriate individual settings:

  • SystemStart, SystemHalt
  • ProcessStart, ProcessHalt
  • JobStart, JobHalt
  • CallinStart, CallinHalt

To deactivate one or more of the entry points, use the same procedure but change the value to false.

Eduard Lebedyuk · Nov 16, 2018 go to post

The connection should be able transfer journals faster then they are written.

So it depends on how much your app writes on a primary.

I'd say it easier to just try esp. with a cloud servers. Mirror creation does not take much time.

Eduard Lebedyuk · Nov 16, 2018 go to post

Well the fastest would probably be custom table into which you periodically write results of this query:

SELECT
ID, Hash
FROM %Dictionary.CompiledClass

Hash in %Dictionary.CompiledClass is calculated on each class change/compilation.

As in this case hashes are already calculated.

Inventory iterates ^rOBJ and calculates hash.

Eduard Lebedyuk · Nov 16, 2018 go to post

Yeah, there's not much info.

To create inventory scan call:

set in = ##class(Inventory.Scanner).RunScan("Version 1")
set dbU = ##class(Inventory.DatabaseComponent).%New()
do dbU.Init(in,"C:\InterSystems\Ensemble\mgr\db\CACHE.DAT")
do in.RootComponent.AddComponent(dbU)                 
set sc = in.%Save()
//do in.WriteToFile("c:\Temp\scanVersion"_$tr($zdt($h,8)," :","Z")_".xml")

And to get diff between two versions/times use SQL:

SELECT
  s1.Name,
  s1.scan->EndTimeStamp,
  s2.scan->EndTimeStamp
FROM Inventory.RoutineComponent s1
JOIN Inventory.RoutineComponent s2 ON s1.Name=s2.Name
WHERE s1.scan=1 AND s2.scan=2 AND NOT s1.SHA1Hash=s2.SHA1Hash

it would return items with hashes changed between scan 1 and 2. The same query can be further modified to accept timestamps, etc.

Eduard Lebedyuk · Nov 16, 2018 go to post

It only matters that the async node is caught up.

Also you need to use SSL.

It all depends on connectivity (bandwidth and lag).

Eduard Lebedyuk · Nov 16, 2018 go to post

ZSTART and ZSTOP are kind of vague, how does that fit into ccontrol start and ccontrol stop. Is there any setting where this can be set to automatic?

ZSTART and ZSTOP are executed on startup/shut down automatically.

Eduard Lebedyuk · Nov 16, 2018 go to post

For a case with one index there are only two variables:

  • Number of distinct values
  • Number of total records.

Or is there anything else?

And on a Z axis the timing.

Sure in a real environment we see interference of a several indices, but here we're talking about one index and how it affects query timings.