go to post Dmitry Maslennikov · Sep 11, 2020 I have not been worked with Visual Studio, so, have no idea how it works there. But Instead of Studio, I would recommend using VSCode, of course, it already supports debugging, for sure you can watch variables (and expressions) as well as hovering variables. It does not support objects in a some readable way but supports it as an expression, so obj.property will work.
go to post Dmitry Maslennikov · Sep 11, 2020 Unfortunately, for some reasons some systems may not use the latest versions of InterSystems products. While Integrity checks in some cases can be used on lower versions. And from the other side, for some systems reversing the system to some backup can be used as only last chance to restore the data, due to the sensitivity of stored data and the impossibility to restore data since the latest backup. So, If I would find database degradation I would better attempt to recover it, fortunately, I have an experience, and possibly lose some data, but the amount of lost data will be significantly less then when I would use a backup. Around 100 hundred GB journals per day, with tens of terabytes of data supposed for backup, make the task to restore system quickly as impossible for a system that has to be available with no downtime.
go to post Dmitry Maslennikov · Sep 10, 2020 This feature, just implemented, so, you can't see it in a public stable release. But, you can install manually the latest beta release, where it should be already available. Download vsix file, and install it in VSCode with command Install from VSIX...
go to post Dmitry Maslennikov · Sep 10, 2020 Check the value stored in ^%SYS("CSP","DefaultFileCharset"), if there is no value or there is something different to utf-8, try to change it there.
go to post Dmitry Maslennikov · Sep 9, 2020 So, it means, that now you have no way how to use this data anymore. Printing ability provided by browser with no option to change printer. And no way to access disk drive directly.
go to post Dmitry Maslennikov · Sep 9, 2020 I would offer you to change %Stream.FileCharacter with %Stream.BinaryCharacter. While for Base64 is Character is ok, pdf is a binary format and %Stream.FileCharacter can break it.
go to post Dmitry Maslennikov · Sep 7, 2020 In that particular case, we have 16k blocks, due to the past issues with caching big string blocks over the ECP. But I think, there are a few ways how integrity can be improved, for such cases. I see at least two reasons why we should check integrity periodically. We don't have any errors in the database, which may cause to a system failure. We don't have any issues in the database, and we ensure that our data is completely available. I'm faced with an issue when error on a pointer level causes issues with WriteDaemon, and our system just died, when the application tried to get access to the data. And it took some time to figure out why it has happened, even when we did not have any issues with database at all, just only with ECP. That happened in the version 2012.2. And I'm thinking I would be able to set how deeply I could scan blocks, let's say, don't care about data blocks, just scan only pointers blocks. I don't have proportions, but I'm sure that in most cases we would have much more data blocks than pointers blocks. So, it would make integrity check give some results faster. I know quite well how the database looks inside. But I did not manage, yet to look at how database backups work, and mostly interesting incremental backups. As I know backup works with blocks, so, maybe there is a way to make incremental integrity checks as well. It will not help to find the issues that happened in unchangeable blocks due to hardware issues but could say, that lately changed data is Ok.
go to post Dmitry Maslennikov · Sep 5, 2020 To find a good replacement, the most important to know is a reason, why you need this information in the browser? The first sample looks like you are looking for a default printer in the system. And the second one, looking for a specific disk drive, with the letter U, and it should be network drive. How are you going to use this information after that? Maybe the best way will be to completely change the way how you doing it or just forget about it. Anyway, this happens due to a wish from browsers vendors, to increase a security level, so, they completely declined to use NPAPI and ActiveX. And as a side-effect of it, it's now impossible to use Java applets as well. And usually, to fix it, the simplest way was to create own simple application, which has to be installed on the users machine, and web-application application was able to connect to locally installed application through WebSockets or simple rest API in that application. ps. I can help you with development if you need any help.
go to post Dmitry Maslennikov · Sep 5, 2020 Not exactly correct, Linux allows it, but not sure if Caché/IRIS can use this way.
go to post Dmitry Maslennikov · Sep 3, 2020 What would you recommend, if the amount of data which have to be checked is quite large, let's say 100TB? For sure, it's not one solid database file, split by many files with sizes up to about 6TB. But most of the data is alive.
go to post Dmitry Maslennikov · Aug 26, 2020 You need to write your own %ZSTOP routine, which can catch it. Look at the documentation
go to post Dmitry Maslennikov · Aug 24, 2020 menu.mac ROUTINE menu menu(routine) { Set rtn = ##class(%RoutineMgr).%OpenId(routine_".mac") Quit:'$IsObject(rtn) Set menu = "" While 'rtn.Code.AtEnd { Set line = rtn.Code.ReadLine() Continue:$Char(9,32,35)[$Extract(line) Continue:line'[" ; " Set label = $Piece($Piece(line, " "), "(") Set title = $Piece(line, " ; ", 2, *) Set menu = menu _ $Listbuild($Listbuild(label, title)) } Quit menu } asLine(menu, pos) public { Set menuItem = $Listget(menu, pos) Quit:menuItem="" """""" Set $Listbuild(label,title) = menuItem Quit "$Char(13,10)_""" _ $Justify(pos, 4) _ ". " _ title_ """" } menu.inc ROUTINE menu [Type=INC] #Execute Set menu = $$^menu(rtname) Write !,"--------Menu---------" write ##Expression($$asLine^menu(menu,$Increment(menuLineNum))) write ##Expression($$asLine^menu(menu,$Increment(menuLineNum))) write ##Expression($$asLine^menu(menu,$Increment(menuLineNum))) write ##Expression($$asLine^menu(menu,$Increment(menuLineNum))) write ##Expression($$asLine^menu(menu,$Increment(menuLineNum))) write ##Expression($$asLine^menu(menu,$Increment(menuLineNum))) write ##Expression($$asLine^menu(menu,$Increment(menuLineNum))) write ##Expression($$asLine^menu(menu,$Increment(menuLineNum))) write ##Expression($$asLine^menu(menu,$Increment(menuLineNum))) write ##Expression($$asLine^menu(menu,$Increment(menuLineNum))) write ##Expression($$asLine^menu(menu,$Increment(menuLineNum))) write ##Expression($$asLine^menu(menu,$Increment(menuLineNum))) write ##Expression($$asLine^menu(menu,$Increment(menuLineNum))) write ##Expression($$asLine^menu(menu,$Increment(menuLineNum))) write ##Expression($$asLine^menu(menu,$Increment(menuLineNum))) write ##Expression($$asLine^menu(menu,$Increment(menuLineNum))) write ##Expression($$asLine^menu(menu,$Increment(menuLineNum))) write ##Expression($$asLine^menu(menu,$Increment(menuLineNum))) Write !! do { Write $Char(13),"Option? ",*27,"[0K" Read menuOption Quit:menuOption="" Quit:"qQ"[$Extract(menuOption) Quit:$Listget(menu,+menuOption)'="" } while 1 Write ! if (+menuOption) { Set label = $Listget($Listget(menu, menuOption)) Do @label } Quit And some routine which will have to have menu ROUTINE test #; just include menu, at the place where you need it #Include menu quit task1 ; Task 1 Write !,"Some work 1" quit task2 ; Task 2 Write !,"Some work 2" quit task3 ; Task 3 Write !,"Some work 3" quit task4 ; Task 4 Write !,"Some work 4" quit task5 ; Task 5 Write !,"Some work 5" quit task6 ; Task 6 Write !,"Some work 6" quit task7 ; Task 7 Write !,"Some work 7" quit task8 ; Task 8 Write !,"Some work 8" quit task9 ; Task 9 Write !,"Some work 9" quit task10 ; Task 10 Write !,"Some work 10" quit and call it USER>d ^test --------Menu--------- 1. Task 1 2. Task 2 3. Task 3 4. Task 4 5. Task 5 6. Task 6 7. Task 7 8. Task 8 9. Task 9 10. Task 10 Option? 1 Some work 1 Menu list changed after compile, but routine should be saved as MAC. The final INT code contains the generated menu.
go to post Dmitry Maslennikov · Aug 21, 2020 As I don't know your version of Caché, I'll suggest that it's quite new. So, I got this code working for IRIS in docker(Ubuntu). Did not check Windows. auto Set fs = ##class(%Stream.FileCharacter).%New() Set a = $Random(100) Set b = $Random(100) Do fs.WriteLine(a) Do fs.WriteLine(b) Set ccontrol = $Select($ZVersion["IRIS": "iris", 1: "ccontrol") Set ccontrol = ccontrol _ $Select($$$isWINDOWS: ".exe", 1: "") Set ccontrol = ##class(%File).NormalizeFilename(ccontrol, $System.Util.BinaryDirectory()) Set instance = ##class(%SYS.System).GetInstanceName() ZWrite a,b Set stdin = fs.Filename Set stdout = ##class(%File).TempFilename() Set sc = $zf(-100, "/STDIN="""_stdin_"""/STDOUT="""_stdout_"""", ccontrol, "session", instance, "-U", $Namespace, "TestRun^test") ZWrite ^zparas Quit TestRun Write !,"Enter First Variable Name: " R a Write !,"Enter Second Variable Name: " R b Set ^zparas=a_" "_b Quit And The output like this a=17 b=62 ^zparas="17 62"
go to post Dmitry Maslennikov · Aug 21, 2020 I did not find any mention of ECDSA in InterSystems products, so, not sure if it's supported natively. I would look at some external tools which could help you with it. And you can start from openssl. And If I undestood correctly, you'll also need a public certificate, which used to make such a signature.
go to post Dmitry Maslennikov · Aug 19, 2020 First of all, classes code stored completely differently with plain routines. So, the best way to compare two namespaces is to export all the code in UDL format, which in fact the same as in Studio, usually it was just XML. From my side I would recommend using VSCode for this task, there you can export any kind of source from InterSystems products with any version since 2016.2. How this process would look there. open any empty folder in VSCode Configure it to desired server and namespace export source code from InterSystems Explorer view do, git init, and commit all exported files delete all sources switch to another namespace, in the same explorer view, by just opening another namespace. export all sources again. git will show the differences. As I'm a developer of VSCode extension for InterSystems, you can contact me directly, or through public issues
go to post Dmitry Maslennikov · Aug 17, 2020 On Windows with cterm.exe you can write special terminal scripts. on Linux, as I know terminal scripts not available, so, you just prepare the list of answers, if it's fixed. and just send it to stdin. csession -U MYNAMESPACE ^MyRoutine < myanswers.txt or cat myanswers.txt | csession -U MYNAMESPACE ^MyRoutine
go to post Dmitry Maslennikov · Aug 17, 2020 I've found that folder, but it twice less in size, then the same files on hl7. And as I understood correctly, it was loaded when FHIR server created, but it does not help.
go to post Dmitry Maslennikov · Aug 16, 2020 I have a configuration with Caché 2018.1 as an ECP Data server and a few ECP Application servers on Ensemble 2012.2. The code is compiled and deployed for 2012, only, but stored on 2018.1. The data server even does not have a namespace for an application. It only mounts databases, and code databases just like any other data, which used by application servers. Ensemble Production works on a separate application server. And ECP Data server uses mirroring, so, my ensemble production and integrations does not care about IP migration at all, they work in the same place all the time. In case of when ECP Application server may work on different versions, I would recommend storing all the versions of code in one place anyway on ECP Data Server. Just mount a specific code version on different platforms.