When you define UrlMap, you should remember, that Caché uses Regular expressions. So, you can just put (?i) before Url, to make regular expression case insensitive

XData UrlMap [ XMLNamespace = "http://www.intersystems.com/urlmap" ]
{
<Routes>
    <Route Url="(?i)/user" Method="POST" Call="User"/>
    <Route Url="(?i)/emailactivation" Method="POST" Call="EmailActivation" />
    <Route Url="(?i)/login" Method="POST" Call="Login"/>
</Routes>
}
Dmitry Maslennikov · Apr 29, 2017 go to post

It is possible to get some errors depends on how long query in your URL. It is not a good idea to have such long values in a query. And such value should be escaped to be valid to place in URL. Instead much better to send data as a form in POST.

Dmitry Maslennikov · Apr 25, 2017 go to post

In my previous company, administrator used Veeam to backup Caché databases as well. And as I know it works well. It uses some scripts to call ExternalFreeze Caché before, and ExternalThaw after, just backup, without any checks. All Caché instances work on Windows.

Dmitry Maslennikov · Apr 25, 2017 go to post

command WRITE, outputs $listbuild in binary format, if you would use ZWRITE, it would show you $lb

I've just made variable from your output

USER>zzdump val

0000: 02 01 04 01 61 61 04 01 4A 4A                           ....aa..JJ
USER>zwrite val
val=$lb("","aa","JJ")

Just read the documentation and you will get everything needed to work with $listbuild

Dmitry Maslennikov · Apr 16, 2017 go to post

With Studio, you will have only one option, is to store sources from server's side. Any Studio plugin works in Caché, and this code could decide where to store code. But developers should also have access to the same folder. If you have authorization on your Caché server, it will be quite easy to split settings and storing sources on disk for every developer.

But If you would choose Atelier, you should not care about it. Atelier all changes store on client's side. And no matter how many developers works on one server.

Dmitry Maslennikov · Apr 15, 2017 go to post

How about to add basic authorization to WRC.

Now it is not possible to download some distributive from WRC in one command in Linux. In first, you should send login and password as a form, save cookies after some redirects. And then it will be possible to download with this cookies. And this command looks so big.

wget -qO /dev/null --keep-session-cookies --save-cookies /dev/stdout --post-data="UserName=$WRC_USERNAME&Password=$WRC_PASSWORD" 'https://login.intersystems.com/login/SSO.UI.Login.cls?referrer=https%253A//wrc.intersystems.com/wrc/login.csp' \
 | wget -O - --load-cookies /dev/stdin "https://wrc.intersystems.com/wrc/WRC.StreamServer.cls?FILE=/wrc/distrib/$cache-lnxrhx64.tar.gz" \
 | tar xvfzC - . 

I would expect to see a much easiest way.

​curl -u $WRC_USERNAME:$WRC_PASSWORD https://wrc.intersystems.com/wrc/WRC.StreamServer.cls\?FILE\=/wrc/distrib/$cache-lnxrhx64.tar.gz
 | tar xvfzC - .

Is it possible to do it, or maybe you can recommend some other way?

And also, will be good to get some API, where I could ask for link to latest version, or for some particular major version, e.g. 2017.1, and for particular platform. So, I could use it to download latest version. 

Dmitry Maslennikov · Apr 14, 2017 go to post

Looks like, do you use integration in Studio? It is a Java application, and as you class is so big, maybe it working so long, and you did not wait for the result. 

Dmitry Maslennikov · Apr 13, 2017 go to post

I would suggest also to use such a great tool as source code analyzer for COS, and it is the first ever for COS. You can look at the demo. This project is still in a progress, but anyway, can already help to prevent some bugs. And remember, that you can suggest adding some new rules, which you sure will be useful.

Dmitry Maslennikov · Apr 11, 2017 go to post

Some of such configuration classes contains methods Modify and Get, it may help to easy modify configuration, in a few lines

set props("DeepSeeEnabled")=1​
set sc=##class(Security.Applications).Modify("/csp/myapp", .props)

Would be much better, if InterSystems will add OpenSearch to their documentation. And I think it will be enough only for the public version. And in this case, it will be supported in all modern browsers, without installation anything external.

Something like this.

<?xml version="1.0"?>
<OpenSearchDescription xmlns="http://a9.com/-/spec/opensearch/1.1/">
 <ShortName>InterSystems docs latest</ShortName>
 <Description>InterSystems Ensemble Documentation latest Version</Description>
 <Url type="text/html" method="get" template="https://docs.intersystems.com/latest/csp/docbook/DocBook.UI.SearchPageZen.cls?KEY=&KeyWord={searchTerms}"/>
</OpenSearchDescription>
Dmitry Maslennikov · Mar 30, 2017 go to post

Try this

do ##class(%SYS.Journal.File).GetPrev("c:/cache/mgr/journal/20170330.002", prevFile)
write prevFile
Dmitry Maslennikov · Mar 27, 2017 go to post

Nowadays when somebody says "chatbot", it means, that such a chatbot will work on one of the popular chats. Like, Slack, Telegram, or maybe Skype. So, where your chat bot will work?

About functionality. Some time in the organization could be useful, such commands as create the new instance, or maybe clone some old one. And anyway you missed at least one command, it is a list of available instances.

But for such bot, I think should be much more than just to start or to stop instances. It is also should support, something like deploying some services there.

Dmitry Maslennikov · Mar 26, 2017 go to post

you should look at XSLT, it can help transform xml as you need

ClassMethod SplitXML() 
{

    for item="market","product" {
        set params("path")="/doc/"_item
        
        Set tSource=##class(%Dictionary.CompiledXData).%OpenId(..%ClassName(1)_"||XML").Data
        
        Set tXSL=##class(%Dictionary.CompiledXData).%OpenId(..%ClassName(1)_"||XSL").Data

        // Transform the source according to the XSL
        Set tSC=##class(%XML.XSLT.Transformer).TransformStream(tSource,tXSL,.tOutput,,.params)
        If $$$ISERR(tSC) Quit
        
        write !!
        // Output the result to the screen
        Set tSC=tOutput.OutputToDevice()
    }
}

XData XML
{
<?xml version="1.0"?>
<doc>
<header></header>
<product><test>1</test></product>
<market><test2>2</test2></market>
</doc>
}

XData XSL
{
<?xml version="1.0"?>

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">

<xsl:param name="path"></xsl:param>

<xsl:output method="xml" indent="no"/>
 
<xsl:template match="/">
    <xsl:copy-of select="$path"/>
</xsl:template>
    
</xsl:stylesheet>
}

will output like below

USER>d ##class(Test).SplitXML()


<?xml version="1.0" encoding="UTF-8"?><market><test2>2</test2></market>

<?xml version="1.0" encoding="UTF-8"?><product><test>1</test></product>
Dmitry Maslennikov · Mar 26, 2017 go to post

you can do it with ccontrol tool

Syntax:
    ccontrol create <instance name> <parameters>
Description:
    Create an instance's entry in the Cache registry.
Parameters:
    directory=<installation directory name>
    versionid=<version identifier>
Example:
    ccontrol create mystuff directory=/usr/cachesys versionid=2008.2.0.357.0
Dmitry Maslennikov · Mar 23, 2017 go to post

It is not so simple as would appear in the first time. Because you can have some mentions to old package in a source. In studio only possible to rename some class with refactoring feature. Unfortunately, this feature is not documented, or I have not found.

Dmitry Maslennikov · Mar 23, 2017 go to post

Hi, I would not recommend thinking seriously about Caché in windows server core container, I think it is too early, yet.