Otto Medin · Dec 10, 2025 go to post

No, but that's certainly worth a try, thanks. (I just need to figure out how to make it fail when I want it to...)

Otto Medin · Sep 25, 2025 go to post

Thanks James,
Do I read the implication correctly, that Ens.Config.Item.GetSetting() does not account for System Default Settings?

Otto Medin · May 5, 2025 go to post

Is there a way to avoid copying iris.dat? That is, can the two databases be created separately and then set up as mirrored?

Otto Medin · Feb 16, 2025 go to post

The marketplace search is a little sensitive, so note that it's "GitLens", not "Git Lens".

Otto Medin · Oct 7, 2024 go to post

Thanks!

Looking at Ens.Job, there's also a ShouldAbort() and ShouldSuspend(). I guess I'll need to handle those, too, right?

Otto Medin · Oct 4, 2024 go to post

Thanks!
I found OnProductionStop(), but I'm after something different, along the lines of calling Ens.Director.GetProductionStatus() from within OnMessage() but with a fifth possible state: ProductionStateStopping

What I'm trying to do is custom retry logic that retries on certain errors, which could mean a pretty long total hang time, so it would seem well-behaved to check every second (or so) whether it's time to shut down.
Thinking about it, it would be a lot better to be able to tell whether the host itself should stop. That is, regardless of whether it's because of a production shutdown or a stop/restart of the individual host.

Otto Medin · Mar 25, 2024 go to post

Thanks Dimitrii, your question answered my question (how to get rid of the trailing slash).

Otto Medin · Oct 29, 2021 go to post

Note that applying the new IRIS for Health key (I haven't tried plain IRIS) yields a warning that it lacks some of the analytics features of the expiring key.

Otto Medin · Dec 10, 2020 go to post

...or using a stored procedure along these lines:
ClassMethod RenameTable(oldName As %String, newName As %String) As %String [ SqlProc ]
{
   try {
      &sql(select %ID into :className
         from %Dictionary.ClassDefinition
         where SqlTableName = :oldName
      )
      if SQLCODE set status = "Error: Table '" _ oldName _ "' not found." quit
      set classDef = ##class(%Dictionary.ClassDefinition).%OpenId(className)
      set classDef.SqlTableName = newName
      set saveStatus = classDef.%Save()
      set status = $case(saveStatus, 1: "OK", : "Error: " _ $system.Status.GetErrorText(saveStatus))
   } catch {
      set status = "Error: " _ $zerror
   }
   return status
}
Note: This doesn't handle the special case where there is no 'SqlTableName' defined.

Otto Medin · Apr 15, 2020 go to post

Hi Dimitry,

Was the webinar recorded? I'd say you'll get at least another 80 viewers if you publish it...

Cheers,

Otto

Otto Medin · Jan 24, 2018 go to post

Agreed, and if you want to have your cake and eat it, too:

if (a) { set b = a }
Otto Medin · Nov 8, 2017 go to post

Somewhat off-topic, there are reasons to watch out for %OnBeforeSave():

  • The object is already serialized at this point, so you can't change any properties.
  • The method is only triggered if the object was changed.

%OnAddToSaveSet() has neither of these gotchas (but you don't have %Id() there either, of course).

Otto Medin · Aug 16, 2017 go to post

...and don't forget to kill the global when you're done. On a busy system, the log file could grow very large.

Otto

Otto Medin · Aug 7, 2017 go to post

Hi Kishan,

The error message indicates that you're trying to access a property called 'value' in a collection of objects (%Collection.ListOfObj), but there is no such thing. My guess is that you're trying to access a property of one of the objects in the collection, in which case you need to use the 'GetAt' method of the collection object to specify which one you're after.

Here's more information on how to handle collections of objects.

Otto

Otto Medin · Aug 7, 2017 go to post

This only matters for very long loops (and you'd need a pretty extreme scenario for it to matter even then), but a post-conditional 'quit' is only meaningful if there's more code after it, and it comes with a performance cost, so this line:

USER>for count = count:1 set ref=$query(@ref) quit:ref=""

...should be:

USER>for count = count:1 set ref=$query(@ref) if (ref="") quit
Otto Medin · Jun 16, 2017 go to post

...or did you already have data in the table when you added the index on A? Assuming that some or all of the pre-existing data is in your WHERE range, that would explain your problem, and as others have commented, an index rebuild is the remedy.

Otto Medin · Jun 16, 2017 go to post

([@Kyle Baxter]: Your answer is in response to [@Scott Morrison]'s comment, right?)

Another thing to consider is that child objects have non-integer IDs, so you can't use bitmap or bitslice indices on their properties.

Otto Medin · Jun 8, 2017 go to post

Depending on the exact behavior you're after, the "binary follows" operator (]) may do the trick. For your two values, it yields the desired result, regardless of how you set them:

USER>set a = "1.0", b = "2.2" write a]b
0
USER>set a = "1.0", b = 2.2 write a]b
0
USER>set a = 1.0, b = 2.2 write a]b
0
USER>set a = 1.0, b = "2.2" write a]b
0