Written by

Question Arto Alatalo · Dec 14, 2017

%SYS.Namespace.ListAll reports one namespace twice

Today %SYS.Namespace.ListAll started to report one namespace, for example USER, two times: once as "USER" and once as USER's database "^^c:\databases\user".

Details: my Cache instance has  50+ local namespaces. Today I have "touched" 3 of them (imported new classes), and now ListAll reports each of these 3 twice. Looks like ListAll is the only one who sees those strange duplicates, in all other places (Portal, Studio) only USER is shown.

Can someone explain what is happening?

Comments

John Murray · Dec 14, 2017

What is your Caché version?

w $zv
0
Arto Alatalo  Dec 15, 2017 to John Murray

Cache for Windows (x86-64) 2016.1

0
Arto Alatalo  Dec 15, 2017 to John Murray

John,

  • There were no changes neither to ns configuration nor to db configuration.
  • Looks like ns gets its twin as soon as updated routines are imported into this namespace.
  • The issue happens on production db only, we can't repeat it on test databases of same version.

If I see your explanations right, the issue is just a harmless result of some internal Cache's behaviour, so I should not really care, right? 

0
Keith Avery · Dec 14, 2017

"^^c:\databases\user" is an implied namespace based on the directory name. 

You can enter an implied namespace yourself by issuing something like >ZN "^^"_$ZU(12,"USER")

Once you have entered an implied namespace, it looks like it appears in the array returned by ListAll()

I suspect that if you load classes, routines or globals in the Management Portal and choose "Database" instead of "Namespace" in the Explorer that you will then be making use of an implied namespace.

0
Arto Alatalo  Dec 15, 2017 to Keith Avery

ok, thanks for explanations.

We do the import always in the same way for many years and never saw this problem, but I doublecheck with my colleagues the way used last time

0
Keith Avery · Dec 14, 2017

You'll find several references when you search the Caché documentation for "IMPLIED NAMESPACE."

0
John Murray · Dec 15, 2017

As noted by Keith Avery in his comment, the ListAll classmethod of %SYS.Namespace may also include implicit namespaces. This is mentioned in the class doc. I haven't verified, but I guess that you may get different results from ListAll() if you run it once immediately after Cache startup and again after Portal has been used to change namespace definitions (e.g. mappings).

ListAll() is implemented using calls to the undocumented $ZUTIL(90) function. I dug up some WRC information we received in 2010 about a change in behaviour in that function starting with Caché 2010.2. The summary was:

SML1081 - Support single namespace activation and reduce usage of mapping memory.

0
John Murray  Dec 15, 2017 to Arto Alatalo

It shouldn't matter to you. I suggest you just ignore results that begin with "^"

0
Eduard Lebedyuk · Dec 16, 2017

Got the same problem, I use SELECT DISTINCT as a workaround.

0