Robert Cemper · Mar 18, 2021 go to post

@Alexey Maslov 
This doesn't compile if the calling method doesn't have [ ProcedureBlock = 0 ] 

ERROR #1038: Private variable not allowed : '..Flatten2($name(agg),.summary)'
calling from terminal has no problem as there are all variables in Global Scope
[ I fell also in this trap smiley]
 

Robert Cemper · Mar 17, 2021 go to post

using SQL you can compare the last change between definition and compilation of classes
a negative difference shows where recompilation is required.
I used Posix-Timeformat for an easier compare

SELECT 
def.ID, cmp.TimeChanged compiled,  def.TimeChanged defined, 
to_char($piece(cmp.TimeChanged,',',1),'J')-to_char($piece(def.TimeChanged,',',1),'J') diff
FROM %Dictionary.ClassDefinition def
left outer join %Dictionary.CompiledClass cmp
on def.ID=cmp.ID
where NOT def.name %startswith '%'
order by 4
Robert Cemper · Mar 17, 2021 go to post

In SMP / Explorer you can get
class by name and its last date 
under routines
      the object by related name  

- - - -- - - -

In addition in Studio, a class that is saved but not compiled
is marked with + after the name 

while a changed class that is neither saved nor compiled
is marked by * 

I have no idea if VSCode or Atelier have similar features.

Robert Cemper · Mar 17, 2021 go to post

This list can be grouped into 3.5 categories:

  • Almost  Runtime changes

Only the last 2 are critical for successful mirror failover and require dynamic handling
and the last requires also non-stop monitoring as it is not directly triggered by SysAdmin.

Robert Cemper · Mar 17, 2021 go to post

Just any Select.   e.g. 
          SELECT 17+4 as BlackJack, NOW() as TimeToWin
no table required
or
          SELECT Top 5 *  FROM %TSQL_sys.types

Robert Cemper · Mar 16, 2021 go to post

2 remarks:

  • mapping your class to pseudo_namespace %ALL makes it available
    to all other namespaces except %SYS
  • to keep your options for a bitmap valid you may take the approach shown
    in my article of the Adopted Bitmap   
    The default of a storage global is ^Pck.ClassnameD .. and so on.
    But it can also be  ^Pck.ClassnameD(%InterfaceName,$namespace) 
    and the integer ID follows as you need.
    You just have to take care that %InterfaceName has some useful content. 
    Which shouldn't be a problem.
    I used %name to bypass all issues with ProcedureBlock.
     
Robert Cemper · Mar 16, 2021 go to post

explicitly PUSHING "publish release" doesn't show any reaction.
and no change for zmp "search -d -r"
What's the delay to be expected?

Robert Cemper · Mar 15, 2021 go to post

There is a trick that may work for some pieces but requires very careful setup:
- create a new database that can be part of the MIRROR
- then you can map the components that are INDEPENDENT of the local instance to this DB

Be warned:
Identification and Isolation of these pieces can be quite tricky and sometimes also impossible
In addition, this can make troubleshooting and maintenance (release update?) rather complicated
and you should do an in-depth evaluation if the extra effort values the achieved result.  

Robert Cemper · Mar 12, 2021 go to post

It is not meant to replace one of the queries:
do #1 or #2 or do both by UNION  

Robert Cemper · Mar 12, 2021 go to post

maybe a misunderstanding:
I call both Class Queries as Tables and join them with UNION
without modifying the existing class queries

Robert Cemper · Mar 12, 2021 go to post

Using Class_Queries like a table the SQL Statement may look similar to this example:
 

select 'Q1' as Qry ,ID,name,SSN
  from sample.SP_sample_by_name() where name %startswith 'A' 
UNION
select 'Q2','--',SSN,name
  from sample.employee_byname() where name %startswith 'K' 

with this result:

Robert Cemper · Mar 11, 2021 go to post

DisplayToLogical converts external input to internal format.
if you have an object everything is internal already.
what would you expect to convert?

DisplayToLogical is just not involved in that process.
You may eventually look for LogicalToStorage  -  [a rare case]

Robert Cemper · Mar 10, 2021 go to post

You are correct. I can confirm it.
I was part of the process when DeepSee V1 was prepared.

Robert Cemper · Mar 10, 2021 go to post

I'm full with you.
And if you aren't under time pressure you get a close look at things that have become obsolete over time but never were removed.

Robert Cemper · Mar 8, 2021 go to post

in OEX there is a series of various  Websocket Clients I produced:
The internal is just available in IRIS.
Half Externals (eg. CSP based, using JavaScript )  might fit also for Caché 2015 as for IRIS
check WebSocketClient CSP based
 

Robert Cemper · Mar 8, 2021 go to post

You mention: web application configuration information, task plans, sql gateway, etc
Namespace %SYS was always excluded from MIRROR  since most of the information is
either static (SYSLIB)  or server-specific (eg. journal)
 

Robert Cemper · Mar 8, 2021 go to post

@Alexey Maslov
I had a similar experience with "InPlace".
This may work if your applications are as simple as in SAMPLES:
[ "nome est omen" SAMPLES => Simple]
Just a few $ZU() or other %z* stuff may break you, or file references containing *CACHE*.
Or some $ZF() functions with c-binding, ....

Therefore I designed my "2 worlds" approach using ECP as a data bridge: 
Using ECP across IRIS and Caché

Robert Cemper · Mar 6, 2021 go to post

Definitions might be wrapped into some $$$macro that calls the .INT directly.
Similar to some compiled class . Deployed classes provide more comfort.