Wolf Koelling · Jan 22, 2024 go to post

I can't check for sure now but from memory it was around Cache 2015 (plus minus one version). Not sure whether that helps you or whether you need it for definite. And, again if memory serves me right, the very first version these tables were introduced they were still hidden, i.e. you could query them but they wouldn't show in a table listing.

Wolf Koelling · Sep 7, 2023 go to post

What about
- enhanced multi model capabilities via native json storage / document database
- in-memory bi-directional java and .net gateway (and python but have embedded python since then)
- AWS Cloud connectors
- REST enhancements (API publishing via swagger, spec first development from OpenAPI 2 spec)
Also, more generally, IRIS is the successor of Ensemble + iknow + DeepSee, rather than just Caché

Wolf Koelling · Aug 29, 2023 go to post

The solution depends on whether updates are via object, sql or both.
The  %OnDelete() callback method suggested only works for objects. For SQL you can add a foreign key definition to the organisation class, referencing the GetOrgUpdatesResponse with OnDelete = cascade constraint.
See https://docs.intersystems.com/iris20231/csp/docbook/Doc.View.cls?KEY=RO…

The solution that works for both sql and object deletes is an BEFORE DELETE trigger with Foreach = row/object parameter.

Wolf Koelling · Oct 29, 2021 go to post

yes, renaming of CACHE.DAT to IRIS.DAT is supported, but not for the system manager databases.

Either just copy your own databases that way and recreate the required configuration (e.g. security), or - if you have a lot of config -, you can install Cache (into same directory path on new server), copy manager db (and cache.cpf) across and then do in-place upgrade to IRIS.

Wolf Koelling · Apr 9, 2020 go to post

You don't need to do it this way. Instead, get the id of the parent object and then, as you create each child object,

do childobj. <ParentPropertyName>SetObjectId(parentId)

and save the child object. That should solve your memory problems.

This is a technique that doesn't just apply to relationships but to any object property where you can avoid swizzling it into memory.

Wolf Koelling · Apr 8, 2020 go to post

Isn't the issue here that you should unswizzle each child object as you move to the next item in your child collection?

Wolf Koelling · Nov 21, 2019 go to post

Hi Joshua, do you happen to know whether there is compatibility between Caché and IRIS, i.e. can I export from Caché and import into IRIS?

Wolf Koelling · Jan 23, 2019 go to post

Great news Jeff. It looks like a significant release and the one we will be targeting for our move from Caché to IRIS.

But in this context, what I'm missing from your announcement and the release notes is mention of an upgrade installation from Caché to IRIS (rather than a completely new install and then having to manually create all configuration and security items that exist on the Caché platform and having to rename database files and so on and so on). You stated in late November that was in the works and coming for 2019.1.

Wolf Koelling · Jan 8, 2019 go to post

Hi Evgeny, I haven't tried it yet but it is on my radar and I will do so soon (ish).

As our entire change management and CI / CD process is based on and built around Deltjanji by George James Software the recent announcement by GJS of  the forthcoming Deltanji v7 adding support for VS Code and Serenji v3 adding debug capabilities this may be a feasible alternative.

Wolf Koelling · Jan 7, 2019 go to post

Hi Robert

I'm assuming that your Windows client installation had the same version as your Linux server installation, am I right?

But the quarterly IRIS releases are container only, so there is no corresponding Windows distribution I can install Studio (and odbc, jdbc) from.

Wolf Koelling · Oct 25, 2018 go to post

I need to state in advance that I haven't configured CSP apps and web servers for years - so I might be talking complete b******s - but if I remember correctly then in the CSP application configuration (System Management Portal) you define whether Caché serves files or not and if yes you specify a path. Paths in the csp code are relative to that, I believe. Check whether your csp apps are set up like that and if so, try to change the Serve files setting to 'No'. I think the consequence of that might be that the paths in your csp script will then be relative to the web server (possibly the directory where the csp gateway files are stored).

As I said, my memory might deceive me on the above, but in the absence of another, more authorative answer you might want to give this a try.

Wolf Koelling · Oct 5, 2018 go to post

I think Kev is right: the upgrade froze all query plans. In your DEV environment the class definition might have moved on, probably added a new field - which should cause the plan to become unfrozen but there was (is?) a bug in Caché with that. The fix is

DPV5125 - SQL: Correct frozen plan error condition of SELECT * validation

We had a patch for that for v2017.1 and it is supposed to be included in 2017.2.2, although I'm not too sure as we recently upgraded to that version and had the same problem afterwards.

Wolf Koelling · Jan 19, 2018 go to post

I've just started evaluating Atelier two days ago, using the 'latest beta update channel', which gives me version 1.1.391.

I stumbled over this issue today. The 'non-collapsability' is just an annoying side effect. The real problem is that the members are not recognised at all and any calls to these members can not be followed and it looks like the code makes calls to methods that don't exist.

Is this seriously not fixed four months after being logged as a defect? That's a total show stopper for using Atelier. I'll have to go back to Studio.

Wolf Koelling · Jan 15, 2018 go to post

Many thanks Stephen, that worked for me (took me a little while to get it right).

For information, I followed Andreas' advice also, contacting WRC about the possibility of an archive file. The answer was

"our development team has discussed the possibility of providing an archive with the plugin, but
given the complications of including all the dependencies and the lack of clear upgrade path have
made this a very low priority"

They suggested the same approach, adding the certificate to the java certificate store, as the solution instead.

Wolf Koelling · Jan 10, 2018 go to post

Is there any chance of making the Atelier plugin available as a zip file that I can download and then install manually into Eclipse?

