go to post Alexey Maslov · Sep 11, 2019 Hi Murray,I was interested in journal file switching recognition rather than primary to alternative directory switch.Thanks anyway.
go to post Alexey Maslov · Aug 30, 2019 Actual rules used for names and surnames transliteration are more complex as they can be phonetically dependent. E.g. "Егор" -> "Egor", but "Иеремия" -> "Iyeremiya".
go to post Alexey Maslov · Aug 30, 2019 Eduard,You have just forgotten about "Щ" in your awesome one-liner, while the $replacing of "Ш" is excessive. So, it should look like that: $tr($zcvt($replace($replace($tr(russian, "абвгдезийклмнопрстуфхыэАБВГДЕЗИЙКЛМНОПРСТУФХЫЭЖЦЧШЮЯжцчшюяьЬъЪ", "abvgdeziyklmnoprstufhyeABVGDEZIYKLMNOPRSTUFHYE婨味䍨卨奵奡穨瑳捨獨祵祡"),"щ","shch"),"Щ","Shch"),"O","UnicodeBig"),$c(0))
go to post Alexey Maslov · Aug 28, 2019 Another part of my solution was published as a comment here.This trick with answers (fin.txt) and messages (fout.txt) files was possible with background job only as only this kind of Caché processes allows the separation principal-input device from principal-output one.Controlling the execution state would not be so easy in this case as fout.txt is kept opened during the execution of JRNREST. I partially bypass this limitation looping my dejournaling activity for each journal file I need to restore and feeding JRNREST with only one file on each iteration (pLast = pFirst); so it's possible to report the restore state of each file that has been restored with very modest delay as the restoration of one journal file is usually a quick process.HTH and happy coding to you!
go to post Alexey Maslov · Aug 28, 2019 I'm confused a bit because you:...don't want it to run in the backgroundand...don't want to use interactive modeat the same time. So, what do you really want? Maybe your question worth a separate article.
go to post Alexey Maslov · Aug 27, 2019 The approach discussed can be useful for background jobs as UI is not available.Running standard JRNREST utility would be easiest way otherwise.
go to post Alexey Maslov · Aug 27, 2019 Robert,As to (simulated) named arguments approach:(+): Good readability.(-): We should be pretty sure that values would not contain separators, neither "=" nor ":", although screening of them is not a very hard problem ("\=", "\:", "\\"). (-): Handling binary data (e.g., $list or $bit) seems to be more serious problem. In this case it seems that one argument structured as $lb($lb("name1",value1),...$lb("nameN",valueN)) is better option.
go to post Alexey Maslov · Aug 20, 2019 I use option 1 (macros) with MAC routines and usually option 2 (parameters) with classes. I'd always use macros if it was possible to define them class wide without placing inside INC routines.
go to post Alexey Maslov · Aug 16, 2019 David,you can try set rc=$zf(-1,"export MYVAR="_someValue) while it would hardly work as Caché process environment will be destroyed after the process halt. Honestly, I've never tried it. I usually use signal files to pass values back from Caché, as it was shown in the 1st sample here: How to return the status code of Cache process to OS shell script? See Timothy Leavitt's answer to the same post for another option which is more convenient when you are to return numeric values.
go to post Alexey Maslov · Aug 14, 2019 Hi Alexander,Bypass is easy, and I've already suggested it in my initial post.As to use cases... maybe I'll describe them later. The method of journal switch detection is not critical for them.Thank you anyway.
go to post Alexey Maslov · Aug 2, 2019 No, it works and all installations but yes, it needs 8 Bit charactersIt needs Unicode characters as well, otherwise it fails. Just compare 8 bit instance run: USER>w "IsUnicode = ",$zbitget($zversion(0),1) IsUnicode = 0 USER>s x="f i=1:1:100 w:i#3=0 ""Fizz"" w:i#5=0 ""Buzz"" w:'$x i w ! " w $l(x) 54 USER>s xx=$zwpack(x) S xx=$ZWPACK(x) ^ <WIDE CHAR> with Unicode one: USER>w "IsUnicode = ",$zbitget($zversion(0),1) IsUnicode = 1 USER>s x="f i=1:1:100 w:i#3=0 ""Fizz"" w:i#5=0 ""Buzz"" w:'$x i w ! " w $l(x) 54 USER>s xx=$zwpack(x) USER>x $zwunpack(xx) 1 2 Fizz ...
go to post Alexey Maslov · Jul 31, 2019 Hi James,Agree with you, parsing terminal output is not the smartest solution. I always try to avoid it using intermediate files. E.g. (from real life): rm -f $mydir/db_temp NspToCheck=$nspace csession $instance -U%SYS << EOF > /dev/null set fn="$mydir/db_temp" o fn:("WNS"):1 u fn try { zn "$NspToCheck" w \$s(\$zu(5)=\$zcvt("$NspToCheck","U"):\$zutil(12,""),1:"$NspToCheck") } catch { w \$p(\$ze,">")_">" } c fn h EOF DbQms=$(cat "$mydir/db_temp") Here the default DB of the namespace $NspToCheck (or $ZError code) is written to $mydir/db_temp file, than it goes to $DbQms shell variable and processed as needed. Initial answer was amended.
go to post Alexey Maslov · Jul 30, 2019 I'm confused a bit. Do you keep asking on this issue? If not, please describe your situation in details.
go to post Alexey Maslov · Jul 30, 2019 Sorry, didn't mentioned your *new* quesion about environment variables.
go to post Alexey Maslov · Jul 30, 2019 After cheching my großbuch I found that I was wrong with starting version: $zf(-100) is available since 2017.2.1 (Build 801_3), while your build hasn't got this "_3" suffix.
go to post Alexey Maslov · Jul 30, 2019 Zdeněk,I'm just curious: are you intentionally testing $zf() stuff on command (`pwd`) that doesn't exist in your particular OS?
go to post Alexey Maslov · Jul 30, 2019 Hi Murray,Thank you for responding.You mentioned earlier that switching to Direct I/O would slow down Caché On-line Backup; it sounded strange for me: if database I/O and journal I/O can use different strategies, why On-line Backup can't always use buffered I/O regardless of database I/O strategy?
go to post Alexey Maslov · Jul 30, 2019 Your sample works for me: USER>s rc = $zf(-100,"/SHELL","pwd") /cachesys/mgr/user USER>w $zv Cache for UNIX (Ubuntu Server LTS for x86-64) 2017.2.2 (Build 865U) Mon Jun 25 2018 10:48:26 EDT What Caché version are you using? $zf(-100) was added in 2017.2.1 (Build 801_3). For older versions use $zf(-1 or -2), while upgrade to latest Caché (or even IRIS?) release would probably be the better choice.
go to post Alexey Maslov · Jul 30, 2019 The simplest way to interact from within bash with Caché looks like this: #!/bin/bash ... csession TEST -U%SYS << EOF set \$namespace="%SYS" write ##class(Security.System).AutheEnabledGetStored("SYSTEM") halt EOF ... next line of your bash script ... Output of Caché `write` and `zwrite` commands will go to STDOUT. As usual, you can redirect it wherever you want, e.g. csession TEST -U%SYS << EOF >> /home/james/mysession.log As parsing csession log can be a nasty task, I usually try to avoid it by construct: #!/bin/bash ... tf=/home/file.tmp ... csession TEST -U%SYS << EOF > /dev/null open $tf:("NWS"):1 use $tf write ##class(Security.System).AutheEnabledGetStored("SYSTEM") close $tf halt EOF ... result=$(cat "$tf")
go to post Alexey Maslov · Jul 26, 2019 Murray,Do you recommend this setting (wduseasyncio=1) for production as well? If it slows down all disk i/o, what will happen with journaling?