mirror of
				https://github.com/KevinMidboe/linguist.git
				synced 2025-10-29 17:50:22 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			1950 lines
		
	
	
		
			49 KiB
		
	
	
	
		
			Mathematica
		
	
	
	
	
	
			
		
		
	
	
			1950 lines
		
	
	
		
			49 KiB
		
	
	
	
		
			Mathematica
		
	
	
	
	
	
| zmwire ; M/Wire Protocol for M Systems (eg GT.M, Cache)
 | |
|  ;
 | |
|  ; ----------------------------------------------------------------------------
 | |
|  ; | M/Wire                                                                   |
 | |
|  ; | Copyright (c) 2004-11 M/Gateway Developments Ltd,                        |
 | |
|  ; | Reigate, Surrey UK.                                                      |
 | |
|  ; | All rights reserved.                                                     |
 | |
|  ; |                                                                          |
 | |
|  ; | http://www.mgateway.com                                                  |
 | |
|  ; | Email: rtweed@mgateway.com                                               |
 | |
|  ; |                                                                          |
 | |
|  ; | This program is free software: you can redistribute it and/or modify     |
 | |
|  ; | it under the terms of the GNU Affero General Public License as           |
 | |
|  ; | published by the Free Software Foundation, either version 3 of the       |
 | |
|  ; | License, or (at your option) any later version.                          |
 | |
|  ; |                                                                          |
 | |
|  ; | This program is distributed in the hope that it will be useful,          |
 | |
|  ; | but WITHOUT ANY WARRANTY; without even the implied warranty of           |
 | |
|  ; | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            |
 | |
|  ; | GNU Affero General Public License for more details.                      |
 | |
|  ; |                                                                          |
 | |
|  ; | You should have received a copy of the GNU Affero General Public License |
 | |
|  ; | along with this program.  If not, see <http://www.gnu.org/licenses/>.    |
 | |
|  ; ----------------------------------------------------------------------------
 | |
|  ;
 | |
|  QUIT
 | |
|  ;
 | |
|  ; By default this server code runs on port 6330
 | |
|  ;
 | |
|  ; For GT.M systems it is invoked via xinetd:
 | |
|  ;   Edit /etc/services and add the line:
 | |
|  ; 
 | |
|  ;    mwire  6330/tcp  # Service for M/Wire Protocol
 | |
|  ;
 | |
|  ;   Copy the file mwire to /etc/xinetd.d/mwire
 | |
|  ;   Copy the file zmwire to /usr/local/gtm/zmwire and change 
 | |
|  ;    its permissions to executable (eg 755)
 | |
|  ;
 | |
|  ;   These files may be edited to change the paths or port number
 | |
|  ;   Restart xinetd using: sudo /etc/init.d/xinetd restart
 | |
|  ;
 | |
|  ;   On GT.M systems you must also have installed MGWSI or m_apache
 | |
|  ;     in order to provide the MD5 hashing function for passwords
 | |
|  ;     Alternatively substitute the MD5 callout to the MD5 function of your choice
 | |
|  ;
 | |
|  ; For Cache systems, it is invoked via the M/Wire Daemon routine
 | |
|  ;   which should be running as a jobbed process:
 | |
|  ;
 | |
|  ;     job start^zmwireDaemon
 | |
|  ;
 | |
|  ;   You can change the port number by simply editing the line
 | |
|  ; 
 | |
|  ;      port+1^zmwireDaemon
 | |
|  ;
 | |
|  ;    Stop the Daemon process using ^RESJOB and restart it.
 | |
|  ;
 | |
| mwireVersion
 | |
|  ;;Build 22
 | |
|  ;
 | |
| mwireDate
 | |
|  ;;06 July 2011
 | |
|  ;
 | |
| version
 | |
|  ;
 | |
|  s output="+M/Wire "_$p($t(mwireVersion+1),";;",2,2000)_crlf
 | |
|  w output
 | |
|  QUIT
 | |
|  ;
 | |
| build
 | |
|  ;
 | |
|  n crlf,response
 | |
|  ;
 | |
|  s crlf=$c(13,10)
 | |
|  s response="*3"_crlf
 | |
|  w response
 | |
|  i $g(^zewd("trace"))=1 d trace("build: "_response_" sent")
 | |
|  ;
 | |
|  s response=$p($t(mwireVersion+1),";;",2,2000)
 | |
|  s response="$"_$l(response)_crlf_response_crlf
 | |
|  w response
 | |
|  i $g(^zewd("trace"))=1 d trace("build: "_response_" sent")
 | |
|  ;
 | |
|  s response=$p($t(mwireDate+1),";;",2,2000)
 | |
|  s response="$"_$l(response)_crlf_response_crlf
 | |
|  w response
 | |
|  i $g(^zewd("trace"))=1 d trace("build: "_response_" sent")
 | |
|  ;
 | |
|  s response=$zv
 | |
|  s response="$"_$l(response)_crlf_response_crlf
 | |
|  w response
 | |
|  i $g(^zewd("trace"))=1 d trace("build: "_response_" sent")
 | |
|  QUIT
 | |
|  ;
 | |
| command ;
 | |
|  n authNeeded,c,crlf,input,output
 | |
|  ;
 | |
|  d cleardown
 | |
