go to post Eduard Lebedyuk · Sep 1, 2022 1. Yes. Stopping primary makes backup a new primary. Before stopping you might want to validate that backup is caught up: set sql = "SELECT CASE WHEN DatabaseLatency=? THEN 1 ELSE 0 END IsCaughtUp FROM SYS.Mirror_MemberStatusList() WHERE CurrentRole = ?" set rs = ##class(%SQL.Statement).%ExecDirect(,sql, "Caught up", "Backup") do rs.%Next() if rs.IsCaughtUp { write "Caught up" halt } else { write "Not caught up" do $system.Process.Terminate(,1) } Or at least is not too far behind (check this post). 2. No. ^MIRROR does the same.
go to post Eduard Lebedyuk · Sep 1, 2022 There's a distinction between Background Jobs and Background Tasks. Backgound job is anything you run using JOB command. Background Task is a limited set of named actions (AuditCopy, AuditExport, AuditPurge, Backup, CompactDBSpace, CopyNamespaceMappings, CreateDatabase, Compile, DatabaseIntegrityCheck, DataMigration, DefragmentDB, Delete, EnableEnsNamespace, Export, ExternalLangServers, FileMan, Import, SQLExport, SQLImport, SQLExportStatement, SQLImportStatement, QueryExport, JournalIntegrityCheck, LinkTable, LinkProcedure, MirrorActivateCatchupDB, MirrorRemoveDB, MirrorMountDB, MirrorAddDatabases, ModifyDatabaseSize, RebuildIndices, TuneTable, TuneTables, PurgeAllCachedQueries, JobShowPlan, JobSaveQuery, JobPossiblePlans, JobComparePlans, ShardActivate, ShardAssign, ShardVerify, ShardRebalance) runnable through a special interface. Docs. You can run a Background Task (but probably should not - it's a system action) by calling: set parms("ClassName") = "Sample.Person" set tSC = ##class(%CSP.UI.System.BackgroundTask).RunTask("RebuildIndices", "SAMPLES", .parms, .job) As HIHLib.Support.GetHL7MessageStat:ISBListingQuery is not on the list you can't run it as a Background Task, but you can run it as a Job. Next - no output. Note that you do not specify these parameters: principal-input Principal input device for the process. The default is the null device. principal-output Principal output device for the process. The default is the device you specify for principal-input or the null device if neither device is specified. UNIX®: If you do not specify either device, the process uses the default principal device for processes started with the JOB command, which is /dev/null. Further: Only one process can own a device at a time. This means that a job executing in a JOB Server is unable to perform input or output to your principal I/O devices even though you may close device 0. So by default you run your job with stdio set to /dev/null and that's why there's no output. You can either pass a device to write output to or write a wrapper which would handle the output and job that.
go to post Eduard Lebedyuk · Aug 31, 2022 You can also set System Mode in Memory and Startup settings. For LIVE I'd also recommend just removing admin write access altogether.
go to post Eduard Lebedyuk · Aug 31, 2022 To install locale, execute during docker build: set sc = ##class(Config.NLS.Locales).Install("deuw")
go to post Eduard Lebedyuk · Aug 31, 2022 I'd check/set: set ^%SYS("CSP","DefaultFileCharset")="utf-8"
go to post Eduard Lebedyuk · Aug 27, 2022 request should not contain process, there is a separate process variable for that.
go to post Eduard Lebedyuk · Aug 27, 2022 Sounds like you're writing SELECT * queries. While fine for debugging or development, remember to always explicitly specify the list of columns in actual production queries.
go to post Eduard Lebedyuk · Aug 24, 2022 Users certainly should not be able access Ens_Config.Credentials table, maybe some user has permissions too broad? What you can do additionally is to store credentials in a separate SECONDARY database. When you create a new interoperability namespace (in non HS installs), it should be created automatically. Still, you can manually create this DB and related mappings by calling CreateNewDBForSecondary. After creating secondary db, check that no one has R on DB resouce. Additionally you can encrypt the db file.
go to post Eduard Lebedyuk · Aug 24, 2022 Sure. There are two ways: 1. Switch to another namespace to execute your query: /// Get a list of all mirrored databases as a $lb() ClassMethod GetMirroredDBs() As %List { new $namespace set $namespace = "%SYS" set sql = "SELECT LIST(Name) dbs FROM Config.Databases_MirrorDatabaseList()" set rs = ##class(%SQL.Statement).%ExecDirect(,sql) do rs.%Next() set dbs = $lfs(rs.dbs) kill rs quit dbs } Now you can have this method in USER namespace and it would automatically swith into %SYS, execute query, iterate over the results, write results into a local variable, switch back into USER namespace and return the value back to you. The main thing you need to remember is that result set iteration MUST happen in a target namespace. 2. Map classes and globals to your namespace. Docs. Table would be available as if it was created in your original namespace.
go to post Eduard Lebedyuk · Aug 20, 2022 What are recommend habits inside and outside, during you own time and during your work time, to be focused during you coding session and daily tasks? My habit/advice/etc. and something that really helped me is a sincere acceptance of the fact long uninterrupted stretches of time do not exist. Stop trying to carve out an entire week for a new product feature or a day to prepare a perfect demo. The best you can get is half an hour between meetings. After I accepted that, planning and accomplishing work (and anything else really) became much more manageable. And much less frustrating as I don't expect to complete any task uninterrupted by something else. To do that, first, I split any task into 15-minute-to-half-hour chunks. For example, if I'm writing code, first I just create stubs for all the parts (usually methods and classes), beginning to end, even if I don't know how they should be implemented. Each method is one or several chunks. After that, I start on a chunk: implementing one method I know for sure. If I have no idea how anything works at all, I'll implement invocation arguments/objects and so on. If still no idea: split one chunk into several and try again. It works out for almost everything. Writing articles, I first write a title and a list of sections. Usually, I have ten or more of these stubs lying around, and then inspiration strikes me - why not fill one section? Or several if there's time. Another trick is leaving the day's last item unfinished. When I'm close to eob and actually see how to complete something, I often leave it as a task to start the next day. This way, I know where to start and what to do in the morning. And I can score a win pretty much immediately.
go to post Eduard Lebedyuk · Aug 19, 2022 Say you have this query: SELECT a, b, c FROM mytable WHERE d=1 AND e=2 If you want to change fields in SELECT or WHERE, you'll need to rewrite your query by adding or removing it's parts. Source control diff would also show a whole line change. But if you write it like this: SELECT 1 , a , b , c FROM mytable WHERE 1=1 AND d=1 AND e=2 You can comment out any field or condition simply by adding --: SELECT 1 --, a , b , c FROM mytable WHERE 1=1 --AND d=1 AND e=2 when you have a lot of conditions and need to iterate fast, this way of writing queries is much better for debugging and source control since diff is always contianed to the one line you edit.
go to post Eduard Lebedyuk · Aug 18, 2022 Improves readability as all conditions start on the same indent level. It's also useful when you have a query with several conditions and you need to debug by changing which conditions you apply. This way you can easily add/remove conditions by commenting lines in/out.