As far as I know .abf file format, it is just backup for MSSQL Databases. So, It is not possible and will not possible in any way. And all this conversion will not be such easy. And you should understand that Cubes, that not about data before you should migrate all the data, and create new cubes in Caché with knowledge about, how it was in MS SQL.

I would agree, It may look quite expensive. But I just compared it with some other conferences like Oracle, Apple, Google, and I found that all of them cost quite close, even usually bigger.

I want to add, something. I'm Russian, and for us, it cost even much more expensive than for you. And unfortunately, last three years, I participated GlobalSummit and I think I was alone from Russia, except IS. But anyway, if I am not mistaken, last Global Summit participated by more than 200 people from 23 countries, but most of these people from the US.

I would suggest that you working on frontend side in the browser, and call some REST API written in Caché or not, it does not matter. So, your code in JavaScript.

var data = getDateFromRest(); // you got some data from server, no so matter how you did it.

I suggest that your data is array, so, you could use map function and it contains something like this [{ "title": "car", "currency": "USD", "cost": "10000" }]

var newData = data.map(el => { return { name: el.title, value: el.cost + el.currency } })

will give you new array [{ "name": "car", "value": "10000USD" }]

Next time, when you have a question, please create it from the main page, not as a comment to the post. In this case, you may get the response much quicker.

And to you question, on which side you have to do such transformation? Do you call some external REST API from Caché, or do you call some API written in Caché from your WebApplication which worked in Browser, or another way?

I have not used UnitTests before but looks like, you can just analyze ^UnitTest.Result global, by latest index.

USER>set sc=##class(%UnitTest.Manager).DebugRunTestCase("", "MyPackage.Tests","","TestAdd")

===============================================================================
Directory: /opt/cache/dev/tutorials/UnitTestEx/
===============================================================================
  (root) begins ...
    MyPackage.Tests begins ...
      TestAdd() begins ...
        AssertEquals:Test Add(2,2)=4 (passed)
AssertNotEquals:Test Add(2,2)'=5 (failed)  <<==== **FAILED**
(root):MyPackage.Tests:TestAdd:
        LogMessage:Duration of execution: .000045 sec.
      TestAdd failed
    MyPackage.Tests failed
  Skipping deleting classes
  (root) failed

Use the following URL to view the result:
http://192.168.56.140:57774/csp/sys/%25UnitTest.Portal.Indices.cls?Index=5&$NAMESPACE=USER
Some tests FAILED in suites:

USER>zw ^UnitTest.Result(^UnitTest.Result)
^UnitTest.Result(5)=$lb("2017-05-31 12:08:01",.0013,"MacBook-Pro.local","CACHE","Cache for UNIX (Apple Mac OS X for x86-64) 2016.2 (Build 736U) Fri Sep 30 2016 11:56:58 EDT","USER","","")
^UnitTest.Result(5,"(root)")=$lb(0,.001218,"","There are failed TestCases")
^UnitTest.Result(5,"(root)","MyPackage.Tests")=$lb(0,.000554,"","There are failed TestMethods")
^UnitTest.Result(5,"(root)","MyPackage.Tests","TestAdd")=$lb(0,.000045,"","There are failed TestAsserts")
^UnitTest.Result(5,"(root)","MyPackage.Tests","TestAdd",1)=$lb(1,"AssertEquals","Test Add(2,2)=4")
^UnitTest.Result(5,"(root)","MyPackage.Tests","TestAdd",2)=$lb(0,"AssertNotEquals","Test Add(2,2)'=5")
^UnitTest.Result(5,"(root)","MyPackage.Tests","TestAdd",3)=$lb(1,"LogMessage","Duration of execution: .000045 sec.")

I think from this global, will be quite easy to extract needed information to any format.

I don't know how you call Caché method from Jenkins, but anyway you can use $SYSTEM.Process.Terminate in Caché script to exit with an exit status. Something like this.

set tSC=##class(%UnitTest.Manager).DebugRunTestCase(....)
if 'tSC do $SYSTEM.Process.Terminate(,1)
halt

I suggest that you may use csession or cterm to call Caché code, then you should get exit code and send it to Jenkins, which will be recognized by Jenkins as an error and will fail the job.

I would give you a list from fastest to slowest.

  • Local variables. Yes, this sort of variables is limited by memory, but currently, memory cost not so much and if you need only 1GB per server, it should be quite easy to get. By default, the process has only 256MB of memory for local variables, but you can extend it on a fly with special variable $zstorage, and maximum level is 2TB.
  • Process private globals (^||Global), it is already globals but works faster than any other types of globals, but slower than local variables. It is not limited by memory per process, but stored in memory, and could be moved to the disk if you exceed global buffer size.
  • Globals mapped to CACHETEMP (e.g. ^CacheTemp*, ^mtmp), such globals faster than usual globals because in this database journaling of any changes is switched off. 
  • Every other Globals, but still depends on is this database used journaling changes or if changes were made in a transaction. 

Looks like you've copied some example from the documentation. But removed some by your opinion not needed lines.

Original code looked like:

    //create Ensemble request message with given ID
    set request=##class(ESOAP.CustomerRequest).%New()
    set request.CustomerID=ID

    //send Ensemble request message 
    set sc= ..SendRequestSync("GetCustomerInfoBO",request,.response)
    if $$$ISERR(sc) do ..ReturnMethodStatusFault(sc)

You left only the last line. Where checked result from the previous one, in variable sc, as this variable is not defined in your code you got this error in SOAP

<UNDEFINED>zTestOperation+1^Test.WebService.1 *sc

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>
}

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