Article Rustam Ibragimov · Sep 4, 2018 4m read

Have you ever thought why the code that you write in Caché Object Script is exported to an XML file?


The news is that it’s time to change. Starting from the release of Atelier, a new development environment, and Caché 2016.2, you will be able to export and import files in the format that you use in the studio, into the so-called UDL (Universal Definition Language) format. You can now write code that is not only fast but also looks beautiful in the exported form. However, we get another equally serious issue: if all new projects are in the UDL format, what will happen to backward compatibility?


L

1
0 1350
Question Rustam Ibragimov · Sep 17, 2016

Hello, guys.

Say I have two horologs or timestamps, how can I compare them? I know that just time1 > time2 doesn't work because it will compare them as strings which is not correct. 

6
0 3283
Question Rustam Ibragimov · Sep 9, 2016

Hello, guys. 

I found one interesting moment in Cache Object Script. It doesn't have(or at least I didn't find) trimming function. By trimming I mean if a string has some whitespaces/tabs/carriage returns from very beginning or/and from very right, this function removes them. 

  I have found several workaround ways. 

1. Using Cache Basic

ClassMethod TrimCacheBasic(str As %String) As %String [ Language = basic ]{Return Trim(str)}

2. Using SQL

ClassMethod TrimSQL(str As %String) As %String
{
	set tStatement = ##class(%SQL.Statement).%New()
	set tSC = tStatement.%Prepare("SELECT TRIM(?)")
6
0 2123
Question Rustam Ibragimov · Aug 30, 2016

I know that Cache files can be stored as XML and UDL based files. Is there any way to determine in which format the file(class, routine, dfi and so on) is stored? Because you can easily name your XML based file as class.cls and it will be perfectly valid. 

I know that one way to check whether this file is in XML format is just try to parse it like 

Set st = ##class(%XML.TextReader).ParseStream(contentStream)

if $$$ISERR(st) return $$$NO

else return $$$YES

However, is there a better way? 

4
0 424
Question Rustam Ibragimov · Aug 5, 2016

Hello, guys.

I need to copy the text from one stream to another filestream and save it. I am using  

do fileStream.CopyFromAndSave(rtn.Code)

However, if "rtn" stream contains Russian characters I get something like "???". Is there any way to convert stream to Unicode?  Something like $zc(str, "O", "UTF8") for streams.

3
0 475
Announcement Rustam Ibragimov · Aug 4, 2016

Hello, guys. 

We have recently created a syntax highlighting for COS for Atom text editor. You can find it on https://github.com/intersystems-ru/atom-language-cos

Installation: 

  1. Download or clone this repository
  2. Copy everything to ~/.atom/packages/
  3. If you have your Atom editor open, then you need to reload it (enter  Window: Reload in Command line)

It's been few days since the release, so please if you find a bug, let us know through creating an issue or forking and making a pull request. 

P.S. After it gets more or less usable, we will use this syntax as a basis for GitHub highlighting for COS.

0
0 617
Question Rustam Ibragimov · Jul 26, 2016

Hello, guys.

I have a set of file names (e.g. file.cls, file2.mac and so on) and I need to check whether these files are mapped in %ALL or current namespace.

I found that if I open Globals in the current namespace I can see mapped packages. And If I open this global I see all files that are  to this namespace and %SYS. The problem is these files are enumerated in a json object(apparently)

ex. "{""class"":{""%Activate.Enum"":{},""%Activate.GenericObject"":{""CreateObject"":0,""GetObject"":0},""%Activate.HandleEvents"")

But, is there a way to determine whether this file is mapped using some method? 

1
0 419
Question Rustam Ibragimov · Jul 20, 2016

Hello, guys. 

I want to add a class to my project. This class is in UDL format. 

I know that there is a method:  ##class(%Compiler.UDL.TextServices).SetTextFromStream. The problem is that to use this method I need to know the name of the class (including all packages) in advance. But,  a class can have any name(I mean C:/source/AAA/BBB/CCC.cls, but the real name is Sample.Human.cls).

For now I found only one way to get to know the name of a class - just parse the class code and search for a word which is followed by "Class" word. Is there any better way to do that? 

P.S.

6
0 484
Question Rustam Ibragimov · Jul 15, 2016

Hello, guys.

I have an external file that contains data in UDL format(as in Studio, not XML) and I need to somehow overwrite my source file with that file. 

I tried to use this snippet for .mac file

 set rtn = ##class(%RoutineMgr).%OpenId("les.mac")
 rtn.Code.WriteLine("some text")

It says that status is 1, but I don't see any difference in my source file.

Is there any way to overwrite source files, not only .mac but .cls, .int, .dfi?

4
0 667
Question Rustam Ibragimov · Jul 13, 2016

Hello, guys!

I want to get access to the folder where all files of the namespace are stored using COS. I found a way to get access to class files and found a folder where all csp, html, css etc files are stored.

However, is there any folder which contains all files(even .mac and .int)?  

Or, probably, there is a method which gives all files content?

2
0 470
Question Rustam Ibragimov · Jul 12, 2016

Hello, everyone!

I opened one project and there I found such lines as 

$$Export^%occXMLExport(filename,"-d /diffexport",InternalName)

Do DecomposeStatus^%apiOBJ(sc,,"d")

The problem is I can't go to their definition and find them in documentation. It says that they don't exist on the server. However, the project works and these routines execute. 

How can I import them into my project? 

3
0 842