The firewall at our workplace isn't happy about some certificate issue and blocks the online install (sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target.)

Wolf Koelling · Oct 4, 2017 go to post

No, this will work perfectly fine.

When creating object instances of Foo and Bar we'll insert Bar orefs into the MyBar object list collection of Foo - but via SQL / the relational projection id keys are being used instead (and, indeed, that's what get's stored in the globals anyway).

Wolf Koelling · Oct 4, 2017 go to post

Yes, you can do what you want with a list property, you don't need an array property for it, even though that would make your life easier.

First of all, for optimisation purposes, add an index on your list items:

Index Bar On MyBars(ELEMENTS);
 

Then use this correlated subquery:

SELECT Name
FROM Bar
WHERE EXISTS
(SELECT ID FROM Foo WHERE FOR SOME %ELEMENT(Foo.MyBars) (%VALUE = Bar.ID))

Wolf Koelling · Sep 19, 2017 go to post

Thanks Semion. I downloaded and installed SYSMON dashboards on a development server but I can't find the SYSMON Configurator tool you're mentioning and showing. Where is that located?

Wolf Koelling · Jun 28, 2017 go to post

...new field test version released, links are still broken. Additionally, the documentation download is now broken as well (http 404, page not found).

Is NOBODY at ISC checking even once whether links on their public pages are actually working?

Wolf Koelling · Jun 22, 2017 go to post

This is a very interesting discussion. I do get the point that while our code looks like looping through a set of fields, behind the scenes the entire physical data block containing each item is pulled into memory. And if our items are inside parent objects in a p / c relationship, then the children are located in the same block and this is quite inefficient if and when we are just interested in the parents. Definitely something I hadn't properyly considered before.

But as Peter points out, mostly we are interested in looking at / processing both together, that's why they are modelled as P / C in the first place. And the marketing spiel of Intersystems for the last few decades was that the "clustering effect" achieved by hiearchical global tree structures was what made Globals so efficient, as data that is commonly used together is stored physically together.

So my personal take-away from this is not that p / c relationships are obsolete but that I need to consider more carefully the use cases for data access, in particular how likely it is that the top level information only will be required, before committing to it.

Wolf Koelling · Apr 27, 2017 go to post

Unfortunately there is currently zero information on what this version delivers. I'm particularly keen to see the Document / JSON database features that were withdrawn from 2016.2 seeing a return. Is anyone from ISC able to share info on this?

Wolf Koelling · Mar 13, 2017 go to post

Your assertion about % variables being shared across processes is incorrect.  They only exist for the process setting them up. For a given process, once set, they are accessible no matter what namespace the process changes into but that is true for all local variables, not just %.

Wolf Koelling · Dec 16, 2016 go to post

I'm on Windows 10. Nothing in the event logs.

Where would I find the cache install log?

Wolf Koelling · Nov 18, 2016 go to post

Re: Caché Release Notes, Other Items of Note: Lightweight SQL Profile

What is that?

Wolf Koelling · Nov 17, 2016 go to post

Hi Alexey

 Strings longer than a half of a block are not cached on application servers. In reality, this threshold is a bit lower – around 3900 bytes for 8 KB blocks. This decision was made by the developers to keep cache clean of BLOBs and CLOBs: such data is usually written once and is rarely read afterwards.

I believe this ECP caching limitation has been addressed in v2016.1. From the release notes:

Enhanced caching on ECP application servers.  Application servers now cache big string data values.  ECP also automatically prefetches some database blocks and caches them on application servers in advance.

Wolf Koelling · Nov 1, 2016 go to post

Have you got an example of how to use the Pause and Resume methods?

All the examples I've seen so far use the Queue and WaitForComplete methods, i.e. the process that has access to the workmgr object is waiting for everything to be completed and is therefore not accepting any other signals.

Please find below this test code of mine, using QueueCallBack and Wait methods that allows stopping the work, even if it's not very elegant. But it looks as if the Wait method is waiting for %exit =1 only. How would I suspend / resume?

Class DEV.WK.Tst1 Extends %RegisteredObject
{
ClassMethod Run() As %Status
{
^wk.Tst1
sc=..ManageQ()
sc
}
ClassMethod ManageQ() As %Status
{
sc=$$$OK
queue=$SYSTEM.WorkMgr.Initialize("/multicompile=1",.sc) if ('sc) sc=$$$ERROR($$$GeneralError,"Error initialising work queues: "_$system.Status.GetErrorText(sc)) sc }
for i=1:1:100 {
startchunk=i*1000,endchunk=((i+1)*1000)-1
sc=queue.QueueCallback("##class("_$classname()_").Work","##class("_$classname()_").QCallBack",startchunk,endchunk) if 'sc sc=$$$ERROR($$$GeneralError,"Error queuing up work: "_$system.Status.GetErrorText(sc)) return sc }
}
sc=queue.Wait(,.AtEnd) ^wk.Tst1("AtEnd")=AtEnd
if sc&&'AtEnd sc=$$$ERROR($$$GeneralError,"Processing halted") }
queue.Clear()
sc
}
ClassMethod Work(StartId As %Integer, StopId As %Integer) As %Status
{
^wk.Tst1("work",$j,StartId)=""
60
$$$OK
}
ClassMethod QCallBack(StartId As %Integer, StopId As %Integer) As %Status
{
if $d(^wk.Tst1("work",%job)) ^wk.Tst1("work",%job,StartId)=1 }
if $g(^wk.Tst1("halt"))=1 { %exit=1 }
$$$OK
}
 

ClassMethod Halt() As %Status
{
^wk.Tst1("halt")=1
$$$OK
}
}