|  i $zv["GT.M" s $zint="d monitoroutput"
 | |
|  s ^zmwire("connected",$j)=""
 | |
|  l +^zmwire("connected",$j)
 | |
|  s crlf=$c(13,10)
 | |
|  s authNeeded=0
 | |
|  s role="user"
 | |
|  i $d(^zmwire("auth")) s authNeeded=1
 | |
| loop
 | |
|  i $g(^zmwire("relink"))=1,'$d(^zmwire("relink","process",$j)) s ok=$$relinkRoutines()
 | |
|  r *c
 | |
|  i $c(c)="*" d
 | |
|  . s input=$$multiBulkRequest()
 | |
|  . i $g(^zewd("trace"))=1 d trace($j_": "_$h_": mwire input: "_input)
 | |
|  e  d
 | |
|  . r input s input=$c(c)_input 
 | |
|  . i $g(^zewd("trace"))=1 d trace($h_": mwire input: "_input)
 | |
|  . i input'="" d
 | |
|  . . i $zv["GT.M" s input=$e(input,1,$l(input)-2)
 | |
|  . . i $zv["Cache" s input=$e(input,1,$l(input)-1)
 | |
|  ;i input="PING" w "+PONG"_crlf g loop
 | |
|  i input="PING" s output="+PONG"_crlf w output g loop
 | |
|  i $d(^zmwire("monitor","listener")) d log(input)
 | |
|  i input="" g loop
 | |
|  i input="EXIT" g halt
 | |
|  i input="QUIT" g quit
 | |
|  i input="HALT" g halt
 | |
|  ;
 | |
|  i authNeeded,$e(input,1,4)'="AUTH" s output="-Authentication required"_crlf w output g loop
 | |
|  i 'authNeeded,$e(input,1,4)="AUTH" s output="-Authentication ignored"_crlf w output g loop
 | |
|  i $e(input,1,5)="AUTH " d auth($e(input,6,$l(input))) g loop
 | |
|  i 'authNeeded!(role="admin"),$e(input,1,12)="SETPASSWORD " d setpassword($e(input,13,$l(input))) g loop
 | |
|  ;
 | |
|  s input=$$utfConvert(input)
 | |
|  i $e(input,1,4)="SET " d set($e(input,5,$l(input))) g loop
 | |
|  i $e(input,1,10)="GETGLOBAL " d getGlobal($e(input,11,$l(input))) g loop
 | |
|  i $e(input,1,14)="GETJSONSTRING " d getJSON($e(input,15,$l(input))) g loop
 | |
|  i $e(input,1,14)="SETJSONSTRING " d setJSON($e(input,15,$l(input))) g loop
 | |
|  i $e(input,1,15)="RUNTRANSACTION " d runTransaction($e(input,16,$l(input))) g loop
 | |
|  i $e(input,1,4)="GET " d get($e(input,5,$l(input))) g loop
 | |
|  i $e(input,1,7)="INCRBY " d incrby($e(input,8,$l(input))) g loop
 | |
|  i $e(input,1,7)="DECRBY " d decrby($e(input,8,$l(input))) g loop
 | |
|  i $e(input,1,14)="NEXTSUBSCRIPT " d nextSubscript($e(input,15,$l(input)),1) g loop
 | |
|  i $e(input,1,18)="PREVIOUSSUBSCRIPT " d nextSubscript($e(input,19,$l(input)),-1) g loop
 | |
|  i $e(input,1,5)="KILL " d kill($e(input,6,$l(input))) g loop
 | |
|  i $e(input,1,4)="DEL " d kill($e(input,5,$l(input))) g loop
 | |
|  i $e(input,1,5)="DATA " d data($e(input,6,$l(input))) g loop
 | |
|  i $e(input,1,7)="EXISTS " d data($e(input,8,$l(input))) g loop
 | |
|  i $e(input,1,5)="INCR " d incr($e(input,6,$l(input))) g loop
 | |
|  i $e(input,1,5)="DECR " d decr($e(input,6,$l(input))) g loop
 | |
|  i $e(input,1,11)="COPYGLOBAL " d copy($e(input,12,$l(input))) g loop
 | |
|  i $e(input,1,5)="LOCK " d lock($e(input,6,$l(input))) g loop
 | |
|  i $e(input,1,7)="UNLOCK " d unlock($e(input,8,$l(input))) g loop
 | |
|  i $e(input,1,6)="ORDER " d order($e(input,7,$l(input))) g loop
 | |
|  i $e(input,1,5)="NEXT " d order($e(input,6,$l(input))) g loop
 | |
|  i $e(input,1,9)="ORDERALL " d orderall($e(input,10,$l(input))) g loop
 | |
|  i $e(input,1,11)="GETGLOBALS2" d getGlobals() g loop
 | |
|  i $e(input,1,10)="GETGLOBALS" d getGlobalList() g loop
 | |
|  i $e(input,1,9)="MULTIGET " d multiGet($e(input,10,$l(input))) g loop
 | |
|  i $e(input,1,11)="GETALLSUBS " d orderall($e(input,12,$l(input))) g loop
 | |
|  i $e(input,1,14)="GETSUBSCRIPTS " d getAllSubscripts($e(input,15,$l(input))) g loop
 | |
|  i $e(input,1,9)="REVORDER " d reverseorder($e(input,10,$l(input))) g loop
 | |
|  i $e(input,1,9)="PREVIOUS " d reverseorder($e(input,10,$l(input))) g loop
 | |
|  i $e(input,1,6)="QUERY " d query($e(input,7,$l(input))) g loop
 | |
|  i $e(input,1,9)="QUERYGET " d queryget($e(input,10,$l(input))) g loop
 | |
|  i $e(input,1,10)="MERGEFROM " d mergefrom($e(input,11,$l(input))) g loop
 | |
|  i $e(input,1,11)="GETSUBTREE " d mergefrom($e(input,12,$l(input))) g loop
 | |
|  i $e(input,1,8)="MERGETO " d mergeto($e(input,9,$l(input))) g loop
 | |
|  i $e(input,1,11)="SETSUBTREE " d mergeto($e(input,12,$l(input))) g loop
 | |
|  i $e(input,1,9)="FUNCTION " d function($e(input,10,$l(input))) g loop
 | |
|  i $e(input,1,8)="EXECUTE " d function($e(input,9,$l(input))) g loop
 | |
|  i $e(input,1,6)="TSTART" d tstart g loop
 | |
|  i $e(input,1,7)="TCOMMIT" d tcommit g loop
 | |
|  i $e(input,1,9)="TROLLBACK" d trollback g loop
 | |
|  i $e(input,1,5)="MDATE" d mdate g loop
 | |
|  i $e(input,1,9)="PROCESSID" d processid g loop
 | |
|  i $e(input,1,7)="VERSION" d version g loop
 | |
|  i $e(input,1,8)="GETBUILD" d build g loop
 | |
|  i $e(input,1,8)="MVERSION" d zv g loop
 | |
|  i $e(input,1,4)="INFO" d info g loop
 | |
|  i $e(input,1,7)="MONITOR" d monitor g loop
 | |
|  s output="-"_input_" not recognized"_crlf w output
 | |
|  g loop
 | |
|  ;
 | |
| multiBulkRequest()
 | |
|  ;
 | |
|  n buff,c,i,input,j,len,noOfCommands,param,space
 | |
|  ;
 | |
|  s noOfCommands=""
 | |
|  f  d  q:c=13
 | |
|  . r *c q:c=13
 | |
|  . ;d trace("0: "_$c(c))
 | |
|  . s noOfCommands=noOfCommands_$c(c)
 | |
|  r *x
 | |
|  ;d trace("1: "_$c(x))
 | |
|  ;
 | |
|  f i=1:1:noOfCommands d
 | |
|  . ;d trace("i="_i)
 | |
|  . s len=""
 | |
|  . f  d  q:c=13
 | |
|  . . r *c
 | |
|  . . ;d trace("2: "_$c(c))
 | |
|  . . i $c(c)="$",len="" q
 | |
|  . . q:c=13
 | |
|  . . s len=len_$c(c)
 | |
|  . r *c
 | |
|  . ;d trace("3: "_$c(c))
 | |
|  . s input=""
 | |
|  . i len=0 d
 | |
|  . . s param(i)=""
 | |
|  . . r *c
 | |
|  . . ;d trace("4: "_$c(c))
 | |
|  . e  d
 | |
|  . . r input#len
 | |
|  . . ;d trace("input="_input)
 | |
|  . . s param(i)=input
 | |
|  . . ;d trace("param "_i_" = "_input)
 | |
|  . . r *c,*c
 | |
|  ;
 | |
|  s param(1)=$zconvert(param(1),"U")
 | |
|  ;QUIT "PING"
 | |
|  i param(1)="PING" QUIT param(1)
 | |
|  ;s no=$increment(^rob) m ^rob(no)=param
 | |
|  i param(1)="SET" QUIT param(1)_" "_param(2)_" "_$l(param(3))_crlf_param(3)
 | |
|  i param(1)="SETJSONSTRING" QUIT param(1)_" "_param(2)_crlf_param(3)_crlf_param(4)
 | |
|  i param(1)="COPYGLOBAL"!(param(1)="GETSUBSCRIPTS") d  QUIT input
 | |
|  . s space="",input=""
 | |
|  . f i=1:1:noOfCommands d
 | |
|  . . s input=input_space_param(i)
 | |
|  . . i space="" s space=" " q
 | |
|  . . i space=" " s space=$c(1)
 | |
|  i param(1)="EXECUTE" d  QUIT input
 | |
|  . ;d trace("Execute: param(3)="_param(3))
 | |
|  . s param(3)=$$replaceAll(param(3),"\""","""""")
 | |
|  . i $e(param(3),1)="[" s input=param(1)_" "_param(2)_"("_$e(param(3),2,$l(param(3))-1)_")" q
 | |
|  . s input=param(1)_" "_param(2)
 | |
|  ;
 | |
|  s space="",input=""
 | |
|  f i=1:1:noOfCommands d
 | |
|  . s input=input_space_param(i)
 | |
|  . s space=" " 
 | |
|  ;
 | |
|  QUIT input
 | |
|  ;
 | |
| halt
 | |
|  k ^zmwire("connected",$j)
 | |
|  HALT
 | |
|  ;
 | |
| quit
 | |
|  ;
 | |
|  i '$d(^zmwire("monitor","listener",$j)) g halt
 | |
|  k ^zmwire("monitor","listener",$j)
 | |
|  g loop
 | |
|  ;
 | |
| cleardown
 | |
|  ;
 | |
|  n ignore,pid
 | |
|  ;
 | |
|  s pid=""
 | |
|  f  s pid=$o(^zmwire("connected",pid)) q:pid=""  d
 | |
|  . i pid=$j q
 | |
|  . s ignore=1
 | |
|  . l +^zmwire("connected",pid):0 e  s ignore=0
 | |
|  . i ignore d
 | |
|  . . l -^zmwire("connected",pid)
 | |
|  . . k ^zmwire("connected",pid)
 | |
|  . . k ^zmwire("monitor","listener",pid)
 | |
|  . . k ^zmwire("monitor","output",pid)
 | |
|  s pid=""
 | |
|  f  s pid=$o(^zmwire("monitor","output",pid)) q:pid=""  d
 | |
|  . i pid=$j q
 | |
|  . s ignore=1
 | |
|  . l +^zmwire("connected",pid):0 e  s ignore=0
 | |
|  . l -^zmwire("connected",pid)
 | |
|  . i ignore d
 | |
|  . . k ^zmwire("monitor","output",pid)
 | |
|  QUIT
 | |
|  ;
 | |
| monitor
 | |
|  ;
 | |
|  i $zv'["GT.M" w "-Command unavailable"_crlf QUIT
 | |
|  n quit
 | |
|  ;
 | |
|  s ^zmwire("monitor","listener",$j)=""
 | |
|  s output="+OK"_crlf w output
 | |
|  f  h 1 r quit:0  i $e(quit,1,4)="QUIT" q
 | |
|  k ^zmwire("monitor","listener",$j)
 | |
|  s output="+OK"_crlf w output
 | |
|  QUIT
 | |
|  ;
 | |
| log(input)
 | |
|  ;
 | |
|  i $zv'["GT.M" QUIT
 | |
|  ;
 | |
|  QUIT:'$d(^zmwire("monitor","listener"))
 | |
|  ;
 | |
|  n dev,inputr,io,lineNo,pid
 | |
|  ;
 | |
|  i input["AUTH" QUIT
 | |
|  i input["QUIT" QUIT
 | |
|  i input["EXIT" QUIT
 | |
|  i input["HALT" QUIT
 | |
|  s inputr=$re(input)
 | |
|  i $e(inputr,1,2)'=$c(10,13) s input=input_crlf
 | |
|  s pid=""
 | |
|  f  s pid=$o(^zmwire("monitor","listener",pid)) q:pid=""  d
 | |
|  . i pid=$j q
 | |
|  . s lineNo=$o(^zmwire("monitor","output",pid,""),-1)+1
 | |
|  . s ^zmwire("monitor","output",pid,lineNo)=input
 | |
|  . ;zsy "mupip intrpt "_pid_" >/dev/null"
 | |
|  . zsy "kill -USR1 "_pid
 | |
|  ;
 | |
|  QUIT
 | |
|  ;
 | |
| monitoroutput
 | |
|  ;
 | |
|  n lineNo
 | |
|  ;
 | |
|  s lineNo=""
 | |
|  f  s lineNo=$o(^zmwire("monitor","output",$j,lineNo)) q:lineNo=""  d
 | |
|  . w ^zmwire("monitor","output",$j,lineNo)
 | |
|  . k ^zmwire("monitor","output",$j,lineNo)
 | |
|  QUIT
 | |
|  ;
 | |
| logger(command,initialise)
 | |
|  ;
 | |
|  n tot,count
 | |
|  ;
 | |
|  i $g(initialise) k ^mwireLogger
 | |
|  s tot=$increment(^mwireLogger)
 | |
|  s count=$increment(^mwireLogger(command))
 | |
|  ;
 | |
|  QUIT
 | |
|  ;
 | |
| info
 | |
|  ;
 | |
|  n count,ignore,pid,response
 | |
|  ;
 | |
|  s response="m_wire_version:"_$p($t(mwireVersion+1),";;",2,2000)_crlf
 | |
|  s pid="",count=0
 | |
|  f  s pid=$o(^zmwire("connected",pid)) q:pid=""  d
 | |
|  . s ignore=1
 | |
|  . i pid=$j d
 | |
|  . . s ignore=0
 | |
|  . e  d
 | |
|  . . l +^zmwire("connected",pid):0 e  s ignore=0
 | |
|  . i ignore d
 | |
|  . . l -^zmwire("connected",pid)
 | |
|  . . k ^zmwire("connected",pid)
 | |
|  . . k ^zmwire("monitor","listener",pid)
 | |
|  . e  d
 | |
|  . . s count=count+1
 | |
|  s response=response_"connected_clients:"_count ;_crlf
 | |
|  s output="$"_$l(response)_crlf_response_crlf
 | |
|  w output
 | |
|  QUIT
 | |
|  ;
 | |
| auth(input)
 | |
|  ;
 | |
|  n pass
 | |
|  s pass=$$MD5(input)
 | |
|  i $d(^zmwire("auth",pass)) d
 | |
|  . s authNeeded=0
 | |
|  . s role=^zmwire("auth",pass)
 | |
|  . s output="+OK"_crlf
 | |
|  . w output
 | |
|  e  d
 | |
|  . s output="-Invalid password"_crlf
 | |
|  . w output
 | |
|  QUIT
 | |
|  ;
 | |
| setpassword(input)
 | |
|  ;
 | |
|  ; SETPASSWORD secret
 | |
|  ; +OK <set as role=user>
 | |
|  ;
 | |
|  ; SETPASSWORD secret admin
 | |
|  ; +OK
 | |
|  ;
 | |
|  n pass,newrole
 | |
|  ;
 | |
|  i $d(^zmwire("auth")),role'="admin" s output="-Invalid command"_crlf w output QUIT
 | |
|  i $$stripSpaces(input)="" s output="-Invalid command"_crlf w output QUIT
 | |
|  s newrole="user"
 | |
|  i input[" " d
 | |
|  . s newrole=$p(input," ",2)
 | |
|  . s input=$p(input," ",1)
 | |
|  i '$d(^zmwire("auth")) s newrole="admin"
 | |
|  i newrole'="user",newrole'="admin" s output="-Invalid role"_crlf w output QUIT
 | |
|  ;
 | |
|  s pass=$$MD5(input)
 | |
|  s ^zmwire("auth",pass)=newrole
 | |
|  s output="+OK"_crlf
 | |
|  w output
 | |
|  QUIT
 | |
|  ;
 | |
| getGloRef(input)
 | |
|  ;
 | |
|  n gloName,gloRef,nb,subs
 | |
|  ;
 | |
|  s gloRef=input
 | |
|  i $e(gloRef,1)'="^" s gloRef="^"_gloRef
 | |
|  i $e(gloRef,$l(gloRef))="]" s gloRef=$e(gloRef,1,$l(gloRef)-1)
 | |
|  s gloName=$p(gloRef,"[",1)
 | |
|  s nb=$l(gloRef,"[")+2
 | |
|  s subs=$p(gloRef,"[",2,nb)
 | |
|  i subs="" QUIT gloName
 | |
|  QUIT gloName_"("_subs_")"
 | |
|  ;
 | |
| set(input)
 | |
|  ;
 | |
|  n c123,data,gloName,gloRef,i,inputr,json,len,nb,nsp,ok,quot,subs,x
 | |
|  ;
 | |
|  ; SET myglobal["1","xx yy",3] 5
 | |
|  ; hello
 | |
|  ; +OK
 | |
|  ; SET myGlo 5
 | |
|  ; hello
 | |
|  ; +OK
 | |
|  ;
 | |
|  ;n n
 | |
|  ;s n=$increment(^rob("set"))
 | |
|  ;s ^rob("set",n)=input
 | |
|  i input[crlf d
 | |
|  . s data=$p(input,crlf,2,$l(input))
 | |
|  . s input=$p(input,crlf,1)
 | |
|  s nsp=$l(input," ")
 | |
|  s len=$p(input," ",nsp)
 | |
|  i len'=0,+len=0 s output="-Data length was not specified"_crlf w output QUIT
 | |
|  s gloRef=$p(input," ",1,nsp-1)
 | |
|  i $e(gloRef,1)'="^" s gloRef="^"_gloRef
 | |
|  i $e(gloRef,$l(gloRef))="]" s gloRef=$e(gloRef,1,$l(gloRef)-1)
 | |
|  s gloName=$p(gloRef,"[",1)
 | |
|  s nb=$l(gloRef,"[")+2
 | |
|  s subs=$p(gloRef,"[",2,nb)
 | |
|  ; Process Javascript escaping
 | |
|  i subs'="" s subs=subs_")"
 | |
|  s quot=""""
 | |
|  i subs'="" f i=1:1:$l(subs)-2 d
 | |
|  . s c123=$e(subs,i,i+2)
 | |
|  . i $e(c123,1)'="\" q
 | |
|  . i $e(c123,2)="\" q
 | |
|  . i $e(c123,2)=quot d  q
 | |
|  . . i $e(c123,3)="," q
 | |
|  . . i $e(c123,3)=")" q
 | |
|  . . s subs=$e(subs,1,i-1)_quot_quot_$e(subs,i+2,$l(subs))
 | |
|  i subs["\\" d
 | |
|  . s subs=$$replaceAll(subs,"\\",$c(5))
 | |
|  . s subs=$$replaceAll(subs,$c(5),"\")
 | |
|  s gloRef=gloName
 | |
|  i gloRef["^zmwire" s output="-No access allowed to this global"_crlf w output QUIT
 | |
|  i subs'="" s gloRef=gloRef_"("_subs
 | |
|  i '$d(data)  d
 | |
|  . s data=$$readChars(len)
 | |
|  . r ok 
 | |
|  . i $d(^zmwire("monitor","listener")) d log(data)
 | |
|  i data["""" s data=$$replaceAll(data,"""","""""")
 | |
|  i data="zmwire_null_value" s data=""
 | |
|  s x="s "_gloRef_"="""_data_""""
 | |
|  i $g(^zewd("trace"))=1 d trace("SET x = "_x)
 | |
|  s $zt=$$zt()
 | |
|  x x
 | |
|  s $zt=""
 | |
|  s json="{""ok"":true}"
 | |
|  s output="$"_$l(json)_crlf_json_crlf
 | |
|  w output
 | |
|  i $g(^zewd("trace"))=1 d trace("set: ok:true sent")
 | |
|  i $g(^mwire("logger"))=1 d logger("set")
 | |
|  QUIT
 | |
|  ;
 | |
| getGlobalList()
 | |
|  ;
 | |
|  n arrString,comma,count,glo,gloRef,list,response,x
 | |
|  ;
 | |
|  i $zv["GT.M" d
 | |
|  . s x="^%"
 | |
|  . i $d(@x) s list(x)=""
 | |
|  . f  s x=$order(@x) q:x=""  s list(x)=""
 | |
|  . ;
 | |
|  e  d
 | |
|  . d getGlobalList^MDBMCache(.list)
 | |
|  ;
 | |
|  ;s count=0,glo=""
 | |
|  ;f  s glo=$o(list(glo)) q:glo=""  s count=count+1
 | |
|  ;s response="*"_count_crlf
 | |
|  ;w response
 | |
|  ;i $g(^zewd("trace"))=1 d trace("getGlobalList: "_response_" sent") 
 | |
|  ;s glo=""
 | |
|  ;f  s glo=$o(list(glo)) q:glo=""  d
 | |
|  ;. s gloRef=$e(glo,2,$l(glo))
 | |
|  ;. s response="$"_$l(gloRef)_crlf_gloRef_crlf
 | |
|  ;. w response
 | |
|  ;. i $g(^zewd("trace"))=1 d trace("getGlobalList: "_response_" sent") 
 | |
|  s arrString="["
 | |
|  s glo="",comma=""
 | |
|  f  s glo=$o(list(glo)) q:glo=""  d
 | |
|  . s gloRef=$e(glo,2,$l(glo))
 | |
|  . s arrString=arrString_comma_""""_gloRef_""""
 | |
|  . s comma=","
 | |
|  s arrString=arrString_"]"
 | |
|  s response="$"_$l(arrString)_crlf_arrString_crlf
 | |
|  w response
 | |
|  i $g(^zewd("trace"))=1 d trace("getGlobalList: "_response_" sent")  ;
 | |
|  QUIT
 | |
|  ;
 | |
| getGlobals()
 | |
|  ;
 | |
|  n arrString,comma,count,glo,gloRef,list,response,x
 | |
|  ;
 | |
|  i $zv["GT.M" d
 | |
|  . s x="^%"
 | |
|  . i $d(@x) s list(x)=""
 | |
|  . f  s x=$order(@x) q:x=""  s list(x)=""
 | |
|  . ;
 | |
|  e  d
 | |
|  . d getGlobalList^MDBMCache(.list)
 | |
|  ;
 | |
|  s count=0,glo=""
 | |
|  f  s glo=$o(list(glo)) q:glo=""  s count=count+1
 | |
|  s response="*"_count_crlf
 | |
|  w response
 | |
|  i $g(^zewd("trace"))=1 d trace("getGlobalList: "_response_" sent") 
 | |
|  s glo=""
 | |
|  f  s glo=$o(list(glo)) q:glo=""  d
 | |
|  . s gloRef=$e(glo,2,$l(glo))
 | |
|  . s response="$"_$l(gloRef)_crlf_gloRef_crlf
 | |
|  . w response
 | |
|  . i $g(^zewd("trace"))=1 d trace("getGlobalList: "_response_" sent") 
 | |
|  QUIT
 | |
|  ;
 | |
| get(input)
 | |
|  ;
 | |
|  n data,exists,gloRef,response,x
 | |
|  ;
 | |
|  ; GET myglobal["1","xx yy",3]
 | |
|  ; $6
 | |
|  ; foobar
 | |
|  ;
 | |
|  s gloRef=$$getGloRef(input)
 | |
|  i gloRef["^zmwire" s output="-No access allowed to this global"_crlf w output QUIT
 | |
|  s x="s exists=$d("_gloRef_")"
 | |
|  s $zt=$$zt()
 | |
|  x x
 | |
|  s $zt=""
 | |
|  i exists'=1,exists'=11 s output="$-1"_crlf w output QUIT
 | |
|  s x="s data="_gloRef
 | |
|  s $zt=$$zt()
 | |
|  x x
 | |
|  s $zt=""
 | |
|  ;
 | |
|  s response="$"_$l(data)_crlf_data_crlf
 | |
|  ;
 | |
|  w response
 | |
|  i $g(^mwire("logger"))=1 d logger("get")
 | |
|  QUIT
 | |
|  ;
 | |
| getGlobal(input)
 | |
|  ;
 | |
|  n data,exists,gloRef,json,response,x
 | |
|  ;
 | |
|  ; GET myglobal["1","xx yy",3]
 | |
|  ; $6
 | |
|  ; foobar
 | |
|  ;
 | |
|  s gloRef=$$getGloRef(input)
 | |
|  i gloRef["^zmwire" s output="-No access allowed to this global"_crlf w output QUIT
 | |
|  s x="s exists=$d("_gloRef_"),"
 | |
|  ;x x
 | |
|  s x=x_"data=$g("_gloRef_")"
 | |
|  s $zt=$$zt()
 | |
|  x x
 | |
|  s $zt=""
 | |
|  s json="{""value"":"""_data_""",""dataStatus"":"_exists_"}"
 | |
|  ;
 | |
|  s response="$"_$l(json)_crlf_json_crlf
 | |
|  ;
 | |
|  w response
 | |
|  i $g(^zewd("trace"))=1 d trace("getGlobal: response="_response)
 | |
|  i $g(^mwire("logger"))=1 d logger("getGlobal")
 | |
|  QUIT
 | |
|  ;
 | |
| multiGet(input)
 | |
|  ;
 | |
|  n comma,dataStatus,error,exists,globalName,i,json,props,ref,response,subs,value
 | |
|  ;
 | |
|  ; MULTIGET myglobal[
 | |
|  ;  {globalName:'xxx', subscripts:["x1","y1"]},
 | |
|  ;  {globalName:'xxx', subscripts:["x2",""]},
 | |
|  ;  {globalName:'xxx', subscripts:["x2","y2"]}
 | |
|  ;]
 | |
|  ;
 | |
|  ;
 | |
|  s error=$$parseJSON(input,.props,1)
 | |
|  i error'="" s output="-"_error_crlf w output QUIT
 | |
|  ;
 | |
|  s stop=0,error="",json="[",comma=""
 | |
|  f i=1:1 q:'$d(props(i))  d
 | |
|  . s dataStatus=0,value="",error=""
 | |
|  . s globalName=$g(props(i,"globalName"))
 | |
|  . i globalName="" s globalName=$g(props(i,"GlobalName"))
 | |
|  . i globalName="" d
 | |
|  . . s error="globalName not defined"
 | |
|  . e  d
 | |
|  . . i $e(globalName,1)'="^" s globalName="^"_globalName
 | |
|  . . s ref="s exists=$d("_globalName
 | |
|  . . s subs=""
 | |
|  . . i $d(props(i,"subscripts")) d
 | |
|  . . . n comma,j,stop,sub
 | |
|  . . . s subs="(",comma="",stop=0
 | |
|  . . . f j=1:1 q:'$d(props(i,"subscripts",j))  d  q:stop
 | |
|  . . . . s sub=props(i,"subscripts",j)
 | |
|  . . . . i sub="" s error="Subscript "_j_" is null",stop=1 q
 | |
|  . . . . s subs=subs_comma_""""_props(i,"subscripts",j)_"""",comma=","
 | |
|  . . . i error="" s subs=subs_")"
 | |
|  . . i error="" d
 | |
|  . . . s ref=ref_subs_")"
 | |
|  . . . s $zt=$$zt()
 | |
|  . . . x ref
 | |
|  . . . s $zt=""
 | |
|  . . . i exists d
 | |
|  . . . . s ref="s value=$g("_globalName
 | |
|  . . . . s ref=ref_subs_")"
 | |
|  . . . . s $zt=$$zt()
 | |
|  . . . . x ref
 | |
|  . . . . s $zt=""
 | |
|  . s json=json_comma_"{""value"":"""_value_""",""dataStatus"":"_exists_",""error"":"""_error_"""}"
 | |
|  . s comma=","
 | |
|  s json=json_"]"
 | |
|  ;
 | |
|  s response="$"_$l(json)_crlf_json_crlf
 | |
|  ;
 | |
|  w response
 | |
|  i $g(^zewd("trace"))=1 d trace("multiGet: response="_response)
 | |
|  QUIT
 | |
|  ;
 | |
| kill(input)
 | |
|  ;
 | |
|  n i,glo,gloRef,len,nsp,p1,p2,x
 | |
|  ;
 | |
|  ; KILL myglobal["1","xx yy",3]
 | |
|  ; +OK
 | |
|  ;
 | |
|  s glo=input
 | |
|  s p1=$p(glo,"[",1)
 | |
|  s p2=$p(glo,"[",2,2000)
 | |
|  s p2=$e(p2,1,$l(p2)-1)
 | |
|  s glo=p1_"("_p2_")"
 | |
|  i glo["()" d
 | |
|  . s len=$l(glo)
 | |
|  . i $e(glo,len-1,len)="()" s glo=$e(glo,1,len-2)
 | |
|  e  d
 | |
|  . ; Process Javascript escaping
 | |
|  . n c123,quot
 | |
|  . s quot=""""
 | |
|  . f i=1:1:$l(glo)-2 d
 | |
|  . . s c123=$e(glo,i,i+2)
 | |
|  . . i $e(c123,1)'="\" q
 | |
|  . . i $e(c123,2)="\" q
 | |
|  . . i $e(c123,2)=quot d  q
 | |
|  . . . i $e(c123,3)="," q
 | |
|  . . . i $e(c123,3)=")" q
 | |
|  . . . s glo=$e(glo,1,i-1)_quot_quot_$e(glo,i+2,$l(glo))
 | |
|  . i glo["\\" d
 | |
|  . . s glo=$$replaceAll(glo,"\\",$c(5))
 | |
|  . . s glo=$$replaceAll(glo,$c(5),"\")
 | |
|  ;
 | |
|  i glo'["zmwire" s glo(glo)=""
 | |
| 
 | |
|  s x="k ^"_glo
 | |
|  s $zt=$$zt()
 | |
|  x x
 | |
|  s $zt=""
 | |
|  s response="+ok"_crlf
 | |
|  i $g(^%zewd("trace"))=1 d trace("kill: response="_response)
 | |
|  w response
 | |
|  i $g(^mwire("logger"))=1 d logger("kill")
 | |
|  QUIT
 | |
|  ;
 | |
| data(input)
 | |
|  ;
 | |
|  n data,gloRef,x
 | |
|  ;
 | |
|  ; DATA myglobal["1","xx yy",3]
 | |
|  ; :10
 | |
|  ;
 | |
|  s gloRef=$$getGloRef(input)
 | |
|  i gloRef["^zmwire" s output="-No access allowed to this global"_crlf w output QUIT
 | |
|  s x="s data=$d("_gloRef_")"
 | |
|  s $zt=$$zt()
 | |
|  x x
 | |
|  s $zt=""
 | |
|  i $g(^zewd("trace"))=1 d trace("input="_input_"; data="_data)
 | |
|  s output=":"_data_crlf
 | |
|  w output
 | |
|  i $g(^mwire("logger"))=1 d logger("data")
 | |
|  QUIT
 | |
|  ;
 | |
| runTransaction(input)
 | |
|  ;
 | |
|  n error,globalName,i,json,props,ref,result,stop,subscripts
 | |
|  ;
 | |
|  s error=$$parseJSON(input,.props,1)
 | |
|  i error'="" s output="-"_error_crlf w output QUIT
 | |
|  ;
 | |
|  s stop=0,error=""
 | |
|  f i=1:1 q:'$d(props(i))  d  q:stop
 | |
|  . s method=$g(props(i,"method"))
 | |
|  . i method="" s stop=1,error="Missing method in JSON transaction document at step "_i q
 | |
|  . i method="setJSON" d  q:stop
 | |
|  . . n json
 | |
|  . . m json=props(i,"json")
 | |
|  . . i '$d(json) s stop=1,error="Missing JSON document in JSON transaction document at step "_i q
 | |
|  . . s globalName=$g(props(i,"globalName"))
 | |
|  . . i globalName="" s globalName=$g(props(i,"GlobalName"))
 | |
|  . . i globalName="" s stop=1,error="Missing Global name in JSON transaction document at step "_i q
 | |
|  . . i $e(globalName,1)'="^" s globalName="^"_globalName
 | |
|  . . s ref="m "_globalName
 | |
|  . . i $d(props(i,"subscripts")) d
 | |
|  . . . n comma,j
 | |
|  . . . s ref=ref_"(",comma=""
 | |
|  . . . f j=1:1 q:'$d(props(i,"subscripts",j))  d
 | |
|  . . . . s ref=ref_comma_""""_props(i,"subscripts",j)_"""",comma=","
 | |
|  . . . s ref=ref_")"
 | |
|  . . s ref=ref_"=json"
 | |
|  . . x ref
 | |
|  . i method="setGlobal" d  q:stop
 | |
|  . . n value
 | |
|  . . s globalName=$g(props(i,"globalName"))
 | |
|  . . i globalName="" s globalName=$g(props(i,"GlobalName"))
 | |
|  . . i globalName="" s stop=1,error="Missing Global name in JSON transaction document at step "_i q
 | |
|  . . i $e(globalName,1)'="^" s globalName="^"_globalName
 | |
|  . . s ref="s "_globalName
 | |
|  . . i $d(props(i,"subscripts")) d
 | |
|  . . . n comma,j
 | |
|  . . . s ref=ref_"(",comma=""
 | |
|  . . . f j=1:1 q:'$d(props(i,"subscripts",j))  d
 | |
|  . . . . s ref=ref_comma_""""_props(i,"subscripts",j)_"""",comma=","
 | |
|  . . . s value=$g(props(i,"value"))
 | |
|  . . . i value="zmwire_null_value" s value=""
 | |
|  . . . s ref=ref_")="""_value_""""
 | |
|  . . x ref
 | |
|  . i method="kill" d  q:stop
 | |
|  . . s globalName=$g(props(i,"globalName"))
 | |
|  . . i globalName="" s globalName=$g(props(i,"GlobalName"))
 | |
|  . . i globalName="" s stop=1,error="Missing Global name in JSON transaction document at step "_i q
 | |
|  . . i $e(globalName,1)'="^" s globalName="^"_globalName
 | |
|  . . s ref="k "_globalName
 | |
|  . . i $d(props(i,"subscripts")) d
 | |
|  . . . n comma,j
 | |
|  . . . s ref=ref_"(",comma=""
 | |
|  . . . f j=1:1 q:'$d(props(i,"subscripts",j))  d
 | |
|  . . . . s ref=ref_comma_""""_props(i,"subscripts",j)_"""",comma=","
 | |
|  . . . s ref=ref_")"
 | |
|  . . x ref
 | |
|  ;
 | |
|  i error'="" s output="-"_error_crlf w output QUIT
 | |
|  s response="+ok"_crlf
 | |
|  w response
 | |
|  i $g(^zewd("trace"))=1 d trace("transaction: response="_response)
 | |
|  QUIT
 | |
|  ;
 | |
| setJSON(input)
 | |
|  ;
 | |
|  n arr,del,error,flrc,inputr,gloRef,inputr,json,nb,nsp,props,ref,response,subs
 | |
|  ;
 | |
|  ; SETJSONSTRING myglobal["1","xx yy",3] CRLF {"a":123} CRLF 1
 | |
|  ; +ok
 | |
|  ;
 | |
|  s flrc=$c(10,13)
 | |
|  s gloRef=$p(input,crlf,1)
 | |
|  s input=$p(input,crlf,2,10000)
 | |
|  s inputr=$re(input)
 | |
|  s del=$p(inputr,flrc,1),del=$re(del)
 | |
|  s inputr=$p(inputr,flrc,2,10000) ; in case it contains crlfs
 | |
|  s json=$re(inputr)
 | |
|  i $zv["GT.M" d
 | |
|  . s json=$$unEscape(json)
 | |
|  e  d
 | |
|  . s json=$$unEscape^MDBMCache(json)
 | |
|  ;
 | |
|  i $e(gloRef,1)'="^" s gloRef="^"_gloRef
 | |
|  i $e(gloRef,$l(gloRef))="]" s gloRef=$e(gloRef,1,$l(gloRef)-1)
 | |
|  s gloName=$p(gloRef,"[",1)
 | |
|  s nb=$l(gloRef,"[")+2
 | |
|  s subs=$p(gloRef,"[",2,nb)
 | |
|  s gloRef=gloName
 | |
|  i gloRef["^zmwire" s output="-No access allowed to this global"_crlf w output QUIT
 | |
|  i subs'="" s gloRef=gloRef_"("_subs_")"
 | |
|  s error=$$parseJSON(json,.props,1)
 | |
|  i error'="" s output="-Invalid JSON in setJSON: "_json_crlf w output QUIT
 | |
|  ;
 | |
|  s ref=""
 | |
|  i del s ref="k "_gloRef_" "
 | |
|  ;
 | |
|  s ref=ref_"m "_gloRef_"=props"
 | |
|  x ref
 | |
|  s response="+OK"_crlf
 | |
|  w response
 | |
|  i $g(^zewd("trace"))=1 d trace("setJSON: response="_response)
 | |
|  i $g(^mwire("logger"))=1 d logger("setJSON")
 | |
|  ;
 | |
|  QUIT
 | |
|  ;
 | |
| getJSON(input)
 | |
|  ;
 | |
|  n arr,inputr,gloRef,json,nb,nsp,ref,response,subs
 | |
|  ;
 | |
|  ; GETJSONSTRING myglobal["1","xx yy",3]
 | |
|  ; $5
 | |
|  ; {x:1}
 | |
|  ;
 | |
|  s gloRef=input
 | |
|  i $e(gloRef,1)'="^" s gloRef="^"_gloRef
 | |
|  i $e(gloRef,$l(gloRef))="]" s gloRef=$e(gloRef,1,$l(gloRef)-1)
 | |
|  s gloName=$p(gloRef,"[",1)
 | |
|  s nb=$l(gloRef,"[")+2
 | |
|  s subs=$p(gloRef,"[",2,nb)
 | |
|  s gloRef=gloName
 | |
|  i gloRef["^zmwire" s output="-No access allowed to this global"_crlf w output QUIT
 | |
|  i subs'="" s gloRef=gloRef_"("_subs_")"
 | |
|  s ref="m arr="_gloRef
 | |
|  x ref
 | |
|  i '$d(arr) d
 | |
|  . s response="$-1"_crlf
 | |
|  e  d
 | |
|  . s json=$$arrayToJSON("arr")
 | |
|  . s response="$"_$l(json)_crlf_json_crlf
 | |
|  i $g(^zewd("trace"))=1 d trace("getJSON: response="_response)
 | |
|  ;
 | |
|  w response
 | |
|  ;
 | |
|  i $g(^mwire("logger"))=1 d logger("getJSON")
 | |
|  QUIT
 | |
|  ;
 | |
| incr(input)
 | |
|  ;
 | |
|  n data,gloRef,x
 | |
|  ;
 | |
|  ; INCR myglobal["1","xx yy",3]
 | |
|  ; :4
 | |
|  ;
 | |
|  s gloRef=$$getGloRef(input)
 | |
|  i gloRef["^zmwire" s output="-No access allowed to this global"_crlf w output QUIT
 | |
|  s x="s data=$increment("_gloRef_")"
 | |
|  s $zt=$$zt()
 | |
|  x x
 | |
|  s $zt=""
 | |
|  s output=":"_data_crlf
 | |
|  w output
 | |
|  i $g(^mwire("logger"))=1 d logger("incr")
 | |
|  QUIT
 | |
|  ;
 | |
| incrby(input)
 | |
|  ;
 | |
|  n by,data,gloName,gloRef,inputr,len,nb,nsp,ok,subs,x
 | |
|  ;
 | |
|  ; INCRBY myglobal["1","xx yy",3] 3
 | |
|  ; :7
 | |
|  ;
 | |
|  s inputr=$re(input)
 | |
|  s by=$re($p(inputr," ",1))
 | |
|  s nsp=$l(input," ")+2
 | |
|  s gloRef=$p(inputr," ",2,nsp)
 | |
|  s gloRef=$re(gloRef)
 | |
|  i $e(gloRef,1)'="^" s gloRef="^"_gloRef
 | |
|  i $e(gloRef,$l(gloRef))="]" s gloRef=$e(gloRef,1,$l(gloRef)-1)
 | |
|  s gloName=$p(gloRef,"[",1)
 | |
|  s nb=$l(gloRef,"[")+2
 | |
|  s subs=$p(gloRef,"[",2,nb)
 | |
|  s gloRef=gloName
 | |
|  i gloRef["^zmwire" s output="-No access allowed to this global"_crlf w output QUIT
 | |
|  i subs'="" s gloRef=gloRef_"("_subs_")"
 | |
|  s x="s data=$increment("_gloRef_","_by_")"
 | |
|  s $zt=$$zt() x x
 | |
|  s $zt=""
 | |
|  s output=":"_data_crlf
 | |
|  w output
 | |
|  i $g(^mwire("logger"))=1 d logger("incrbr")
 | |
|  QUIT
 | |
|  ;
 | |
| function(input)
 | |
|  ;
 | |
|  n data,func,x
 | |
|  ;
 | |
|  ; FUNCTION label^rou("1","xx yy")
 | |
|  ; $5
 | |
|  ; hello
 | |
|  ;
 | |
|  s func=input
 | |
|  i func["^",$e(func,1,2)'="$$" s func="$$"_func
 | |
|  i func["class(",$e(func,1,2)'="##" s func="##"_func
 | |
|  s x="s data="_func
 | |
|  s $zt=$$zt()
 | |
|  x x
 | |
|  s $zt=""
 | |
|  s output="$"_$l(data)_crlf_data_crlf
 | |
|  w output
 | |
|  i $g(^mwire("logger"))=1 d logger("function")
 | |
|  QUIT
 | |
|  ;
 | |
| decr(input)
 | |
|  ;
 | |
|  n data,gloRef,x
 | |
|  ;
 | |
|  ; DECR myglobal["1","xx yy",3]
 | |
|  ; :3
 | |
|  ;
 | |
|  s gloRef=$$getGloRef(input)
 | |
|  i gloRef["^zmwire" s output="-No access allowed to this global"_crlf w output QUIT
 | |
|  s x="s data=$increment("_gloRef_",-1)"
 | |
|  s $zt=$$zt() x x
 | |
|  s $zt=""
 | |
|  s output=":"_data_crlf
 | |
|  w output
 | |
|  i $g(^mwire("logger"))=1 d logger("decr")
 | |
|  QUIT
 | |
|  ;
 | |
| decrby(input)
 | |
|  ;
 | |
|  n by,data,gloName,gloRef,inputr,nb,nsp,ok,subs,x
 | |
|  ;
 | |
|  ; DECRBY myglobal["1","xx yy",3] 3
 | |
|  ; :4
 | |
|  ;
 | |
|  s inputr=$re(input)
 | |
|  s by=$re($p(inputr," ",1))
 | |
|  s nsp=$l(input," ")+2
 | |
|  s gloRef=$p(inputr," ",2,nsp)
 | |
|  s gloRef=$re(gloRef)
 | |
|  i $e(gloRef,1)'="^" s gloRef="^"_gloRef
 | |
|  i $e(gloRef,$l(gloRef))="]" s gloRef=$e(gloRef,1,$l(gloRef)-1)
 | |
|  s gloName=$p(gloRef,"[",1)
 | |
|  s nb=$l(gloRef,"[")+2
 | |
|  s subs=$p(gloRef,"[",2,nb)
 | |
|  s gloRef=gloName
 | |
|  i gloRef["^zmwire" s output="-No access allowed to this global"_crlf w output QUIT
 | |
|  i subs'="" s gloRef=gloRef_"("_subs_")"
 | |
|  s x="s data=$increment("_gloRef_",-"_by_")"
 | |
|  s $zt=$$zt()
 | |
|  x x
 | |
|  s $zt=""
 | |
|  s output=":"_data_crlf
 | |
|  w output
 | |
|  i $g(^mwire("logger"))=1 d logger("decrby")
 | |
|  QUIT
 | |
|  ;
 | |
| nextSubscript(input,direction)
 | |
|  ;
 | |
|  n data,gloRef,response,subscript,x,value
 | |
|  ;
 | |
|  ; NEXTSUBSCRIPT myglobal["1","xx yy",""]
 | |
|  ; +abc
 | |
|  ;
 | |
|  s gloRef=$$getGloRef(input)
 | |
|  i gloRef["^zmwire" s output="-No access allowed to this global"_crlf w output QUIT
 | |
|  s x="s subscript=$o("_gloRef_",direction)"
 | |
|  s $zt=$$zt()
 | |
|  x x
 | |
|  s $zt=""
 | |
|  s value="",data=0
 | |
|  i subscript'="" d
 | |
|  . s value=$g(^(subscript))
 | |
|  . s data=$d(^(subscript))
 | |
|  ;
 | |
|  s response="{""subscriptValue"":"""_subscript_""","
 | |
|  s response=response_"""dataStatus"":"_data_","
 | |
|  s response=response_"""dataValue"":"""_value_"""}"
 | |
|  ;
 | |
|  s response="$"_$l(response)_crlf_response_crlf
 | |
|  i $g(^zewd("trace"))=1 d trace("nextsubscript: response="_response)
 | |
|  w response
 | |
|  i $g(^mwire("logger"))=1 d logger("nextsubscript")
 | |
|  ;
 | |
|  QUIT
 | |
|  ;
 | |
| order(input)
 | |
|  ;
 | |
|  n data,gloRef,x
 | |
|  ;
 | |
|  ; ORDER myglobal["1","xx yy",""]
 | |
|  ; +abc
 | |
|  ;
 | |
|  s gloRef=$$getGloRef(input)
 | |
|  i gloRef["^zmwire" s output="-No access allowed to this global"_crlf w output QUIT
 | |
|  s x="s data=$o("_gloRef_")"
 | |
|  s $zt=$$zt()
 | |
|  x x
 | |
|  s $zt=""
 | |
|  i data="" s output="$-1"_crlf w output QUIT
 | |
|  s output="$"_$l(data)_crlf_data_crlf
 | |
|  w output
 | |
|  i $g(^mwire("logger"))=1 d logger("order")
 | |
|  QUIT
 | |
|  ;
 | |
| reverseorder(input)
 | |
|  ;
 | |
|  n data,gloRef,x
 | |
|  ;
 | |
|  ; REVORDER myglobal["1","xx yy",""]
 | |
|  ; +abc
 | |
|  ;
 | |
|  s gloRef=$$getGloRef(input)
 | |
|  i gloRef["^zmwire" s output="-No access allowed to this global"_crlf w output QUIT
 | |
|  s x="s data=$o("_gloRef_",-1)"
 | |
|  s $zt=$$zt()
 | |
|  x x
 | |
|  s $zt=""
 | |
|  i data="" s output="$-1"_crlf w output QUIT
 | |
|  s output="$"_$l(data)_crlf_data_crlf
 | |
|  w output
 | |
|  i $g(^mwire("logger"))=1 d logger("reverseorder")
 | |
|  QUIT
 | |
|  ;
 | |
| query(input)
 | |
|  ;
 | |
|  n data,gloRef,nb,p1,p2,x
 | |
|  ;
 | |
|  ; QUERY myglobal["1","xx yy"]
 | |
|  ;
 | |
|  s gloRef=$$getGloRef(input)
 | |
|  i gloRef["^zmwire" s output="-No access allowed to this global"_crlf w output QUIT
 | |
|  s x="s data=$q("_gloRef_")"
 | |
|  s $zt=$$zt()
 | |
|  ;d trace("query x="_x)
 | |
|  x x
 | |
|  i data="" s output="$-1"_crlf w output QUIT
 | |
|  s data=$e(data,2,$l(data))
 | |
|  ;d trace("data="_data)
 | |
|  s p1=$p(data,"(",1)
 | |
|  s nb=$l(data,"(")+2
 | |
|  ;d trace("nb="_nb)
 | |
|  s p2=$p(data,"(",2,nb)
 | |
|  ;d trace("1 p2="_p2)
 | |
|  s p2=$e(p2,1,$l(p2)-1)
 | |
|  ;d trace("2 p2="_p2)
 | |
|  s data=p1_"["_p2_"]"
 | |
|  s output="$"_$l(data)_crlf_data_crlf
 | |
|  w output
 | |
|  s $zt=""
 | |
|  i $g(^mwire("logger"))=1 d logger("query")
 | |
|  QUIT
 | |
|  ;
 | |
| queryget(input)
 | |
|  ;
 | |
|  n data,gloRef,nb,odata,p1,p2,value,x
 | |
|  ;
 | |
|  ; QUERYGET myglobal["1","xx yy"]
 | |
|  ;
 | |
|  s gloRef=$$getGloRef(input)
 | |
|  i gloRef["^zmwire" s output="-No access allowed to this global"_crlf w output QUIT
 | |
|  s x="s data=$q("_gloRef_")"
 | |
|  s $zt=$$zt()
 | |
|  x x
 | |
|  i data="" s output="$-1"_crlf w output QUIT
 | |
|  s odata=data
 | |
|  s output="*2"_crlf
 | |
|  w output
 | |
|  s data=$e(data,2,$l(data))
 | |
|  s p1=$p(data,"(",1)
 | |
|  s nb=$l(data,"(")+2
 | |
|  s p2=$p(data,"(",2,nb)
 | |
|  s p2=$e(p2,1,$l(p2)-1)
 | |
|  s data=p1_"["_p2_"]"
 | |
|  s output="$"_$l(data)_crlf_data_crlf
 | |
|  w output
 | |
|  s value=@odata
 | |
|  s output="$"_$l(value)_crlf_value_crlf
 | |
|  w output
 | |
|  s $zt=""
 | |
|  i $g(^mwire("logger"))=1 d logger("queryget")
 | |
|  QUIT
 | |
|  ;
 | |
| lock(input)
 | |
|  ;
 | |
|  n gloName,gloRef,inputr,nb,nsp,ok,subs,time,x
 | |
|  ;
 | |
|  ; LOCK myglobal["1","xxyy"] 5
 | |
|  ; +OK
 | |
|  ;
 | |
|  s inputr=$re(input)
 | |
|  s time=$re($p(inputr," ",1))
 | |
|  i time?1N.N d
 | |
|  . s nsp=$l(input," ")+2
 | |
|  . s gloRef=$p(inputr," ",2,nsp)
 | |
|  e  d
 | |
|  . s time=5
 | |
|  . s gloRef=inputr
 | |
|  s gloRef=$re(gloRef)
 | |
|  i $e(gloRef,1)'="^" s gloRef="^"_gloRef
 | |
|  i $e(gloRef,$l(gloRef))="]" s gloRef=$e(gloRef,1,$l(gloRef)-1)
 | |
|  s gloName=$p(gloRef,"[",1)
 | |
|  i gloRef["^zmwire" s output="-No access allowed to this global"_crlf w output QUIT
 | |
|  s nb=$l(gloRef,"[")+2
 | |
|  s subs=$p(gloRef,"[",2,nb)
 | |
|  s gloRef=gloName
 | |
|  i subs'="" s gloRef=gloRef_"("_subs_")"
 | |
|  s x="s ok=1 l +"_gloRef_":"_time_" e  s ok=0"
 | |
|  s $zt=$$zt()
 | |
|  x x
 | |
|  s $zt=""
 | |
|  s output=":"_ok_crlf
 | |
|  w output
 | |
|  QUIT
 | |
|  ;
 | |
| unlock(input)
 | |
|  ;
 | |
|  n gloRef,x
 | |
|  ;
 | |
|  ; UNLOCK myglobal["1","xxyy"]
 | |
|  ; +OK
 | |
|  ;
 | |
|  s gloRef=$$getGloRef(input)
 | |
|  i gloRef["^zmwire" s output="-No access allowed to this global"_crlf w output QUIT
 | |
|  s x="l -"_gloRef
 | |
|  s $zt=$$zt()
 | |
|  x x
 | |
|  s $zt=""
 | |
|  s output="+OK"_crlf
 | |
|  w output
 | |
|  QUIT
 | |
|  ;
 | |
| getAllSubscripts(input)
 | |
|  ;
 | |
|  n comma,data,exists,from,i,gloRef,len,numericEnd,rec,ref
 | |
|  n stop,subscripts,subs,subs1,to,x
 | |
|  ;
 | |
|  ; GETSUBSCRIPTS myglobal["1","xx yy"] fromValue toValue
 | |
|  ; 
 | |
|  s gloRef=$p(input,$c(1),1)
 | |
|  s gloRef=$$getGloRef(gloRef)
 | |
|  s from=$p(input,$c(1),2)
 | |
|  i from="zz-null" s from=""
 | |
|  s to=$p(input,$c(1),3)
 | |
|  i to="zz-null" s to=""
 | |
|  s numericEnd=$$numeric(to)
 | |
|  ;d trace("to="_to_": numeric = "_numericEnd)
 | |
|  ;
 | |
|  i gloRef["^zmwire" s output="-No access allowed to this global"_crlf w output QUIT
 | |
|  i $e(gloRef,$l(gloRef))=")" d
 | |
|  . s x="s exists=$d("_gloRef_")"
 | |
|  . s gloRef=$e(gloRef,1,$l(gloRef)-1)_","
 | |
|  e  d
 | |
|  . s x="s exists=$d("_gloRef_")"
 | |
|  . s gloRef=gloRef_"("
 | |
|  s $zt=$$zt()
 | |
|  x x
 | |
|  s $zt=""
 | |
|  i 'exists!(exists=1) s output="$2"_crlf_"[]"_crlf w output QUIT
 | |
|  ;
 | |
|  s subs=from
 | |
|  s subs1=subs i subs1["""" s subs1=$$replaceAll(subs1,"""","""""")
 | |
|  i from'="" d
 | |
|  . s x="s subs1=$o("_gloRef_""""_subs1_"""),-1)"
 | |
|  . ;d trace("1 x="_x)
 | |
|  . x x
 | |
|  s x="s subs=$o("_gloRef_""""_subs1_"""))"
 | |
|  x x
 | |
|  s len=3+$l(subs)
 | |
|  s comma=",",stop=0
 | |
|  i subs'="" d
 | |
|  . f  s subs=$o(^(subs)) q:stop  d
 | |
|  . . i subs="" s stop=1 q
 | |
|  . . i to'="" d  q:stop
 | |
|  . . . i numericEnd d
 | |
|  . . . . ;d trace("numeric: subs="_subs_": to="_to)
 | |
|  . . . . i $$numeric(subs),subs>to s stop=1
 | |
|  . . . e  d
 | |
|  . . . . i subs]to s stop=1
 | |
|  . . s len=len+$l(comma)+2+$l(subs)
 | |
|  ;d trace("3 len="_len)
 | |
|  s len=len+1
 | |
|  s response="$"_len_crlf
 | |
|  w response
 | |
|  ;
 | |
|  s x="s subs=$o("_gloRef_""""_subs1_"""))"
 | |
|  ;d trace("4 x="_x)
 | |
|  ;d trace("xx to="_to)
 | |
|  x x
 | |
|  s response="["""_subs_""""
 | |
|  w response
 | |
|  i subs'="" d
 | |
|  . s stop=0
 | |
|  . f  s subs=$o(^(subs)) q:stop  d
 | |
|  . . i subs="" s stop=1 q
 | |
|  . . i to'="" d  q:stop
 | |
|  . . . i numericEnd d
 | |
|  . . . . ;d trace("numeric: subs="_subs_": to="_to)
 | |
|  . . . . i $$numeric(subs),subs>to s stop=1
 | |
|  . . . e  d
 | |
|  . . . . i subs]to s stop=1
 | |
|  . . s response=comma_""""_subs_""""
 | |
|  . . w response
 | |
|  ;d trace("5 response="_response)
 | |
|  s response="]"_crlf
 | |
|  w response
 | |
|  i $g(^mwire("logger"))=1 d logger("getallsubscripts")
 | |
|  ;
 | |
|  QUIT
 | |
|  ;
 | |
| orderall(input)
 | |
|  ;
 | |
|  n data,exists,i,gloRef,rec,subs,subs1,x
 | |
|  ;
 | |
|  ; ORDERALL myglobal["1","xx yy"] 
 | |
|  ; *6
 | |
|  ; $2
 | |
|  ; aa
 | |
|  ; $5
 | |
|  ; hello
 | |
|  ; $2
 | |
|  ; bb
 | |
|  ; $5
 | |
|  ; world
 | |
|  ; $3
 | |
|  ; bba
 | |
|  ; $-1
 | |
|  ; 
 | |
|  s gloRef=$$getGloRef(input)
 | |
|  i gloRef["^zmwire" s output="-No access allowed to this global"_crlf w output QUIT
 | |
|  i $e(gloRef,$l(gloRef))=")" d
 | |
|  . s x="s exists=$d("_gloRef_")"
 | |
|  . s gloRef=$e(gloRef,1,$l(gloRef)-1)_","
 | |
|  e  d
 | |
|  . s x="s exists=$d("_gloRef_")"
 | |
|  . s gloRef=gloRef_"("
 | |
|  s $zt=$$zt()
 | |
|  x x
 | |
|  i 'exists s output="$-1"_crlf w output QUIT
 | |
|  ;
 | |
|  s subs="",rec=0
 | |
|  k ^CacheTempEWD($j)
 | |
|  f  d  q:subs=""
 | |
|  . s subs1=subs i subs1["""" s subs1=$$replaceAll(subs1,"""","""""")
 | |
|  . s x="s subs=$o("_gloRef_""""_subs1_"""))"
 | |
|  . x x
 | |
|  . i subs="" q
 | |
|  . s rec=rec+1
 | |
|  . s ^CacheTempEWD($j,rec)="$"_$l(subs)_crlf_subs_crlf
 | |
|  . s x="s exists=$d("_gloRef_""""_subs_"""))"
 | |
