Just a small fix that makes the PublicList unnecessary:

ClassMethod Flatten(reference, Output flat)
{
    For {
        Set reference = $query(@reference)
        Quit:reference=""
        Set value = $listbuild(@reference)
        For i=1:1:$qlength(reference) {
            Set value = value_$listbuild($qsubscript(reference,i))
        }
        Set flat($i(flat)) = value
    }
}

The fixed method should be called in a slightly different way:

Method SomeMethod(...) [ PublicList = agg ]
{
  ...
  Do ..Flatten($name(agg),.summary)
  ...
}

Just adding 2c:

  • mapping your class to pseudo_namespace %ALL makes it available to all other namespaces except %SYS

...it would be available to all namespaces including %SYS.

Giving a developer the opportunity to turn off an auditing event deemed important to capture kind of defeats that purpose.

Agree with you that disabling audit events is basically a bad practice. 

The frequency and the purpose of those external calls were checked, and they are OK, while it's worth considering change $zu(-100) to something else, e.g. to command pipe, whether access to pipes is not logged to Audit.

Now I've got an idea... It was not our case as it was a new instance of IRIS to create. We were just choosing the simplest way of passing databases and some other stuff (localization, Task Manager's tasks, etc) from Caché to IRIS. Installation of an old version of OS just for Caché's sake seems to be overkill, doesn't it?

@Robert Cemper

Agree with you, "in-place conversion" is not of great aid in real cases. Its pathos name sounds a bit confusing, isn't it?

During my first tries to transfer our Caché APP to IRIS I took an approach similar to yours, although I preferred not to use ECP as it was possible to avoid running both instances concurrently.

The funny thing I noticed: if one creates a database in Caché, renames it to IRIS.DAT, stops Caché, and starts IRIS, it will be mountable, but the reverse is wrong: renaming IRIS.DAT has been created in IRIS to CACHE.DAT doesn't make it compatible with Caché.

This is a first version with Frozen Plans

The first, but not the last one, so still not getting the idea of having this intermediate upgrade point.

...Cache/IRIS never runs on unsupported OS. Do you have a case with WRC on this topic?

Sorry, on which topic? Everyone knows that Cache/IRIS never runs on an unsupported OS.

upgrade to 2016.2

What is the reason of this step? If OP's Cache version allows direct upgrade to 2018.1, it can be easily omitted.

OS Compatibility can be a stop factor for in-place conversion. E.g., preparing IRIS instance for a prospect, we faced a small problem with it: Cache 2017.2 (our App's supported version) turned to be incompatible with Ubuntu 18, which was chosen as on OS for IRIS.

This limit of 256 characters is a known problem with command pipes in Cache, and it seems that yet in IRIS. Agree with Dmitriy: $zf(-100) would be OK.

Hi Yuri,
Your feature table is great. Just a quick note: AWS Hosting, like any other kind of hosting, is mostly a hosting feature rather than ODBMS one.

Besides mapping ^ERRORto a non-journaled database, you may want to tune the ErrorPurge configuration parameter that resides under  System > Configuration > Startup Settings in SMP. As its default (30 days) is usually too big, it can be easily reduced to 7 days.