go to post Julius Kavay · May 6, 2021 Both possible structures are considered. Here, I use the examples from my previous posting: set obj=##class(DC.Rick.MemberData).%OpenId(1) do obj.%JSONExport() --> {"members":[{"dob":"1990-07-18","firstName":"Bob","memberId":123956}]} set obj=##class(DC.Rick.MemberData).%OpenId(2) do obj.%JSONExport() --> {} The second example outputs {} only and not {"members":null}, I don't know why. Maybe there is a parameter which control this behavior, please ask WRC. From the view of data value, you can consider {} and {"members":null} as equal. write {"members":null}.%GetTypeOf("members") --> null write {}.%GetTypeOf("members") ----------------> unassigned Both representation mean, the members property has no value. But, yes, but you can philosophize about it ...
go to post Julius Kavay · May 4, 2021 It depends on... Who is sitting at the other end? A Cache/IRIS server or a third-party product? If Cache/IRIS: Mirroring, shadowing are the catchwords, you have to look for. In case of third-party SQL-DB: how fast (how often) want to do your updates? Once a day or (nearly)realtime? I did something like that several years ago... the procedure is (just as a starting point): Our application uses objects, so all the involved classes have an %OnAfterSave() method, something like this Method %OnAfterSave(insert As %Boolean) As %Status { do ..addToTransfer(..%Id()) } with some smartness, like do not add if the record is already in the transfer queue, etc. If you use SQL instead of objects, triggers are your friend. We have also a task, which crates (based on the class definition) a series of INSERT/UPDATE statement(s) and does the transfer with the help of %SQLGatewayConnection.
go to post Julius Kavay · May 4, 2021 The simplest solution was already answered by Robert Cemper in https://community.intersystems.com/post/how-select-random-row-table. I just want to show a more "universal variant" of that solution. First, create an SQL stored procedure class SP.Utilis Extends %RegisteredObject { ClassMethod Random(number As %Integer, dummy As %String) As %Integer [SqlProc] { quit $random(number) // we do not use dummy but we need it!! } } then make your query as follows: select top 10 * from whatever.table where SP.Utils_Random(100,ID)<50 This has following advantages: 1) works with all classes, i.e. the ID column has not to be an integer (greater 0), can be a compound column too (like part1||part2, etc) 2) by adjusting the comparison: Random(1000,ID) < 50 // gives you more "greater" distances then Random(1000,ID) <500 // between the returned rows For testing of edge conditions you can use Random(1000,ID)<0 // no rows will be returned or Random(1000,ID)<1000 // all rows will be returnd With the right side of the comparison you can fine tune the distances between the returned rows. For the dummy argument in the above function you can use an arbitrary column name, the simplest is to use ID because the ID column always exists, it's purpose is to force the SQL-Compiler to call this function for each row (thinking, the result of the Random() function is row-dependet). A comparsion like Random(100)<50 is executed just once. Roberts solution works too because he uses Random(100)<ID but this works only for tables where ID is a Integer (>0). You can verify this by just issuing a simple query select top 10 * fom your.table where SP.Utils_Random(100)<50 You will see (by repeatedly executing the above query) either 10 (subsequente) rows or nothing
go to post Julius Kavay · May 4, 2021 According to your $ZV you have a unicode installation, so there should be no problem, neither with skandinavian- nor with other language characters. Please check your filename string... start a terminal session and then: zzdump FileNameFullPath then check, in the same way, the file name in your file system
go to post Julius Kavay · Apr 28, 2021 ClassMethod Size(file) { if '##class(%File).Exists(file) quit -1 quit ##class(%File).GetFileSize(file) } Returnvalues: -1=File does not exists, 0...n=Filesize
go to post Julius Kavay · Apr 8, 2021 If you get data as ISO-8859-1 (aka Latin1) and have a Unicode (IRIS/Cache) installation then usually you have nothing to do (except, to process the data). What do you mean with "convert the text to UTF-8"? In IRIS/Cache you have (and work with) Unicode codepoints, UTF-8 comes into play only when you export your data but in your case, it will rather be ISO-8859-1 or do I something misunderstand? By the way, if you return your data back to your Latin1 source (as Latin1) then you have to take some precautions because you have an unicode installation, so during the data processing you could mix your Latin1 data with true unicode data from other sources! See: https://unicode.org/charts/ Also, you may download and read: https://www.unicode.org/versions/Unicode13.0.0/UnicodeStandard-13.0.pdf
go to post Julius Kavay · Mar 20, 2021 The best way your problem be solved is, give us a little more information, at least, the error message you get. Of course, this is not a must
go to post Julius Kavay · Mar 17, 2021 Checking status codes is a good starting point... set str=##class(%Stream.FileCharacter).%New() write str --> 4@%Stream.FileCharacter write $system.OBJ.DisplayError(str.LinkToFile("/root/my_file.txt")) --> 1 write $system.OBJ.DisplayError(str.WriteLine("line-1")) --> ERROR #5005: Cannot open file '/root/my_file.txt'1 Your %Save() returns with 1 (OK), because there is nothing to save... Note: on linux, for a standard user (like me now) is forbidden to write to '/root' directory
go to post Julius Kavay · Mar 4, 2021 In addition to Ben's answer, on Windows: netstat -ano | find "LISTENING" will in the far right column show the process ID of the listening process on Linux: sudo netstat -pln | grep tcp the last column shows the process name which is opened the port
go to post Julius Kavay · Jan 14, 2021 I'm not sure, what you want to do, but if you want to read a tiff file by byte-by-byte and the interpret it in some kind, there is a very simple example for the start. The method below returns the file type (gif,jpg,png or tif) based on the magic number. /// Identify an image by its magic number /// (only for gif,jpg,png and tif) ClassMethod ImageType(file, ByRef err) { o file:"ru":0 i $t { s io=$i, err="" u file r x#8 i x?1"GIF8"1(1"7",1"9")1"a" { s typ="gif" } elseif $e(x,1,2)=$c(255,216), $$end()=$c(255,217) { s typ="jpg" } elseif x=$c(137,80,78,71,13,10,26,10) { s typ="png" } elseif $case($e(x,1,4), $c(73,73,42,0):1, $c(77,77,0,42):1, :0) { s typ="tif" } else { s typ="", err="File type unknown" } c file u:io]"" io } else { s typ="", err="Can't open "_file } q typ end() s t="" r:$zseek(-2,2) t#2 q t } I have also a method to retrive the image size (pixelsWidth and pixelsHeight) for the same (gif,jpg,png and tif) files. If you are working on similar problem, I could post this method too.
go to post Julius Kavay · Dec 9, 2020 SystemAdministration-->Configuration-->NationalLanguageSettings-->Defaults/Defs/Imp/Exp First you have to start with a predefined/default table, copy under a new name, select this new table and click on the properties.
go to post Julius Kavay · Dec 9, 2020 To make things clear, the mentioned popup message should be seen by someone, who is (most of the time) working on the servers console. Is it so? Or you want to popup this message on an arbitrary desktop, where a user works? If I need to send a message to a user, either I send an email or I activate a popup message in my client (I have a very special client-UI). By the way, you wrote, I quote "an email is NOT a realistic expectation and far from reliable". Today, (almost) everybody has a smartphone and I think, if somebody does not read an email, he/she won't read thos popup messages either. Of course, you should send short plain text messages and not those fancy bloated colorful emails. So, a way to a solution... you could write a small program (C++, VB, Delphi, etc.) which is started after user login. The program should listen on a TCP port for messages from an arbitrary Cache/Iris (possibly background) application. If such a message arrives, this helper program changes to foreground, displays the message with or without an OK button. That's it.
go to post Julius Kavay · Dec 9, 2020 Store only hashed passwords... that's all. Class DC.MyUsers Extends %Persistent { Property Name As %String; Property Password As %String; Property passHash As %String [ Internal, Private, ReadOnly ]; Property passSalt As %String [ Internal, Private, ReadOnly ]; Parameter ITER = 1024; Parameter LENGTH = 20; Method PassCheck(psw) As %Boolean { set salt = $system.Encryption.Base64Decode(..passSalt) set hash = $system.Encryption.Base64Decode(..passHash) quit $system.Encryption.PBKDF2(psw, ..#ITER, salt, ..#LENGTH)=hash } Method PasswordSet(psw) As %Status { // optionally, quality/requirement-check if '..pswQuality(psw) quit $$Error^%apiOBJ(5001,"Poor password quality") set salt=$system.Encryption.GenCryptRand(8) set hash=$system.Encryption.PBKDF2(psw, ..#ITER, salt, ..#LENGTH) set i%passHash=$system.Encryption.Base64Encode(hash) set i%passSalt=$system.Encryption.Base64Encode(salt) quit $$$OK } Method pswQuality(psw) As %Boolean { quit 1 } }
go to post Julius Kavay · Dec 9, 2020 There are two points, the first (catchwords: server, interaction) was already answered by Dmitriy Maslennikov the second is your 10 second popup button. In my over 40 years of IT-experience, there is one thing (along with others) I have learnd, is: every timeout is wrong, but messages with timeouts are evil! Whatever time you use, it's either too short or too long. Imagine, the phone is ringing abd the user has a hot 20 minute discussion on the phone, in the meantime, your popups comes and goes! Unseen! Sometimes several times! The only resonable solutions are, - if the message is (just) informative and the message text never changes, then put it into a logfile and show nothing. If the message text is a variable text ("Data is saved" vs. "Can't save: No disk space available") then do the popup with one button (or textinput), see below, but DO NOT use timeouts! - if the situation allows the user to choose between multiple answers, then let the popup window with those OK, YES, NO, CANCEL, etc. buttons stay there, as long as the user chooses one of them, or as an alternative (application dependent), offer an ordinary text input and at sometime the user types the answer and pushes the enter key. Messages with (possible with short) timeouts requires a user all the time gazing on the display - which you can't expect. justmy2cents
go to post Julius Kavay · Dec 4, 2020 Instead of inserting debug_macros, try Intersystems TRACE utility. write $$DIR^TRACE("c:\Temp") ; to set an output directory write $$ON^TRACE(jobnr) ; the pid of the process you want to trace ; zn "appNamespace" ; do ^yourProgram ; zn "%SYS" write $$OFF^TRACE(jobnr) ; to stopp the trace do ^TRACE ; to display the trace result TRACE displays the function-/method-calls with arguments.
go to post Julius Kavay · Nov 15, 2020 Just to see things clearer, you do this test directly on Cache server (i.e. local)?And you have logged in with your local (and not, for example with an domain\kevin) account? Cache runs also under the same local "kevin" account?
go to post Julius Kavay · Nov 15, 2020 Hello Kevin, in most of the cases (but not always) the reason for this is the exhaustion of TCP ports, see https://docs.microsoft.com/en-us/windows/client-management/troubleshoot-... too. Grab a windows command prompt and start with netsh int ipv4 show dynamicport tcp this shows you how many ports you have. netstat -ano | find "TCP" shows you all the TCP ports in use (including the process numbers) and netstat -an | find "TCP" | find "CLOSE" shows you all the bad guys. If this is your problem then the solution is: - increase the number of ports (if it's possible) - reduce the cases, where a new port is needed and immediate closing of unneeded ports
go to post Julius Kavay · Nov 11, 2020 If your number is an integer write $extract(1E10 + 12345, 2, 11) // if N is a fixed value, here N = 10 or write $extract("1E"_N + 12345, 2, N+1) // if N is variable The game ends if your number has more than 18 (decimal) digits!
go to post Julius Kavay · Nov 11, 2020 A quick and dirty way: set ^|"%SYS"|%SYS("SystemMode")="TEST" // or "LIVE" or "DEVELOPMENT" or "FAILOVER"