|  . x x
 | |
|  . i exists=1!(exists=11) d
 | |
|  . . s x="s data="_gloRef_""""_subs_""")"
 | |
|  . . x x
 | |
|  . . s rec=rec+1
 | |
|  . . s ^CacheTempEWD($j,rec)="$"_$l(data)_crlf_data_crlf
 | |
|  . e  d
 | |
|  . . s rec=rec+1
 | |
|  . . s ^CacheTempEWD($j,rec)="$-1"_crlf
 | |
|  s $zt=""
 | |
|  s output="*"_rec_crlf
 | |
|  w output
 | |
|  f i=1:1:rec w ^CacheTempEWD($j,i)
 | |
|  k ^CacheTempEWD($j)
 | |
|  i $g(^mwire("logger"))=1 d logger("orderall")
 | |
|  QUIT
 | |
|  ;
 | |
| mergefrom(input)
 | |
|  ;
 | |
|  n data,gloRef,i,params,resp,start,x
 | |
|  ;
 | |
|  ; MERGEFROM myglobal["1","a"]
 | |
|  ; *6
 | |
|  ; $1
 | |
|  ; 1  <keys>
 | |
|  ; $5
 | |
|  ; hello  <data>
 | |
|  ; $9
 | |
|  ; 1,"a\"aa"  <keys> note escaping
 | |
