go to post Pietro Di Leo · Nov 22 Hi David, thank for your response. I've solved the issue but I didn't know about this %response.InProgress, it seems a very useful statement!
go to post Pietro Di Leo · Nov 22 Thanks Ashok, it is interesting and I used it in another project. However, I've solved this issue but while reading your answer I wonder how to use this HTTP GenericMessage as the response stream within the CSP %response. Do you have any idea? Thanks
go to post Pietro Di Leo · Nov 22 Ciao Enrico, thanks for your response. However, I identified and solved the issue. It was a bit tricky to find because, basically, who developed this REST interface before, returned a response through the following statements: Set ListaPrenotazioni = ##class(%Library.ListOfDataTypes).%New() [... Populate the list of data types ...] Do ##class(%ZEN.Auxiliary.jsonProvider).%WriteJSONStreamFromObject(.jsonStream,ListaPrenotazioni,,,,"eu") Do jsonStream.Rewind() Do jsonStream.OutputToDevice() Since at first I put my statements after this code (before OutputToDevice()), I wasn't able to modify the status or the header. I found it out while reading the comment to the method SetHeader, which says: All headers must be set before the HTTP headers are written (after OnPreHTTP() completes). It was a bit unintuitive because I didn't expected that generating the stream will prevent any further header or status modification. Basically, I solved just moving all my statements before the code that creates the variable jsonStream: Set ListaPrenotazioni = ##class(%Library.ListOfDataTypes).%New() [... Populate the list of data types ...] [ In case of error: ] Do %response.SetHeader("totalcount",totalcount) Set %response.Status = ..#HTTP400BADREQUEST [ ... ] Do ##class(%ZEN.Auxiliary.jsonProvider).%WriteJSONStreamFromObject(.jsonStream,ListaPrenotazioni,,,,"eu") Do jsonStream.Rewind() Do jsonStream.OutputToDevice()
go to post Pietro Di Leo · Sep 12 Hi Luis, thanks for responding me. However, I can't find the DEQ state in the documentation. Available states for the "State" property of the %SYS.ProcessQuery class are: LOCK - Executing a Lock commandOPEN - Opening a deviceCLOS - Closing a deviceUSE - Using a deviceREAD - Read commandWRT - Write commandGET - Executing a $Get on a globalGSET - Setting a globalGKLL - Killing a globalGORD - $Order on a globalGQRY - $Query on a globalGDEF - $Data on a globalZF - Executing a $ZF commandHANG - Executing a Hang commandJOB - Executing a Job commandEXAM - Executing a variable examBRD - Executing a broadcastSUSP - Process is suspendedINCR - Executing a $IncrementBSET - Set $bitsetBGET - get $bitsetEVT - Waiting on event RUN - Process is running
go to post Pietro Di Leo · Aug 28 Recently, I asked the DC-AI where the streams formatted as %GlobalCharacterStream are saved, as since I suspected that these were responsible for a significant disk usage. The chatbot answered: <"Streams formatted as %GlobalCharacterStream are typically stored in the global ^CacheStream by default.">. I found out that I wasn't the only one with this problem and asked further information about the CacheStream global and how to clean it up. The best solution to my issue was to implement a custom purge task, as I found in one of the sources the bot provided me (that provided purging code too): 1.Cleaning up CacheStream Global 2.Default Purge Does Not Delete Streams 3.A beginners guide to Orphaned data- How as a trust we cleaned up 200+gb My overall experience with the DC-AI has been quite positive. Provided information is still closely tied to the specific answers given on the forum about the argument and could be more generalized, but I believe we're on the right way.Links to the discussions below: https://community.intersystems.com/ask-dc-ai?question_id=249111 https://community.intersystems.com/ask-dc-ai?question_id=249126
go to post Pietro Di Leo · Jul 9 Wow! I'm so happy :) Thank you to InterSystems and to the whole Developer Community for this beautiful competition. Congratulations to the other winners and all the participants for the incredible ideas they submitted. I hope these can be implemented in the next future to be useful for all the developers.
go to post Pietro Di Leo · Apr 18 Hi Stefano, Thank you for your response. Unfortunately, as @Enrico Parisi mentioned, OnFailureTimeout() isn't working as expected. Nevertheless, I managed to solve this issue by using an existing table which logs information about messages sent from the BO, a Business Service and a Business Process to initiate a parallel process alongside my ongoing transmissions.
go to post Pietro Di Leo · Apr 17 Hi Hannah, Thank you for your response. As you mentioned, the 'arrayref()' function is not available in IRIS 2023.1, as I suspected. However, I managed to resolve this issue by developing a custom method to convert a Python dictionary into an ObjectScript dynamic object. I believe it works quite effectively. I'll share the code here for anyone interested: /// This class provides methods for working with embedded Python in various scenarios Class Utility.Python Extends %RegisteredObject { /// ConvertPyDictToDynamicObject recursively converts a Python dictionary to an ObjectScript DynamicObject /// /// Input: /// - PythonDictionary: The Python dictionary to be converted /// /// Output: /// Returns a DynamicObject with similar structure and content of the parsed Python dictionary ClassMethod ConvertPyDictToDynamicObject(PythonDictionary) [ Language = python ] { import iris # This is a recursive function to parse a Python dictionary and convert it into an ObjectScript %DynamicObject # The method takes two parameters: 'data', which represents the current dictionary being parsed, and 'depth', which keeps track of the nesting level of the current data def parse_dictionary_to_dynamic_object(data, depth=0): # Create a new ObjectScript DynamicObject through iris module dynamic_object = iris.cls('%DynamicObject')._New() # If data is a dictionary, iterate through its key-value pairs if isinstance(data, dict): for key, value in data.items(): # Recursively parse the value and set it in the DynamicObject parsed_value = parse_dictionary_to_dynamic_object(value, depth + 1) dynamic_object._Set(key, parsed_value) # If data is a list, create a %DynamicArray and parse each item of the list recursively elif isinstance(data, list): dynamic_array = iris.cls('%DynamicArray')._New() for item in data: parsed_item = parse_dictionary_to_dynamic_object(item, depth) dynamic_array._Push(parsed_item) return dynamic_array # If data is neither a dictionary nor a list, return the data itself else: return data return dynamic_object # Call the recursive parsing function with the input Python dictionary dynamic_object = parse_dictionary_to_dynamic_object(PythonDictionary) # Return the parsed DynamicObject return dynamic_object } } You can easily test this method with complex dictionaries, like the one in the following example: ClassMethod StartTestPyDictConverter() { set dynObj = ##class(Python.MessageBuilder).TestPyDictConverter() w "dynObj tested",! } ClassMethod TestPyDictConverter() [ Language = python ] { import iris data = { "person": { "name": "John Doe", "age": 30, "address": { "street": "123 Main St", "city": "Anytown", "zipcode": "12345" }, "emails": ["john@example.com", "doe@example.com"], "phone_numbers": [ { "type": "home", "number": "123-456-7890" }, { "type": "work", "number": "987-654-3210" } ], "friends": [ { "name": "Alice", "age": 28, "address": { "street": "456 Elm St", "city": "Sometown", "zipcode": "54321" }, "emails": ["alice@example.com"], "phone_numbers": [ { "type": "mobile", "number": "555-555-5555" } ], "pets": [ { "name": "Fluffy", "species": "Cat", "age": 5 }, { "name": "Spot", "species": "Dog", "age": 3 } ] }, { "name": "Bob", "age": 35, "address": { "street": "789 Oak St", "city": "Othertown", "zipcode": "67890" }, "emails": ["bob@example.com"], "phone_numbers": [ { "type": "mobile", "number": "666-666-6666" } ] } ] }, "company": { "name": "Acme Corporation", "address": { "street": "456 Business Ave", "city": "Bigcity", "zipcode": "54321" }, "employees": [ { "name": "Jane Smith", "position": "Manager", "age": 40, "emails": ["jane@example.com"], "phone_numbers": [ { "type": "work", "number": "222-222-2222" } ] }, { "name": "Sam Johnson", "position": "Developer", "age": 35, "emails": ["sam@example.com"], "phone_numbers": [ { "type": "work", "number": "333-333-3333" } ] } ] } } dynObj = iris.cls('Utility.Python').ConvertPyDictToDynamicObject(data) return dynObj } I've tested it even with more complex dictionaries, like FHIR JSON, and it worked fine. For example, this is a screenshot from my VSC Debugger:
go to post Pietro Di Leo · Apr 12 Hello, please check my article about this topic here: Accessing the IRIS Terminal: A Comprehensive Guide for Visual Studio Code (intersystems.com)Hope you appreciate it
go to post Pietro Di Leo · Apr 4 Hello, I encountered a similar issue but managed to resolve it. If you were connected directly to the server-side folders, try the following steps: 1. Click: View -> Command Palette -> Open Workspace Settings (JSON) 2. In the "folders" property of the JSON you should see something like: "folders": [ { "name": "<server_folder_name>:<namespace>", "uri": "isfs://<server_name>:<namespace>/" } ] 3. Try replacing the old one with the new one. If you were working on a local folder that was connected to a server, you should have a .vscode folder in your VSC workspace. 1. Try editing the settings.json file inside the folder. You should see something similar to: "objectscript.conn": { "server": "<server name>", "ns": "<namespace name>", "active": true } 2. Edit the connection with the name of the server you want to reach
go to post Pietro Di Leo · Mar 14 Thanks @Enrico Parisi, this is interesting. I'm going to check it out
go to post Pietro Di Leo · Mar 13 Hi @Muhammad Waseem, in the end I found a solution modifying the settings.json file, which contained all the info about my connection
go to post Pietro Di Leo · Mar 13 Hi Muhammad, great article! Do you know by chance how to switch from an instance to another through the ObjectScript extension? I have a local folder where I'm setting up a Docker instance, but the folder is linked to my IRIS local instance and it is not possible to unlink them even by doing Toggle connection or Refresh connection. Of course, I would like to connect to my containerized instance instead. Thanks :)
go to post Pietro Di Leo · Jan 17 I would like to export the project as an XML file, as is it possible in Studio
go to post Pietro Di Leo · Dec 29, 2023 Hi @Brett Saviano, thanks for the information! I just mentioned it in the proper section of my article.
go to post Pietro Di Leo · Nov 17, 2023 Thank you Brett, if it's feasible for you, link this article to the one you're writing in order to connect articles on similar subjects. I'll do the same