go to post Eduard Lebedyuk · Mar 22, 2018 For higher performance it's better to keep the data in InterSystems platform and sync it with remote db periodically.To download the data via xDBC you have two main approaches:Interoperability (Ensemble) SQL inbound adapter"Raw" access via %SQLGatewayConnection or %Net.Remote.Java.JDBCGatewayInteroperability approach is better as it solves most problems and user should just enter the query, etc. "Raw" can be faster and allows for fine-tuning.Now, to keep data synced there are several approaches available:If source table has UpdatedOn field, track it and get rows updated only after last sync.Journals: some databases provide parsable journals, use them to determine which rows changed in relevant tables.Triggers: sometimes source table has triggers (i.e. Audit) which while do not provide explicit UpdatedOn field nonetheless can be used to determine row update time.Hashing: hash incoming data and save the hash, update the row only if hash changed.If you can modify source database - add UpdatedOn field, it's the best6 solution.Linked tables allow you not to store data permanently, but the cube would be rebuilt each time. With other approaches syncing cube is enough.Also check this guide on DeepSee Data Connectors.
go to post Eduard Lebedyuk · Mar 18, 2018 We're using Custom Login pages and they don't show other page on fail - just User/pass incorrect message. @Sergey.Sarkisyan? There's also this discussion.Basic authorization also works - it's used in DeepSeeWeb. OP has a problem with CORS and maybe roles.
go to post Eduard Lebedyuk · Mar 18, 2018 Failed to load http://server:port/csp/xxx/login: Request header field Authorization is not allowed by Access-Control-Allow-Headers in preflight response.Add Access-Control-Allow-Headers header to OPTIONS response?
go to post Eduard Lebedyuk · Mar 18, 2018 I have no real answer to the logon issue What about custom login pages? <html> <head> <title>cUSTOM LOGIN PAGE</title> </head> <body> <div style=""> <form name="loginForm" class="form-signin" method="post" action="#("./index.csp")#"> <p id="caption">Registration system</p> <input name="CacheLogin" value="1" type="hidden"> <input id="CacheUserName" type="text" class="input-block-level" name="CacheUserName" placeholder="Login" value="_SYSTEM"> <input type="password" class="input-block-level" name="CachePassword" placeholder="Password" value="SYS"> <button class="btn btn-small btn-primary" type="submit" style="font-size: 1em;">Login</button> </form> </div> </body> </html>
go to post Eduard Lebedyuk · Mar 15, 2018 If you're using WYSWIG editor you can specify a cut - part of text that's seen as a post preview:Here's how it looks:How to do that in Markdown?BTW, advice: don't switch MD article into WYSWIG, you'll lose the formatting.
go to post Eduard Lebedyuk · Mar 14, 2018 Have you tried xlsx and displayxlsx (2015.1+) formats? Docs.
go to post Eduard Lebedyuk · Mar 14, 2018 When you're using Import, one record that imports - is it correct (corresponds to one string in csv)?
go to post Eduard Lebedyuk · Mar 13, 2018 Use parameters instead of building the query manually. Everything would be escaped automatically.
go to post Eduard Lebedyuk · Mar 13, 2018 You're importing jitPod.Api.toServer.logon and that's whats imported. I think you skipped step 5, where you replace all reference to Apiwith api.
go to post Eduard Lebedyuk · Mar 13, 2018 Studio is less important here. What does this return: write ##class(%Dictionary.CompiledClass).%ExistsId("jitPod.Api.toServer.logon"),! write ##class(%Dictionary.CompiledClass).%ExistsId("jitPod.api.toServer.logon"),! zwrite ^oddPKG($zcvt("itPod.api", "U"))
go to post Eduard Lebedyuk · Mar 13, 2018 1. Export Api package. 2. Uncompile and Delete all classes from Api package regardless of the case. 3. Delete package with write $System.OBJ.DeletePackage("package name") 4. Check if there's anything related to jitPod.Api package left in: zw ^oddPKG Delete ONLY entries related to your package. 5. In exported code replace Api with api for all classes. 6. Restart Cache. 7. Import classes.
go to post Eduard Lebedyuk · Mar 13, 2018 That would work, but I'm looking for a solution without user code.Some system OutputToDevice method.
go to post Eduard Lebedyuk · Mar 13, 2018 Pattern can be used: Property GUID As %String(PATTERN = "8AN1""-""4AN1""-""4AN1""-""4AN1""-""12AN") [ InitialExpression = {$SYSTEM.Util.CreateGUID()} ]; And A can be replaced with L or U to store GUIDs in one case.
go to post Eduard Lebedyuk · Mar 13, 2018 I'm calling load code like this: csession ensemble "##class(isc.git.GitLab).load()" ObjectScript: /// Do a full load /// do ##class(isc.git.GitLab).load() ClassMethod load() { try { set dir = "/src" do ..log("Importing dir " _ dir) do $system.OBJ.ImportDir(dir, "*.xml", "c", .errors, 1) throw:$get(errors,0)'=0 ##class(%Exception.General).%New("Load & compile error") halt } catch ex { write !,$System.Status.GetErrorText(ex.AsStatus()),! do $system.Process.Terminate(, 1) } } This way process terminates abnormally on error: do $system.Process.Terminate(, 1) And it's usually reported as error in CI/CD systems. Additionally you can grep for "Load & compile error". I'm currently writing a series of articles on continuous delivery, check it out (latest part).
go to post Eduard Lebedyuk · Mar 12, 2018 Pressing on a Toolbar in the first menu should toggle it too.