|  ; $5
 | |
|  ; world
 | |
|  ; $8
 | |
|  ; 2,"cccc"
 | |
|  ; $3
 | |
|  ; foo
 | |
|  ;
 | |
|  s gloRef=$$getGloRef(input)
 | |
|  i gloRef["^zmwire" s output="-No access allowed to this global"_crlf w output QUIT
 | |
|  k ^CacheTempEWD($j)
 | |
|  s x="m ^CacheTempEWD($j)="_gloRef
 | |
|  s $zt=$$zt()
 | |
|  x x
 | |
|  s $zt=""
 | |
|  s x=$q(^CacheTempEWD($j,""))
 | |
|  i x="" d  QUIT
 | |
|  . s output="*-1"_crlf 
 | |
|  . w output 
 | |
|  . k ^CacheTempEWD($j)
 | |
|  f i=1:1 s x=$q(@x) q:x=""
 | |
|  i $d(^CacheTempEWD($j))=1!($d(^CacheTempEWD($j))=11) s i=i+1
 | |
|  s output="*"_(i*2)_crlf
 | |
|  w output
 | |
|  i $d(^CacheTempEWD($j))=1!($d(^CacheTempEWD($j))=11) d
 | |
|  . s output="$-1"_crlf
 | |
|  . w output
 | |
|  . s output="$"_$l(^CacheTempEWD($j))_crlf_^CacheTempEWD($j)_crlf
 | |
|  . w output
 | |
|  s x=$q(^CacheTempEWD($j,""))
 | |
|  s start="^CacheTempEWD("_$j_","
 | |
|  s params=$p(x,start,2,2000)
 | |
|  s params=$e(params,1,$l(params)-1)
 | |
|  s resp=params
 | |
|  s output="$"_$l(resp)_crlf_resp_crlf
 | |
|  w output
 | |
|  s data=@x
 | |
|  s output="$"_$l(data)_crlf_data_crlf  
 | |
|  w output
 | |
|  f i=1:1 s x=$q(@x) q:x=""  d
 | |
|  . s params=$p(x,start,2,2000)
 | |
|  . s params=$e(params,1,$l(params)-1)
 | |
|  . s resp=params
 | |
|  . s output="$"_$l(resp)_crlf_resp_crlf  
 | |
|  . w output
 | |
|  . s data=@x
 | |
|  . i data="" d
 | |
|  . . s output="$-1"_crlf
 | |
|  . . w output
 | |
|  . e  d
 | |
|  . . s output="$"_$l(data)_crlf_data_crlf  
 | |
|  . . w output
 | |
|  k ^CacheTempEWD($j)
 | |
|  QUIT
 | |
|  ;
 | |
| mergeto(input)
 | |
|  ;
 | |
|  n data,dataLength,error,gloRef,i,key,keyLength,noOfRecs,x
 | |
|  ;
 | |
|  ; MERGETO myglobal["1","a"]
 | |
|  ; *6
 | |
|  ; $1
 | |
|  ; 1   <keys>
 | |
|  ; $5
 | |
|  ; hello  <data>
 | |
|  ; $7
 | |
|  ; 1,"aaa"  <keys>
 | |
|  ; $5
 | |
|  ; world   <data>
 | |
|  ; $8
 | |
|  ; 2,"cccc"
 | |
|  ; $3
 | |
|  ; foo
 | |
|  ; +OK
 | |
|  ;   note $-1 for key length means no key - data put at top level
 | |
|  ;
 | |
|  s $zt=$$zt()
 | |
|  s gloRef=$$getGloRef(input)
 | |
|  i gloRef["^zmwire" s output="-No access allowed to this global"_crlf w output QUIT
 | |
|  i $e(gloRef,$l(gloRef))=")" s gloRef=$e(gloRef,1,$l(gloRef)-1)
 | |
|  ;
 | |
|  r noOfRecs
 | |
|  i $e(noOfRecs,1)'="*" s output="-Invalid: expected number of records"_crlf w output QUIT
 | |
|  s noOfRecs=+$e(noOfRecs,2,$l(noOfRecs))
 | |
|  i noOfRecs'?1N.N s output="-Invalid format for number of records"_crlf w output QUIT
 | |
|  i noOfRecs=0 QUIT "+OK"_crlf QUIT
 | |
|  i (noOfRecs#2)=1 s output="-Invalid: no of records must be an even number"_crlf w output QUIT
 | |
|  s noOfRecs=noOfRecs/2
 | |
|  k ^CacheTempEWD($j)
 | |
|  s error=""
 | |
|  k ^CacheTempEWD($j)
 | |
|  f i=1:1:noOfRecs d  q:error'=""
 | |
|  . r keyLength
 | |
|  . i $e(keyLength,1)'="$" s error="Invalid record "_i_": record length" q
 | |
|  . s keyLength=+$e(keyLength,2,$l(keyLength))
 | |
|  . i keyLength=-1 d
 | |
|  . . s key=""
 | |
|  . e  d
 | |
|  . . i keyLength'?1N.N s error="Invalid record "_i_": bad format for record length" q
 | |
|  . . i keyLength=0 s error="Invalid record "_i_": record length cannot be zero" q
 | |
|  . . s key=$$readChars(keyLength)
 | |
|  . . r ok d log(key)
 | |
|  . . ;r key#keyLength,ok d log(key)
 | |
|  . . i key["\""" s key=$$replaceAll(key,"\""","""""")
 | |
|  . i error'="" q
 | |
|  . r dataLength
 | |
|  . i $e(dataLength,1)'="$" s error="Invalid record "_i_": expected data length" q
 | |
|  . s dataLength=+$e(dataLength,2,$l(dataLength))
 | |
|  . i dataLength'=-1,dataLength'?1N.N s error="Invalid record "_i_": bad format for data length" q
 | |
|  . i dataLength=-1 d
 | |
|  . . s data=""
 | |
|  . e  d
 | |
|  . . s data=$$readChars(dataLength)
 | |
|  . . r ok
 | |
|  . . d log(data)
 | |
|  . . ;r data#dataLength,ok d log(data)
 | |
|  . . i data["""" s data=$$replaceAll(data,"""","""""")
 | |
|  . i key="" d
 | |
|  . . n gloRef1
 | |
|  . . s gloRef1=gloRef
 | |
|  . . i gloRef["(" s gloRef1=gloRef1_")"
 | |
|  . . s x="s "_gloRef1_"="""_data_""""
 | |
|  . e  d
 | |
|  . . n gloRef1
 | |
|  . . s gloRef1=gloRef
 | |
|  . . i gloRef'["(" d
 | |
|  . . . s gloRef1=gloRef1_"("
 | |
|  . . e  d
 | |
|  . . . s gloRef1=gloRef1_","
 | |
|  . . s x="s "_gloRef1_key_")="""_data_""""
 | |
|  . s ^CacheTempEWD($j,i)=x
 | |
|  i error'="" s output="-"_error_crlf w output QUIT
 | |
|  f i=1:1:noOfRecs d
 | |
|  . s x=^CacheTempEWD($j,i)
 | |
|  . x x
 | |
|  k ^CacheTempEWD($j)
 | |
|  s output="+OK"_crlf
 | |
|  w output
 | |
|  s $zt=""
 | |
|  QUIT
 | |
|  ;
 | |
| copy(input)
 | |
|  ;
 | |
|  n fromGlo,killToFirst,p2,response,toGlo,x
 | |
|  ;
 | |
|  ; COPY fromGlobal["1","a"] toGlobal["x"] 1
 | |
|  i $g(^%zewd("trace"))=1 d trace("copy: input="_input)
 | |
|  s $zt=$$zt()
 | |
|  s fromGlo=$p(input,$c(1),1)
 | |
|  s toGlo=$p(input,$c(1),2)
 | |
|  s killToFirst=$p(input,$c(1),3)
 | |
|  s p2=$p(fromGlo,"[",2,2000)
 | |
|  s p2=$e(p2,1,$l(p2)-1)
 | |
|  i p2'="" s p2="("_p2_")"
 | |
|  s fromGlo="^"_$p(fromGlo,"[",1)_p2
 | |
|  s p2=$p(toGlo,"[",2,2000)
 | |
|  s p2=$e(p2,1,$l(p2)-1)
 | |
|  i p2'="" s p2="("_p2_")"
 | |
|  s toGlo="^"_$p(toGlo,"[",1)_p2
 | |
|  s x=""
 | |
|  i killToFirst s x="k "_toGlo_" "
 | |
|  s x=x_"m "_toGlo_"="_fromGlo
 | |
|  x x
 | |
|  ;
 | |
|  i $g(^%zewd("trace"))=1 d trace("x="_x)
 | |
|  s response="+ok"_crlf
 | |
|  i $g(^%zewd("trace"))=1 d trace("copy: response="_response)
 | |
|  w response
 | |
|  s $zt=""
 | |
|  i $g(^mwire("logger"))=1 d logger("copy")
 | |
|  ;
 | |
|  QUIT
 | |
|  ;
 | |
| mdate
 | |
|  ;
 | |
|  n date,day,time
 | |
|  ;
 | |
|  s date=$h
 | |
|  s day=+date
 | |
|  s output="*2"_crlf_"$"_$l(day)_crlf_day_crlf
 | |
|  w output
 | |
|  s time=$p(date,",",2)
 | |
|  s output="$"_$l(time)_crlf_time_crlf
 | |
|  w output
 | |
|  QUIT
 | |
|  ;
 | |
| tstart
 | |
|  s $zt=$$zt()
 | |
|  TSTART
 | |
|  s output="+OK"_crlf
 | |
|  w output
 | |
|  s $zt=""
 | |
|  QUIT
 | |
|  ;
 | |
| tcommit
 | |
|  s $zt=$$zt()
 | |
|  TCOMMIT
 | |
|  s output="+OK"_crlf
 | |
|  w output
 | |
|  s $zt=""
 | |
|  QUIT
 | |
|  ;
 | |
| trollback
 | |
|  s $zt=$$zt()
 | |
|  TROLLBACK
 | |
|  s output="+OK"_crlf
 | |
|  w output
 | |
|  s $zt=""
 | |
|  QUIT
 | |
|  ;
 | |
| zv
 | |
|  s output="+"_$zv_crlf
 | |
|  w output
 | |
|  QUIT
 | |
|  ;
 | |
| zt()
 | |
|  i $zv["GT.M" QUIT "g executeError^zmwire"
 | |
|  QUIT "executeError^zmwire"
 | |
|  ;
 | |
| processid
 | |
|  s output=":"_$j_crlf
 | |
|  w output
 | |
|  QUIT
 | |
|  ;
 | |
| ping
 | |
|  s output="+PONG"_crlf
 | |
|  w output
 | |
|  QUIT
 | |
|  ;
 | |
| executeError
 | |
|  s output="-Invalid Command"_crlf
 | |
|  w output
 | |
|  g loop
 | |
|  ;
 | |
| replaceAll(InText,FromStr,ToStr) ; Replace all occurrences of a substring
 | |
|  ;
 | |
|  n p
 | |
|  ;
 | |
|  s p=InText
 | |
|  i ToStr[FromStr d  QUIT p
 | |
|  . n i,stop,tempText,tempTo
 | |
|  . s stop=0
 | |
|  . f i=0:1:255 d  q:stop
 | |
|  . . q:InText[$c(i)
 | |
|  . . q:FromStr[$c(i)
 | |
|  . . q:ToStr[$c(i)
 | |
|  . . s stop=1
 | |
|  . s tempTo=$c(i)
 | |
|  . s tempText=$$replaceAll(InText,FromStr,tempTo)
 | |
|  . s p=$$replaceAll(tempText,tempTo,ToStr)
 | |
|  f  q:p'[FromStr  S p=$$replace(p,FromStr,ToStr)
 | |
|  QUIT p
 | |
|  ;
 | |
| replace(InText,FromStr,ToStr) ; replace old with new in string
 | |
|  ;
 | |
|  n np,p1,p2
 | |
|  ;
 | |
|  i InText'[FromStr q InText
 | |
|  s np=$l(InText,FromStr)+1
 | |
|  s p1=$p(InText,FromStr,1),p2=$p(InText,FromStr,2,np)
 | |
|  QUIT p1_ToStr_p2
 | |
|  ;
 | |
| readChars(length)
 | |
|  ;
 | |
|  n data,i,x
 | |
|  ;
 | |
|  s data=""
 | |
|  f i=1:1:length r *x s data=data_$c(x)
 | |
|  QUIT data
 | |
|  ;
 | |
| stripSpaces(string)
 | |
|  i $zv["Cache" QUIT $$stripSpaces^MDBMCache(string)
 | |
|  ;
 | |
|  s string=$$stripLeadingSpaces(string)
 | |
|  QUIT $$stripTrailingSpaces(string)
 | |
|  ;
 | |
| stripLeadingSpaces(string)
 | |
|  ;
 | |
|  n i
 | |
|  ;
 | |
|  f i=1:1:$l(string) QUIT:$e(string,i)'=" "
 | |
|  QUIT $e(string,i,$l(string))
 | |
|  ;
 | |
| stripTrailingSpaces(string)
 | |
|  ;
 | |
|  n i,spaces,new
 | |
|  ;
 | |
|  s spaces=$$makeString(" ",100)
 | |
|  s new=string_spaces
 | |
|  QUIT $p(new,spaces,1)
 | |
|  ;
 | |
| makeString(char,len) ; create a string of len characters
 | |
|  ;
 | |
|  n str
 | |
|  ;
 | |
|  s str="",$p(str,char,len+1)=""
 | |
|  QUIT str
 | |
|  ;
 | |
| MD5(string)
 | |
|  ;
 | |
|  ; n hash
 | |
|  ;
 | |
|  i $zv["Cache" QUIT $$MD5^MDBMCache(string)
 | |
|  ;
 | |
|  QUIT $$MD5^%ZMGWSIS(string,1,1)
 | |
|  ;
 | |
| unEscape(string)
 | |
|  ;
 | |
|  n buf,outstring,p1,p2,hex,asc
 | |
|  ;
 | |
|  s buf=string
 | |
|  s outstring=""
 | |
|  f  q:buf'["%"  d
 | |
|  . s p1=$p(buf,"%",1)
 | |
|  . s outstring=outstring_p1
 | |
|  . s p2=$p(buf,"%",2,50000)
 | |
|  . i $e(p2)="u" s buf=$e(p2,6,9999),hex=$e(p2,2,5),outstring=outstring_$c($$hex2Ascii(hex)-1264) q
 | |
|  . s hex=$e(p2,1,2)
 | |
|  . s buf=$e(p2,3,$l(p2))
 | |
|  . s asc=$$hex2Ascii(hex)
 | |
|  . s outstring=outstring_$c(asc)
 | |
|  QUIT (outstring_buf)
 | |
|  ;
 | |
| hex2Ascii(string)
 | |
|  ;
 | |
|  n asc,c,conv,err,i,n,power
 | |
|  ;
 | |
|  s string=$zconvert(string,"U")
 | |
|  s asc=0
 | |
|  f i=0:1:9 S conv(i)=i
 | |
|  s conv("A")=10
 | |
|  s conv("B")=11
 | |
|  s conv("C")=12
 | |
|  s conv("D")=13
 | |
|  s conv("E")=14
 | |
|  s conv("F")=15
 | |
|  s n=-1,err=0
 | |
|  f i=$l(string):-1:1 d  q:err
 | |
|  . s n=n+1
 | |
|  . s power=16**n
 | |
|  . s c=$e(string,i)
 | |
|  . i '$d(conv(c)) s err=1 q
 | |
|  . s asc=asc+(conv(c)*power)
 | |
|  i err QUIT "-1"
 | |
|  QUIT asc
 | |
|  ;
 | |
| ts()
 | |
|  s last=$g(^zmwire("lastts"))
 | |
|  n io,p,resp
 | |
|  s io=$io
 | |
|  s p="time"
 | |
|  o p:(COMMAND="date +%s%N":READONLY)::"PIPE"
 | |
|  u p
 | |
|  r resp q:$ZEOF
 | |
|  c p
 | |
|  u io
 | |
|  s ^zmwire("lastts")=resp
 | |
|  QUIT ((resp-last)/1000000000)
 | |
|  ;
 | |
| relinkRoutines()
 | |
|  n list,rou,xrou
 | |
|  i $g(^zewd("trace"))=1 d trace("Process "_$j_": Relinking...")
 | |
|  s rou=""
 | |
|  f  s rou=$view("RTNNEXT",rou) q:rou=""  d
 | |
|  . i rou="zmwire" q
 | |
|  . i rou="%zewdGTMRuntime" q
 | |
|  . i rou="%zewdPHP" q
 | |
|  . i rou="MDB" q
 | |
|  . i rou="ewdWLewdmgrrelink" q
 | |
|  . i rou="%ZMGWSI" q
 | |
|  . i rou="%ZMGWSIS" q
 | |
|  . i rou="GTM$DMOD" q
 | |
|  . s xrou=rou
 | |
|  . i $e(xrou,1)="%" s xrou="_"_$e(xrou,2,$l(xrou))
 | |
|  . zl xrou
 | |
|  . i $g(^zewd("trace"))=1 d trace("relinked "_rou)
 | |
|  s ^zmwire("relink","process",$j)=""
 | |
|  i $g(^zewd("trace"))=1 d trace("Process "_$j_": Relinking complete")
 | |
|  QUIT ""
 | |
|  ;
 | |
| relink ;
 | |
|  s ^zmwire("relink")=1
 | |
|  k ^zmwire("relink","process")
 | |
|  QUIT
 | |
|  ;
 | |
| arrayToJSON(name)
 | |
|  n a,buff,c,json,subscripts
 | |
|  i '$d(@name) QUIT "[]"
 | |
|  s json=$$walkArray("",name)
 | |
|  ; Encode UTF-8 characters
 | |
|  s buff=""
 | |
|  f i=1:1:$l(json) d
 | |
|  . s c=$e(json,i)
 | |
|  . s a=$a(c)
 | |
|  . i a>160 d
 | |
|  . . i a<192 d
 | |
|  . . . s buff=buff_$c(194)_c
 | |
|  . . e  d
 | |
|  . . . s buff=buff_$c(195)_$c(a-64)
 | |
|  . e  d
 | |
|  . . s buff=buff_c
 | |
|  QUIT buff
 | |
|  ;
 | |
| walkArray(json,name,subscripts)
 | |
|  ;
 | |
|  n allNumeric,arrComma,brace,comma,count,cr,dd,i,no,numsub,dblquot,quot
 | |
|  n ref,sub,subNo,subscripts1,type,valquot,value,xref,zobj
 | |
|  ;
 | |
|  s cr=$c(13,10),comma=","
 | |
|  s (quot,dblquot,valquot)=""""
 | |
|  s dd=$d(@name)
 | |
|  i dd=1!(dd=11) d  i dd=1 QUIT json
 | |
|  . s value=@name
 | |
|  . i value'[">" q
 | |
|  . s json=$$walkArray(json,value,.subscripts)
 | |
|  s ref=name_"("
 | |
|  s no=$o(subscripts(""),-1)
 | |
|  i no>0 f i=1:1:no d
 | |
|  . i subscripts(i)[quot s subscripts(i)=$$replaceAll(subscripts(i),quot,quot_quot)
 | |
|  . i subscripts(i)?."-"1N.N s quot=""
 | |
|  . s ref=ref_quot_subscripts(i)_quot_","
 | |
|  . s quot=dblquot
 | |
|  s ref=ref_"sub)"
 | |
|  s sub="",numsub=0,subNo=0,count=0
 | |
|  s allNumeric=1
 | |
|  f  s sub=$o(@ref) q:sub=""  d  q:'allNumeric
 | |
|  . i sub'?1N.N s allNumeric=0
 | |
|  . s count=count+1
 | |
|  . i sub'=count s allNumeric=0
 | |
|  ;i allNumeric,count=1 s allNumeric=0
 | |
|  s allNumeric=0
 | |
|  i allNumeric d
 | |
|  . s json=json_"["
 | |
|  e  d
 | |
|  . s json=json_"{"
 | |
|  s sub=""
 | |
|  f  s sub=$o(@ref) q:sub=""  d
 | |
|  . s subscripts(no+1)=sub
 | |
|  . s subNo=subNo+1
 | |
|  . s dd=$d(@ref)
 | |
|  . i dd=1 d
 | |
|  . . s value=@ref
 | |
|  . . ;i value["\" s value=$$replaceAll(value,"\","\\")
 | |
|  . . s value=$$removeControlChars(value)
 | |
|  . . i 'allNumeric d
 | |
|  . . . ;i sub["\",sub'["\\",sub'["\"""  s sub=$$replaceAll(sub,"\","\\")
 | |
|  . . . i sub["\" s sub=$$replaceAll(sub,"\","\\")
 | |
|  . . . s sub=$$removeControlChars(sub)
 | |
|  . . . s json=json_""""_sub_""":"
 | |
|  . . s type="literal"
 | |
|  . . i $$numeric(value) s type="numeric"
 | |
|  . . i value="true"!(value="false") s type="boolean"
 | |
|  . . i $e(value,1)="{",$e(value,$l(value))="}" s type="variable"
 | |
|  . . i type="literal" d
 | |
|  . . . ;i value[quot s value=$$replaceAll(value,quot,"\"_quot)
 | |
|  . . . ;i value["\",value'["\\",value'["\"""  s value=$$replaceAll(value,"\","\\")
 | |
|  . . . i value["\" s value=$$replaceAll(value,"\","\\")
 | |
|  . . . i value[quot s value=$$replaceAll(value,quot,"\""")
 | |
|  . . . s value=valquot_value_valquot
 | |
|  . . d
 | |
|  . . . s json=json_value_","
 | |
|  . k subscripts1
 | |
|  . m subscripts1=subscripts
 | |
|  . i dd>9 d
 | |
|  . . n subx
 | |
|  . . ;i sub?1N.N d
 | |
|  . . ;. i subNo=1 d
 | |
|  . . ;. . s numsub=1
 | |
|  . . ;. . s json=$e(json,1,$l(json)-1)_"["
 | |
|  . . ;e  d
 | |
|  . . ;. s json=json_""""_sub_""":"
 | |
|  . . ;i sub["\",sub'["\\",sub'["\""" s sub=$$replaceAll(sub,"\","\\")
 | |
|  . . s subx=sub
 | |
|  . . i subx["\" s subx=$$replaceAll(sub,"\","\\")
 | |
|  . . i subx[quot s subx=$$replaceAll(subx,quot,"\""")
 | |
|  . . s subx=$$removeControlChars(subx)
 | |
|  . . s json=json_""""_subx_""":"
 | |
|  . . s json=$$walkArray(json,name,.subscripts1)
 | |
|  . . d
 | |
|  . . . s json=json_","
 | |
|  ;
 | |
|  s json=$e(json,1,$l(json)-1)
 | |
|  i allNumeric d
 | |
|  . s json=json_"]"
 | |
|  e  d
 | |
|  . s json=json_"}"
 | |
|  QUIT json ; exit!
 | |
|  ;
 | |
| trace(text,clear) ; trace  ;
 | |
|  n i
 | |
|  s text=$g(text)
 | |
|  i $g(clear)=1 k ^%zewdTrace
 | |
|  s i=$increment(^%zewdTrace)
 | |
|  s ^%zewdTrace(i)=text
 | |
|  QUIT
 | |
|  ;
 | |
| parseJSON(jsonString,propertiesArray,mode)
 | |
|  ;
 | |
|  n array,arrRef,buff,c,error
 | |
|  ;
 | |
|  k propertiesArray
 | |
|  s error=""
 | |
|  s buff=$g(jsonString)
 | |
|  s buff=$$replaceAll(buff,"\""","\'")
 | |
|  s arrRef="array"
 | |
|  s c=$e(buff,1)
 | |
|  s buff=$e(buff,2,$l(buff))
 | |
|  d
 | |
|  . i c="{" d  q
 | |
|  . . n prefix
 | |
|  . . s prefix="""zobj1"""
 | |
|  . . i $g(mode)=1 s prefix=""
 | |
|  . . s error=$$parseJSONObject(.buff,prefix)
 | |
|  . . q:error
 | |
|  . . i buff'="" s error=1
 | |
|  . i c="[" d  q
 | |
|  . . n prefix
 | |
|  . . s prefix=1
 | |
|  . . i $g(mode)=1 s prefix=""
 | |
|  . . s error=$$parseJSONArray(.buff,prefix)
 | |
|  . . q:error
 | |
|  . . i buff'="" s error=1
 | |
|  . s error=1
 | |
|  i error=1 QUIT "Invalid JSON"
 | |
|  m propertiesArray=array
 | |
|  QUIT ""
 | |
|  ;
 | |
| parseJSONObject(buff,subs)
 | |
|  n c,error,name,stop,subs2,value,x
 | |
|  s stop=0,name="",error=""
 | |
|  f  d  q:stop
 | |
|  . s c=$e(buff,1)
 | |
|  . i c="" s error=1,stop=1 q
 | |
|  . s buff=$e(buff,2,$l(buff))
 | |
|  . i c="[" s error=1,stop=1 q
 | |
|  . i c="}" d  q
 | |
|  . . s stop=1
 | |
|  . i c=":" d  q
 | |
|  . . n subs2
 | |
|  . . s value=$$getJSONValue(.buff)
 | |
|  . . d  q:stop
 | |
|  . . . i value="" q
 | |
|  . . . i $e(value,1)="""",$e(value,$l(value))="""" q
 | |
|  . . . i value="true"!(value="false") s value=""""_value_"""" q
 | |
|  . . . i $$numeric(value) q
 | |
|  . . . s error=1,stop=1
 | |
|  . . i value="",$e(buff,1)="{" d  q
 | |
|  . . . i $e(name,1)'="""",$e(name,$l(name))'="""" s name=""""_name_""""
 | |
|  . . . s subs2=subs
 | |
|  . . . i subs'="" s subs2=subs2_","
 | |
|  . . . s subs2=subs2_name
 | |
|  . . . i $g(mode)="" s subs2=subs2_",""zobj1"""
 | |
|  . . . s buff=$e(buff,2,$l(buff))
 | |
|  . . . s error=$$parseJSONObject(.buff,subs2)
 | |
|  . . . i error=1 s stop=1 q
 | |
|  . . i value="",$e(buff,1)="[" d  q
 | |
|  . . . ;s subs2=subs_","""_name_""",""1"""
 | |
|  . . . i $e(name,1)'="""",$e(name,$l(name))'="""" s name=""""_name_""""
 | |
|  . . . s subs2=subs
 | |
|  . . . i subs'="" s subs2=subs2_","
 | |
|  . . . s subs2=subs2_name
 | |
|  . . . s buff=$e(buff,2,$l(buff))
 | |
|  . . . s error=$$parseJSONArray(.buff,subs2)
 | |
|  . . . i error=1 s stop=1 q
 | |
|  . . i $e(name,1)="""",$e(name,$l(name))'="""" s error=1,stop=1 q
 | |
|  . . i $e(name,1)'="""",$e(name,$l(name))="""" s error=1,stop=1 q
 | |
|  . . i $e(name,1)'="""",$e(name,$l(name))'="""" s name=""""_name_""""
 | |
|  . . s subs2=subs
 | |
|  . . i subs'="" s subs2=subs2_","
 | |
|  . . s subs2=subs2_name
 | |
|  . . i value["\'" s value=$$replaceAll(value,"\'","""""")
 | |
|  . . s x="s "_arrRef_"("_subs2_")="_value
 | |
|  . . x x
 | |
|  . i c="," s name="" q
 | |
|  . s name=name_c q
 | |
|  QUIT error
 | |
|  ;
 | |
| parseJSONArray(buff,subs)
 | |
|  n c,error,name,no,stop,subs2,value,x
 | |
|  s stop=0,name="",no=0,error=""
 | |
|  f  d  q:stop
 | |
|  . s c=$e(buff,1)
 | |
|  . i c="" s error=1,stop=1 q
 | |
|  . s buff=$e(buff,2,$l(buff))
 | |
|  . i c=":" s error=1,stop=1 q
 | |
|  . i c="]" d  q
 | |
|  . . s stop=1
 | |
|  . . i name="" q
 | |
|  . . s no=no+1
 | |
|  . . s subs2=subs
 | |
|  . . i subs'="" s subs2=subs2_","
 | |
|  . . s subs2=subs2_no
 | |
|  . . s x="s "_arrRef_"("_subs2_")="_name
 | |
|  . . x x
 | |
|  . i c="[" d  q
 | |
|  . . s no=no+1
 | |
|  . . s subs2=subs
 | |
|  . . i subs'="" s subs2=subs2_","
 | |
|  . . s subs2=subs2_no
 | |
|  . . ;s buff=$e(buff,2,$l(buff))
 | |
|  . . s error=$$parseJSONArray(.buff,subs2)
 | |
|  . . i error=1 s stop=1 q
 | |
|  . i c="{" d  q
 | |
|  . . s no=no+1
 | |
|  . . s subs2=subs
 | |
|  . . i subs'="" s subs2=subs2_","
 | |
|  . . s subs2=subs2_no
 | |
|  . . i $g(mode)="" s subs2=subs2_",""zobj1"""
 | |
|  . . ;s buff=$e(buff,2,$l(buff))
 | |
|  . . s error=$$parseJSONObject(.buff,subs2)
 | |
|  . . i error=1 s stop=1 q
 | |
|  . s subs2=subs
 | |
|  . i subs'="" s subs2=subs2_","
 | |
|  . s subs2=subs2_""""_name_""""
 | |
|  . i c="," d  q
 | |
|  . . i name="" q
 | |
|  . . d  q:stop
 | |
|  . . . i $e(name,1)="""",$e(name,$l(name))="""" q
 | |
|  . . . ;i value="true"!(value="false") s value=""""_value_"""" q
 | |
|  . . . i $$numeric(name) q
 | |
|  . . . s error=1,stop=1
 | |
|  . . s no=no+1
 | |
|  . . s subs2=subs
 | |
|  . . i subs'="" s subs2=subs2_","
 | |
|  . . s subs2=subs2_""""_no_""""
 | |
|  . . s x="s "_arrRef_"("_subs2_")="_name
 | |
|  . . x x
 | |
|  . . s name=""
 | |
|  . s name=name_c q
 | |
|  QUIT error
 | |
|  ;
 | |
| getJSONValue(buff)
 | |
|  n c,isLiteral,lc,stop,value
 | |
|  s stop=0,value="",isLiteral=0,lc=""
 | |
|  f  d  q:stop  q:buff=""
 | |
|  . s c=$e(buff,1)
 | |
|  . i value="",c="""" s isLiteral=1
 | |
|  . i 'isLiteral,c="[" s stop=1 q
 | |
|  . i 'isLiteral,c="{" s stop=1 q
 | |
|  . i c="}" d  q:stop
 | |
|  . . i isLiteral,lc'="""" q
 | |
|  . . s stop=1
 | |
|  . i c="," d  q:stop
 | |
|  . . i isLiteral,lc'="""" q
 | |
|  . . s stop=1
 | |
|  . s buff=$e(buff,2,$l(buff))
 | |
|  . s value=value_c
 | |
|  . s lc=c
 | |
|  QUIT value
 | |
|  ;
 | |
| numeric(value)
 | |
|  i $e(value,1)=0,$l(value)>1 QUIT 0
 | |
|  i $e(value,1,2)="-0",$l(value)>2,$e(value,1,3)'="-0." QUIT 0
 | |
|  i value?1N.N QUIT 1
 | |
|  i value?1"-"1N.N QUIT 1
 | |
|  i value?1N.N1"."1N.N QUIT 1
 | |
|  i value?1"-"1N.N1"."1N.N QUIT 1
 | |
|  i value?1"."1N.N QUIT 1
 | |
|  i value?1"-."1N.N QUIT 1
 | |
|  QUIT 0
 | |
|  ;
 | |
| removeControlChars(string)
 | |
|  n c,i,newString
 | |
|  s newString=""
 | |
|  f i=1:1:$l(string) d
 | |
|  . s c=$e(string,i)
 | |
|  . i $a(c)<32 s c="~"
 | |
|  . s newString=newString_c
 | |
|  QUIT newString
 | |
|  ;
 | |
| utfConvert(input)
 | |
|  ; Unescape UTF-8 characters
 | |
|  i input[$c(195) d
 | |
|  . n buf,c1,i,no,p
 | |
|  . s buf=$p(input,$c(195),1)
 | |
|  . s no=$l(input,$c(195))
 | |
|  . f i=2:1:no d
 | |
|  . . s p=$p(input,$c(195),i)
 | |
|  . . s c1=$e(p,1)
 | |
|  . . s c1=$c($a(c1)+64)
 | |
|  . . s buf=buf_c1_$e(p,2,$l(p))
 | |
|  . s input=buf
 | |
|  s input=$tr(input,$c(194),"")
 | |
|  QUIT input
 | |
|  ;
 | |
| 
 |