mirror of
				https://github.com/KevinMidboe/linguist.git
				synced 2025-10-29 17:50:22 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			2461 lines
		
	
	
		
			90 KiB
		
	
	
	
		
			Mathematica
		
	
	
	
	
	
			
		
		
	
	
			2461 lines
		
	
	
		
			90 KiB
		
	
	
	
		
			Mathematica
		
	
	
	
	
	
| MDB ; M/DB: Mumps Emulation of Amazon SimpleDB
 | |
|  ;
 | |
|  ; ----------------------------------------------------------------------------
 | |
|  ; | M/DB                                                                     |
 | |
|  ; | 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/>.    |
 | |
|  ; ----------------------------------------------------------------------------
 | |
|  ;
 | |
|  ;
 | |
| version()	
 | |
| 	QUIT "44"
 | |
| 	;
 | |
| buildDate()	
 | |
| 	QUIT "06 July 2011"
 | |
| 	;
 | |
| indexLength()
 | |
|  QUIT 180
 | |
|  ;
 | |
|  ; Note: keyId will have been tested and must be valid
 | |
|  ; by the time these methods are called
 | |
|  ;
 | |
|  ; To Initialise the service: http://192.168.1.xxx/mdb/test.mgwsi?Action=Initialise
 | |
|  ;
 | |
| addUser(userKeyId,userSecretKey,requestId,boxUsage)
 | |
|  ;
 | |
|  n startTime,stop
 | |
|  ;
 | |
|  s requestId=$$init(.startTime)
 | |
|  s ^MDBUAF("keys",userKeyId)=userSecretKey
 | |
|  QUIT $$end(startTime,.boxUsage)
 | |
|  ;
 | |
| createDomain(keyId,domainName,requestId,boxUsage)
 | |
|  ;
 | |
|  n dn,dnx,id,noOfDomains,startTime,token
 | |
|  ;
 | |
|  s requestId=$$init(.startTime)
 | |
|  s keyId=$g(keyId)
 | |
|  i keyId="" QUIT $$end(startTime,.boxUsage,"MissingParameter","AWSAccessKeyId")
 | |
|  s domainName=$g(domainName)
 | |
|  i domainName="" QUIT $$end(startTime,.boxUsage,"MissingParameter","DomainName")
 | |
|  s dn=$tr(domainName,"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890_-.","")
 | |
|  i dn'="" QUIT $$end(startTime,.boxUsage,"InvalidParameterValue",domainName,"DomainName")
 | |
|  ;
 | |
|  s noOfDomains=+$g(^MDB(keyId))
 | |
|  i $g(^MDBConfig("DomainsPerAccount"))'="",noOfDomains=^MDBConfig("DomainsPerAccount") QUIT $$end(startTime,.boxUsage,"NumberDomainsExceeded")
 | |
|  s dnx=$e(domainName,1,$$indexLength())
 | |
|  i '$$domainExists(keyId,domainName) d
 | |
|  . s noOfDomains=$increment(^MDB(keyId))
 | |
|  . s id=$increment(^MDB(keyId,"domains"))
 | |
|  . s ^MDB(keyId,"domains",id,"name")=domainName
 | |
|  . s ^MDB(keyId,"domains",id,"created")=$h
 | |
|  . d updateDomainMetaData(keyId,id)
 | |
|  . s ^MDB(keyId,"domainIndex",dnx,id)=""
 | |
|  ;
 | |
|  QUIT $$end(startTime,.boxUsage)
 | |
|  ;
 | |
| updateDomainMetaData(keyId,id)
 | |
|  ;
 | |
|  s ^MDB(keyId,"domains",id,"modified")=$h
 | |
|  QUIT
 | |
|  ;
 | |
| getDomainMetaData(keyId,domainId,metaData)
 | |
|  ;
 | |
|  n size,timestamp
 | |
|  ;
 | |
|  k metaData
 | |
|  s timestamp=$g(^MDB(keyId,"domains",domainId,"modified"))
 | |
|  s timestamp=$$convertToEpochTime(timestamp)
 | |
|  s metaData("Timestamp")=timestamp
 | |
|  s metaData("ItemCount")=$$countItems(keyId,domainId,.size)_".0"
 | |
|  s metaData("ItemNamesSizeBytes")=size_".0"
 | |
|  s metaData("AttributeValueCount")=$$countNVPs(keyId,domainId,.size)_".0"
 | |
|  s metaData("AttributeValuesSizeBytes")=size_".0"
 | |
|  s metaData("AttributeNameCount")=$$countAttributeNames(keyId,domainId,.size)_".0"
 | |
|  s metaData("AttributeNamesSizeBytes")=size_".0"
 | |
|  QUIT
 | |
|  ;
 | |
| domainMetadata(keyId,domainName,metaData,requestId,boxUsage)
 | |
|  ;
 | |
|  n domainId,startTime
 | |
|  ;
 | |
|  s requestId=$$init(.startTime)
 | |
|  s keyId=$g(keyId)
 | |
|  i keyId="" QUIT $$end(startTime,.boxUsage,"MissingParameter","AWSAccessKeyId")
 | |
|  s domainName=$g(domainName)
 | |
|  i domainName="" QUIT $$end(startTime,.boxUsage,"MissingParameter","DomainName")
 | |
|  s domainId=$$getDomainId(keyId,domainName)
 | |
|  i domainId="" QUIT $$end(startTime,.boxUsage,"NoSuchDomain","The specified domain does not exist.")
 | |
|  ;
 | |
|  d getDomainMetaData(keyId,domainId,.metaData)
 | |
|  ;
 | |
|  QUIT $$end(startTime,.boxUsage)
 | |
|  ;
 | |
| convertToEpochTime(dh)
 | |
|  ;
 | |
|  n time
 | |
|  ;
 | |
|  s time=(dh*86400)+$p(dh,",",2)
 | |
|  s time=time-4070908800
 | |
|  QUIT time
 | |
|  ;
 | |
| convertFromEpochTime(time)
 | |
|  ;
 | |
|  n dh
 | |
|  ;
 | |
|  s time=time+4070908800
 | |
|  s dh=time\86400
 | |
|  s time=time#86400
 | |
|  QUIT dh_","_time
 | |
|  ;
 | |
| countItems(keyId,domainId,size)
 | |
|  ;
 | |
|  n count,id
 | |
|  ;
 | |
|  s id="",count=0,size=0
 | |
|  f  s id=$o(^MDB(keyId,"domains",domainId,"items",id)) q:id=""  d
 | |
|  . s count=count+1
 | |
|  . s size=size+$l(^MDB(keyId,"domains",domainId,"items",id))
 | |
|  QUIT count
 | |
|  ;
 | |
| countNVPs(keyId,domainId,size)
 | |
|  ;
 | |
|  n attribId,count,itemId,valueId
 | |
|  ;
 | |
|  s itemId="",count=0,size=0
 | |
|  f  s itemId=$o(^MDB(keyId,"domains",domainId,"items",itemId)) q:itemId=""  d
 | |
|  . s attribId=0
 | |
|  . f  s attribId=$o(^MDB(keyId,"domains",domainId,"items",itemId,"attribs",attribId)) q:attribId=""  d
 | |
|  . . s valueId=""
 | |
|  . . f  s valueId=$o(^MDB(keyId,"domains",domainId,"items",itemId,"attribs",attribId,"value",valueId)) q:valueId=""  d
 | |
|  . . . s count=count+1
 | |
|  . . . s size=size+$l(^MDB(keyId,"domains",domainId,"items",itemId,"attribs",attribId,"value",valueId))
 | |
|  QUIT count
 | |
|  ;
 | |
| countAttributeNames(keyId,domainId,size)
 | |
|  ;
 | |
|  n attribId,count,name
 | |
|  ;
 | |
|  s attribId=0,count=0,size=0
 | |
|  f  s attribId=$o(^MDB(keyId,"domains",domainId,"attribs",attribId)) q:attribId=""  d
 | |
|  . s count=count+1
 | |
|  . s name=^MDB(keyId,"domains",domainId,"attribs",attribId)
 | |
|  . s size=size+$l(name)
 | |
|  QUIT count
 | |
|  ;
 | |
|  
 | |
| domainExists(keyId,name)
 | |
|  ;
 | |
|  n id
 | |
|  ;
 | |
|  s id=$$getDomainId($g(keyId),$g(name))
 | |
|  QUIT (id'="")
 | |
|  ;
 | |
| getDomainId(keyId,name)
 | |
|  ;
 | |
|  n found,id,namex
 | |
|  ;
 | |
|  i $g(name)="" QUIT ""
 | |
|  i $g(keyId)="" QUIT ""
 | |
|  s namex=$e(name,1,$$indexLength())
 | |
|  s id="",found=0
 | |
|  f  s id=$o(^MDB(keyId,"domainIndex",namex,id)) q:id=""  d  q:found
 | |
|  . i $g(^MDB(keyId,"domains",id,"name"))=name s found=1
 | |
|  i id'="",'$d(^MDB(keyId,"domains",id,"attribs",0)) d buildItemNameIndex(keyId,id)
 | |
|  QUIT id
 | |
|  ;
 | |
| buildItemNameIndex(keyId,domainId)
 | |
|  ;
 | |
|  n itemId,itemValue,itemValuex
 | |
|  ;
 | |
|  s ^MDB(keyId,"domains",domainId,"attribs",0)="itemName()"
 | |
|  s ^MDB(keyId,"domains",domainId,"attribsIndex","itemName()",0)=""
 | |
|  s itemId=""
 | |
|  f  s itemId=$o(^MDB(keyId,"domains",domainId,"items",itemId)) q:itemId=""  d
 | |
|  . s itemValue=^MDB(keyId,"domains",domainId,"items",itemId)
 | |
|  . s itemValuex=$e(itemValue,1,$$indexLength())
 | |
|  . s ^MDB(keyId,"domains",domainId,"items",itemId,"attribs",0,"value")=1
 | |
|  . s ^MDB(keyId,"domains",domainId,"items",itemId,"attribs",0,"value",1)=itemValue
 | |
|  . s ^MDB(keyId,"domains",domainId,"queryIndex",0,itemValuex,itemId)=""
 | |
|  QUIT 
 | |
|  ;
 | |
| countDomains(key)
 | |
|  ;
 | |
|  n id,no
 | |
|  ;
 | |
|  s id="",no=0
 | |
|  f  s id=$o(^MDB(key,"domains",id)) q:id=""  s no=no+1
 | |
|  QUIT no
 | |
|  ;
 | |
| deleteDomain(keyId,domainName,requestId,boxUsage)
 | |
|  ;
 | |
|  n dn,dnx,id,noOfDomains,startTime,token
 | |
|  ;
 | |
|  s requestId=$$init(.startTime)
 | |
|  s keyId=$g(keyId)
 | |
|  i keyId="" QUIT $$end(startTime,.boxUsage,"MissingParameter","AWSAccessKeyId")
 | |
|  s domainName=$g(domainName)
 | |
|  i domainName="" QUIT $$end(startTime,.boxUsage,"MissingParameter","DomainName")
 | |
|  s id=$$getDomainId(keyId,domainName)
 | |
|  i id="" QUIT $$end(startTime,.boxUsage)
 | |
|  k ^MDB(keyId,"domains",id)
 | |
|  k ^MDB(keyId,"domainIndex",$e(domainName,1,$$indexLength()),id)
 | |
|  s noOfDomains=$$countDomains(keyId)
 | |
|  i noOfDomains>0 d
 | |
|  . s ^MDB(keyId)=noOfDomains
 | |
|  e  d
 | |
|  . k ^MDB(keyId)
 | |
|  ;
 | |
|  QUIT $$end(startTime,.boxUsage)
 | |
|  ;
 | |
| listDomains(keyId,maxNoOfDomains,nextToken,domainList,requestId,boxUsage)
 | |
|  ;
 | |
|  n domainName,fullName,id,noOfDomains,startTime,stop,token
 | |
|  ;
 | |
|  s requestId=$$init(.startTime)
 | |
|  s keyId=$g(keyId)
 | |
|  i keyId="" QUIT $$end(startTime,.boxUsage,"MissingParameter","AWSAccessKeyId")
 | |
|  k domainList s noOfDomains=0,stop=0
 | |
|  i $g(nextToken)="" d
 | |
|  . s domainName=""
 | |
|  e  d
 | |
|  . s domainName=$$decodeBase64(nextToken)
 | |
|  s nextToken=""
 | |
|  f  s domainName=$o(^MDB(keyId,"domainIndex",domainName)) q:domainName=""  d  q:stop
 | |
|  . s id=""
 | |
|  . f  s id=$o(^MDB(keyId,"domainIndex",domainName,id)) q:id=""  d
 | |
|  . . s fullName=$g(^MDB(keyId,"domains",id,"name"))
 | |
|  . . s noOfDomains=noOfDomains+1
 | |
|  . . s domainList(noOfDomains)=fullName
 | |
|  . i noOfDomains=maxNoOfDomains d  q
 | |
|  . . s stop=1
 | |
|  . . s nextToken=$$encodeBase64(domainName)
 | |
|  ;
 | |
|  QUIT $$end(startTime,.boxUsage)
 | |
|  ;
 | |
| itemExists(keyId,domainId,name)
 | |
|  ;
 | |
|  n id
 | |
|  ;
 | |
|  s id=$$getItemId($g(keyId),$g(domainId),$g(name))
 | |
|  QUIT (id'="")
 | |
|  ;
 | |
| getItemId(keyId,domainId,name)
 | |
|  ;
 | |
|  n found,id,namex
 | |
|  ;
 | |
|  i $g(domainId)="" QUIT ""
 | |
|  i $g(name)="" QUIT ""
 | |
|  i $g(keyId)="" QUIT ""
 | |
|  i domainId="" QUIT ""
 | |
|  s namex=$e(name,1,$$indexLength())
 | |
|  s id="",found=0
 | |
|  f  s id=$o(^MDB(keyId,"domains",domainId,"itemIndex",namex,id)) q:id=""  d  q:found
 | |
|  . i $g(^MDB(keyId,"domains",domainId,"items",id))=name s found=1
 | |
|  QUIT id
 | |
|  ;
 | |
| getAttributeId(keyId,domainId,name)
 | |
|  ;
 | |
|  n found,id,namex
 | |
|  ;
 | |
|  i $g(domainId)="" QUIT ""
 | |
|  i $g(name)="" QUIT ""
 | |
|  i $g(keyId)="" QUIT ""
 | |
|  i domainId="" QUIT ""
 | |
|  s namex=$e(name,1,$$indexLength())
 | |
|  s id="",found=0
 | |
|  f  s id=$o(^MDB(keyId,"domains",domainId,"attribsIndex",namex,id)) q:id=""  d  q:found
 | |
|  . i $g(^MDB(keyId,"domains",domainId,"attribs",id))'=name q
 | |
|  . s found=1
 | |
|  QUIT id
 | |
|  ;
 | |
| getAttributeValueId(keyId,domainId,itemId,attribId,value)
 | |
|  ;
 | |
|  n found,id,valuex
 | |
|  ;
 | |
|  i $g(domainId)="" QUIT ""
 | |
|  i '$d(value) QUIT ""
 | |
|  i $g(keyId)="" QUIT ""
 | |
|  i domainId="" QUIT ""
 | |
|  i value="" s value=$c(31)
 | |
|  s itemId=$g(itemId)
 | |
|  i itemId="" QUIT ""
 | |
|  s valuex=$e(value,1,$$indexLength())
 | |
|  s id="",found=0
 | |
|  f  s id=$o(^MDB(keyId,"domains",domainId,"items",itemId,"attribs",attribId,"valueIndex",valuex,id)) q:id=""  d  q:found
 | |
|  . i $g(^MDB(keyId,"domains",domainId,"items",itemId,"attribs",attribId,"value",id))'=value q
 | |
|  . s found=1
 | |
|  QUIT id
 | |
|  
 | |
| putAttributes(keyId,domainName,itemName,attributes,requestId,boxUsage)
 | |
|  ;
 | |
|  n attribId,domainId,itemId,name,namex,no,replace,startTime,value,valueId,valuex,xvalue
 | |
|  ;
 | |
|  s requestId=$$init(.startTime)
 | |
|  s keyId=$g(keyId)
 | |
|  i keyId="" QUIT $$end(startTime,.boxUsage,"MissingParameter","AWSAccessKeyId")
 | |
|  s domainName=$g(domainName)
 | |
|  i domainName="" QUIT $$end(startTime,.boxUsage,"MissingParameter","DomainName")
 | |
|  s domainId=$$getDomainId(keyId,domainName)
 | |
|  i domainId="" QUIT $$end(startTime,.boxUsage,"NoSuchDomain","The specified domain does not exist.")
 | |
|  s itemName=$g(itemName)
 | |
|  i itemName="" QUIT $$end(startTime,.boxUsage,"MissingParameter","ItemName")
 | |
|  s itemId=$$getItemId(keyId,domainId,itemName)
 | |
|  i itemId="" d
 | |
|  . ; add Item to Domain if it's new
 | |
|  . n itemNamex
 | |
|  . s itemNamex=$e(itemName,1,$$indexLength())
 | |
|  . s itemId=$increment(^MDB(keyId,"domains",domainId,"items"))
 | |
|  . s ^MDB(keyId,"domains",domainId,"itemIndex",itemNamex,itemId)=""
 | |
|  . s ^MDB(keyId,"domains",domainId,"items",itemId)=itemName
 | |
|  . s ^MDB(keyId,"domains",domainId,"attribs",0)="itemName()"
 | |
|  . s ^MDB(keyId,"domains",domainId,"attribsIndex","itemName()",0)=""
 | |
|  . s ^MDB(keyId,"domains",domainId,"items",itemId,"attribs",0,"value")=1
 | |
|  . s ^MDB(keyId,"domains",domainId,"items",itemId,"attribs",0,"value",1)=itemName
 | |
|  . s ^MDB(keyId,"domains",domainId,"queryIndex",0,itemNamex,itemId)=""
 | |
|  ;
 | |
|  ; attributes(no,"name")=attribute name
 | |
|  ; attributes(no,"value")=attribute value
 | |
|  ; attributes(no,"replace")=1
 | |
|  ;
 | |
|  s no=""
 | |
|  f  s no=$o(attributes(no)) q:no=""  d
 | |
|  . s name=$g(attributes(no,"name"))
 | |
|  . s value=$g(attributes(no,"value"))
 | |
|  . i value="" s value=$c(31)
 | |
|  . s replace=+$g(attributes(no,"replace"))
 | |
|  . s namex=$e(name,1,$$indexLength())
 | |
|  . s valuex=$e(value,1,$$indexLength())
 | |
|  . s attribId=$$getAttributeId(keyId,domainId,name)
 | |
|  . i attribId="" d
 | |
|  . . ; add new attribute name to the domain
 | |
|  . . s attribId=$increment(^MDB(keyId,"domains",domainId,"attribs"))
 | |
|  . . s ^MDB(keyId,"domains",domainId,"attribs",attribId)=name
 | |
|  . . s ^MDB(keyId,"domains",domainId,"attribsIndex",namex,attribId)=""
 | |
|  . s valueId=$$getAttributeValueId(keyId,domainId,itemId,attribId,value)
 | |
|  . i 'replace,valueId'="" q  ; Not allowed to have more than one attribute with the same name and value
 | |
|  . i replace d
 | |
|  . . ; first remove any existing values for this attribute name
 | |
|  . . f  s valueId=$o(^MDB(keyId,"domains",domainId,"items",itemId,"attribs",attribId,"value",valueId)) q:valueId=""  d
 | |
|  . . . s xvalue=^MDB(keyId,"domains",domainId,"items",itemId,"attribs",attribId,"value",valueId)
 | |
|  . . . k ^MDB(keyId,"domains",domainId,"items",itemId,"attribs",attribId,"valueIndex",xvalue,valueId)
 | |
|  . . . k ^MDB(keyId,"domains",domainId,"queryIndex",attribId,xvalue,itemId)
 | |
|  . . k ^MDB(keyId,"domains",domainId,"items",itemId,"attribs",attribId,"value")
 | |
|  . ; now add the new attribute name/value pair
 | |
|  . s valueId=$increment(^MDB(keyId,"domains",domainId,"items",itemId,"attribs",attribId,"value"))
 | |
|  . s ^MDB(keyId,"domains",domainId,"items",itemId,"attribs",attribId,"value",valueId)=value
 | |
|  . s ^MDB(keyId,"domains",domainId,"items",itemId,"attribs",attribId,"valueIndex",valuex,valueId)=""
 | |
|  . s ^MDB(keyId,"domains",domainId,"queryIndex",attribId,valuex,itemId)=""
 | |
|  ;
 | |
|  d updateDomainMetaData(keyId,domainId)
 | |
|  QUIT $$end(startTime,.boxUsage)
 | |
|  ;
 | |
| batchPutItem(keyId,domainId,itemName,attributesJSON)
 | |
|  ;
 | |
|  n attribId,attributes,error,itemId,name,namex,no,replace,value,valueId,valuex,xvalue
 | |
|  ;
 | |
|  ;d trace^zmwire("batchPutItem: keyid="_keyId_"; domainId="_domainId_"; itemName="_itemName_"; attributes="_attributesJSON)
 | |
|  s itemName=$g(itemName)
 | |
|  i itemName="" QUIT 0
 | |
|  s itemId=$$getItemId(keyId,domainId,itemName)
 | |
|  i itemId="" d
 | |
|  . ; add Item to Domain if it's new
 | |
|  . n itemNamex
 | |
|  . s itemNamex=$e(itemName,1,$$indexLength())
 | |
|  . s itemId=$increment(^MDB(keyId,"domains",domainId,"items"))
 | |
|  . s ^MDB(keyId,"domains",domainId,"itemIndex",itemNamex,itemId)=""
 | |
|  . s ^MDB(keyId,"domains",domainId,"items",itemId)=itemName
 | |
|  . s ^MDB(keyId,"domains",domainId,"attribs",0)="itemName()"
 | |
|  . s ^MDB(keyId,"domains",domainId,"attribsIndex","itemName()",0)=""
 | |
|  . s ^MDB(keyId,"domains",domainId,"items",itemId,"attribs",0,"value")=1
 | |
|  . s ^MDB(keyId,"domains",domainId,"items",itemId,"attribs",0,"value",1)=itemName
 | |
|  . s ^MDB(keyId,"domains",domainId,"queryIndex",0,itemNamex,itemId)=""
 | |
|  ;
 | |
|  s error=$$parseJSON^zmwire(attributesJSON,.attributes,1)
 | |
|  ;
 | |
|  ; attributes(no,"name")=attribute name
 | |
|  ; attributes(no,"value")=attribute value
 | |
|  ; attributes(no,"replace")=1
 | |
|  ;
 | |
|  s no=""
 | |
|  f  s no=$o(attributes(no)) q:no=""  d
 | |
|  . s name=$g(attributes(no,"name"))
 | |
|  . s value=$g(attributes(no,"value"))
 | |
|  . i value="" s value=$c(31)
 | |
|  . s replace=+$g(attributes(no,"replace"))
 | |
|  . s namex=$e(name,1,$$indexLength())
 | |
|  . s valuex=$e(value,1,$$indexLength())
 | |
|  . s attribId=$$getAttributeId(keyId,domainId,name)
 | |
|  . i attribId="" d
 | |
|  . . ; add new attribute name to the domain
 | |
|  . . s attribId=$increment(^MDB(keyId,"domains",domainId,"attribs"))
 | |
|  . . s ^MDB(keyId,"domains",domainId,"attribs",attribId)=name
 | |
|  . . s ^MDB(keyId,"domains",domainId,"attribsIndex",namex,attribId)=""
 | |
|  . s valueId=$$getAttributeValueId(keyId,domainId,itemId,attribId,value)
 | |
|  . i 'replace,valueId'="" q  ; Not allowed to have more than one attribute with the same name and value
 | |
|  . i replace d
 | |
|  . . ; first remove any existing values for this attribute name
 | |
|  . . f  s valueId=$o(^MDB(keyId,"domains",domainId,"items",itemId,"attribs",attribId,"value",valueId)) q:valueId=""  d
 | |
|  . . . s xvalue=^MDB(keyId,"domains",domainId,"items",itemId,"attribs",attribId,"value",valueId)
 | |
|  . . . k ^MDB(keyId,"domains",domainId,"items",itemId,"attribs",attribId,"valueIndex",xvalue,valueId)
 | |
|  . . . k ^MDB(keyId,"domains",domainId,"queryIndex",attribId,xvalue,itemId)
 | |
|  . . k ^MDB(keyId,"domains",domainId,"items",itemId,"attribs",attribId,"value")
 | |
|  . ; now add the new attribute name/value pair
 | |
|  . s valueId=$increment(^MDB(keyId,"domains",domainId,"items",itemId,"attribs",attribId,"value"))
 | |
|  . s ^MDB(keyId,"domains",domainId,"items",itemId,"attribs",attribId,"value",valueId)=value
 | |
|  . s ^MDB(keyId,"domains",domainId,"items",itemId,"attribs",attribId,"valueIndex",valuex,valueId)=""
 | |
|  . s ^MDB(keyId,"domains",domainId,"queryIndex",attribId,valuex,itemId)=""
 | |
|  QUIT 1
 | |
|  ;
 | |
| getAttributes(keyId,domainName,itemName,attributes,requestId,boxUsage,suppressBoxUsage)
 | |
|  ;
 | |
|  n attribId,attrNo,domainId,itemId,name,startTime,value,valueId,valueNo
 | |
|  ;
 | |
|  s requestId=""
 | |
|  i '$g(suppressBoxUsage) s requestId=$$init(.startTime)
 | |
|  s keyId=$g(keyId)
 | |
|  i keyId="" QUIT $$end(startTime,.boxUsage,"MissingParameter","AWSAccessKeyId")
 | |
|  s domainName=$g(domainName)
 | |
|  i domainName="" QUIT $$end(startTime,.boxUsage,"MissingParameter","DomainName")
 | |
|  s domainId=$$getDomainId(keyId,domainName)
 | |
|  i domainId="" QUIT $$end(startTime,.boxUsage,"NoSuchDomain","The specified domain does not exist.")
 | |
|  s itemName=$g(itemName)
 | |
|  i itemName="" QUIT $$end(startTime,.boxUsage,"MissingParameter","ItemName")
 | |
|  s itemId=$$getItemId(keyId,domainId,itemName)
 | |
|  i itemId="" QUIT $$end(startTime,.boxUsage,"NoSuchItemName","The specified ItemName does not exist.")
 | |
|  ;
 | |
|  ; attributes(no)=attribute name
 | |
|  ; attributes(no,"value",vno)=attribute value
 | |
|  ;
 | |
|  i '$d(attributes) d
 | |
|  . s name="",attrNo=0
 | |
|  . f  s name=$o(^MDB(keyId,"domains",domainId,"attribsIndex",name)) q:name=""  d 
 | |
|  . . s attribId=0
 | |
|  . . f  s attribId=$o(^MDB(keyId,"domains",domainId,"attribsIndex",name,attribId)) q:attribId=""  d
 | |
|  . . . i '$d(^MDB(keyId,"domains",domainId,"items",itemId,"attribs",attribId)) q
 | |
|  . . . s attrNo=attrNo+1
 | |
|  . . . s attributes(attrNo)=^MDB(keyId,"domains",domainId,"attribs",attribId)
 | |
|  . . . s valueId="",valueNo=0
 | |
|  . . . f  s valueId=$o(^MDB(keyId,"domains",domainId,"items",itemId,"attribs",attribId,"value",valueId)) q:valueId=""  d
 | |
|  . . . . s value=^MDB(keyId,"domains",domainId,"items",itemId,"attribs",attribId,"value",valueId)
 | |
|  . . . . s valueNo=valueNo+1
 | |
|  . . . . i value=$c(31) s value=""
 | |
|  . . . . s attributes(attrNo,"value",valueNo)=value
 | |
|  e  d
 | |
|  . s attrNo=""
 | |
|  . f  s attrNo=$o(attributes(attrNo)) q:attrNo=""  d
 | |
|  . . s name=attributes(attrNo)
 | |
|  . . s attribId=$$getAttributeId(keyId,domainId,name)
 | |
|  . . i attribId="" q
 | |
|  . . s valueId="",valueNo=0
 | |
|  . . f  s valueId=$o(^MDB(keyId,"domains",domainId,"items",itemId,"attribs",attribId,"value",valueId)) q:valueId=""  d
 | |
|  . . . s value=^MDB(keyId,"domains",domainId,"items",itemId,"attribs",attribId,"value",valueId)
 | |
|  . . . s valueNo=valueNo+1
 | |
|  . . . i value=$c(31) s value=""
 | |
|  . . . s attributes(attrNo,"value",valueNo)=value
 | |
|  . . . ;i $g(^zewd("trace")) d trace($h_": attributes("_attrNo_",value,"_valueNo_")="_value)
 | |
|  ;
 | |
|  i $g(suppressBoxUsage) QUIT ""
 | |
|  QUIT $$end(startTime,.boxUsage)
 | |
|  ;
 | |
| deleteAttributes(keyId,domainName,itemName,attributes,requestId,boxUsage)
 | |
|  ;
 | |
|  n attribId,attrNo,domainId,itemId,name,namex,startTime,value,valueId,valueNo,valuex
 | |
|  ;
 | |
|  s requestId=$$init(.startTime)
 | |
|  s keyId=$g(keyId)
 | |
|  i keyId="" QUIT $$end(startTime,.boxUsage,"MissingParameter","AWSAccessKeyId")
 | |
|  s domainName=$g(domainName)
 | |
|  i domainName="" QUIT $$end(startTime,.boxUsage,"MissingParameter","DomainName")
 | |
|  s domainId=$$getDomainId(keyId,domainName)
 | |
|  i domainId="" QUIT $$end(startTime,.boxUsage,"NoSuchDomain","The specified domain does not exist.")
 | |
|  s itemName=$g(itemName)
 | |
|  i itemName="" QUIT $$end(startTime,.boxUsage,"MissingParameter","ItemName")
 | |
|  s itemId=$$getItemId(keyId,domainId,itemName)
 | |
|  i itemId="" QUIT $$end(startTime,.boxUsage,"NoSuchItemName","The specified ItemName does not exist.")
 | |
|  i '$d(attributes) d
 | |
|  . ; delete all attributes for this item, first the associated queryIndex records
 | |
|  . s attribId=""
 | |
|  . f  s attribId=$o(^MDB(keyId,"domains",domainId,"items",itemId,"attribs",attribId)) q:attribId=""  d
 | |
|  . . s valuex=""
 | |
|  . . f  s valuex=$o(^MDB(keyId,"domains",domainId,"items",itemId,"attribs",attribId,"valueIndex",valuex)) q:valuex=""  d
 | |
|  . . . k ^MDB(keyId,"domains",domainId,"queryIndex",attribId,valuex,itemId)
 | |
|  . k ^MDB(keyId,"domains",domainId,"items",itemId)
 | |
|  . s namex=$e(itemName,1,$$indexLength())
 | |
|  . k ^MDB(keyId,"domains",domainId,"itemIndex",namex,itemId)
 | |
|  e  d
 | |
|  . ;delete the specified attribute name/value pairs
 | |
|  . ; attributes(no)=name
 | |
|  . ; attributes(no,"value",vno)=value
 | |
|  . s attrNo=""
 | |
|  . f  s attrNo=$o(attributes(attrNo)) q:attrNo=""  d
 | |
|  . . s name=$g(attributes(attrNo))
 | |
|  . . i name="" q
 | |
|  . . s attribId=$$getAttributeId(keyId,domainId,name)
 | |
|  . . i attribId="" q
 | |
|  . . s valueNo=""
 | |
|  . . f  s valueNo=$o(attributes(attrNo,"value",valueNo)) q:valueNo=""  d
 | |
|  . . . s value=attributes(attrNo,"value",valueNo)
 | |
|  . . . s valueId=$$getAttributeValueId(keyId,domainId,itemId,attribId,value)
 | |
|  . . . i valueId="" q
 | |
|  . . . ; remove specified value
 | |
|  . . . s valuex=$e(value,1,$$indexLength())
 | |
|  . . . k ^MDB(keyId,"domains",domainId,"items",itemId,"attribs",attribId,"valueIndex",valuex,valueId)
 | |
|  . . . k ^MDB(keyId,"domains",domainId,"items",itemId,"attribs",attribId,"value",valueId)
 | |
|  . . . k ^MDB(keyId,"domains",domainId,"queryIndex",attribId,valuex,itemId)
 | |
|  . . ; if no values are left, completely remove attribute from item
 | |
|  . . i $o(^MDB(keyId,"domains",domainId,"items",itemId,"attribs",attribId,"value",""))="" d
 | |
|  . . . k ^MDB(keyId,"domains",domainId,"items",itemId,"attribs",attribId,"value")
 | |
|  . . ; if no references left to this attribute name, remove the attribute name
 | |
|  . . i '$d(^MDB(keyId,"domains",domainId,"queryIndex",attribId)) d
 | |
|  . . . s namex=$e(name,1,$$indexLength())
 | |
|  . . . k ^MDB(keyId,"domains",domainId,"attribs",attribId)
 | |
|  . . . k ^MDB(keyId,"domains",domainId,"attribsIndex",namex,attribId)
 | |
|  . ; if no attributes are left, remove the item
 | |
|  . i $o(^MDB(keyId,"domains",domainId,"items",itemId,"attribs",""))="" d
 | |
|  . . k ^MDB(keyId,"domains",domainId,"items",itemId)
 | |
|  . . s namex=$e(itemName,1,$$indexLength())
 | |
|  . . k ^MDB(keyId,"domains",domainId,"itemIndex",namex,itemId)
 | |
|  . . k ^MDB(keyId,"domains",domainId,"attribs")
 | |
|  . . k ^MDB(keyId,"domains",domainId,"attribsIndex")
 | |
|  ;
 | |
|  QUIT $$end(startTime,.boxUsage)
 | |
|  ;
 | |
| query(keyId,domainName,queryExpression,maxNoOfItems,nextToken,itemList,requestId,boxUsage)
 | |
|  ;
 | |
|  n context,name,error,startTime,stop,token,value,xvalue
 | |
|  ;
 | |
|  i $zv["GT.M" d
 | |
|  . s context=1
 | |
|  . i $d(^zewd("config","MGWSI")) s context=0
 | |
|  s requestId=$$init(.startTime)
 | |
|  s keyId=$g(keyId)
 | |
|  i keyId="" QUIT $$end(startTime,.boxUsage,"MissingParameter","keyId")
 | |
|  s domainName=$g(domainName)
 | |
|  i domainName="" QUIT $$end(startTime,.boxUsage,"MissingParameter","DomainName")
 | |
|  s queryExpression=$g(queryExpression)
 | |
|  i $g(^zewd("trace"))=1 d trace("Query Expression="_queryExpression)
 | |
|  s maxNoOfItems=$g(maxNoOfItems)
 | |
|  k itemList
 | |
|  ;
 | |
|  s error=""
 | |
|  i $g(nextToken)'="" d  QUIT error
 | |
|  . n n,pos
 | |
|  . s pos=$g(^MDB(keyId,"queryResults","nextToken",nextToken))
 | |
|  . i pos="" s error="InvalidNextToken~The specified next token is not valid" q
 | |
|  . s n=0,nextToken=""
 | |
|  . f  s pos=$o(^MDB(keyId,"queryResults","itemList",pos)) q:pos=""  d  q:n=maxNoOfItems
 | |
|  . . s n=n+1
 | |
|  . . s itemList(n)=^MDB(keyId,"queryResults","itemList",pos)
 | |
|  . i pos'="" d
 | |
|  . . s nextToken=itemList(n)
 | |
|  . . i $zv["GT.M" d
 | |
|  . . . s nextToken=$$B64^%ZMGWSIS(nextToken)
 | |
|  . . e  d
 | |
|  . . . s nextToken=$$b64Encode^MDBMCache(nextToken)
 | |
|  . . s ^MDB(keyId,"queryResults","nextToken",nextToken)=pos
 | |
|  . e  d
 | |
|  . . k ^MDB(keyId,"queryResults")
 | |
|  . s error=$$end(startTime,.boxUsage)
 | |
|  ;
 | |
|  s nextToken=""
 | |
|  s error=$$runQuery(keyId,domainName,queryExpression,nextToken,.itemList)
 | |
|  i error'="" QUIT error
 | |
|  i $g(maxNoOfItems)>0 d
 | |
|  . ; add session identifier to stored records
 | |
|  . k ^MDB(keyId,"queryResults")
 | |
|  . m ^MDB(keyId,"queryResults","itemList")=itemList
 | |
|  . ;i queryExpression["sort " s ^MDB(keyId,"queryResults","sorted")=1
 | |
|  . k itemList
 | |
|  . s n=0,pos=""
 | |
|  . f  s pos=$o(^MDB(keyId,"queryResults","itemList",pos)) q:pos=""  d  q:n=maxNoOfItems
 | |
|  . . s n=n+1
 | |
|  . . s itemList(n)=^MDB(keyId,"queryResults","itemList",pos)
 | |
|  . i pos'="" d
 | |
|  . . s nextToken=itemList(n)
 | |
|  . . i $zv["GT.M" d
 | |
|  . . . s nextToken=$$B64^%ZMGWSIS(nextToken,context)
 | |
|  . . e  d
 | |
|  . . . s nextToken=$$b64Encode^MDBMCache(nextToken)
 | |
|  . . s ^MDB(keyId,"queryResults","nextToken",nextToken)=pos
 | |
|  ;
 | |
|  QUIT $$end(startTime,.boxUsage)
 | |
|  ;
 | |
|  ;
 | |
|  ;  MDB Server side response to incoming REST requests
 | |
|  ;
 | |
| mgwsiResponse(cgi,data)
 | |
|  ; m_apache HTTP entry point: normalise to WebLink interface
 | |
|  n %CGIEVAR,n,name,%KEY,unescName
 | |
|  i $g(^zewd("trace"))=1 k ^mdbcgi m ^mdbcgi=cgi
 | |
|  i $g(^zewd("trace"))=1 s n=$increment(^mdbdata) m ^mdbdata(n)=data
 | |
|  i $g(^%zewd("relink"))=1,'$d(^%zewd("relink","process",$j)) s ok=$$relink^%zewdGTMRuntime()
 | |
|  m %CGIEVAR=cgi
 | |
|  s name=""
 | |
|  f  s name=$o(data(name)) q:name=""  d
 | |
|  . i name="$CONTENT" q
 | |
|  . s unescName=$$urlDecode(name)
 | |
|  . s %KEY(unescName)=$$urlDecode($g(data(name,1)))
 | |
|  . i %KEY(unescName)[$c(13,10) s %KEY(unescName)=$$replace(%KEY(unescName),$c(13,10),"")
 | |
|  d response
 | |
|  QUIT
 | |
|  ;
 | |
| response
 | |
|  i $d(%KEY) d
 | |
|  . ; WebLink access entry point here
 | |
|  . n action,attributes,AWSAcessKeyId,boxUsage,db,error,hash,itemsAndAttrs,keyId
 | |
|  . n requestId,secretKey,signatureMethod,signatureVersion,stringToSign
 | |
|  . ;
 | |
|  . ;k ^rltKey m ^rltKey=%KEY
 | |
|  . s db=$g(%KEY("db"))
 | |
|  . i db="" s db="mdb" ;,%KEY("db")=db
 | |
|  . s action=$g(%KEY("Action"))
 | |
|  . i $g(^zewd("trace"))=1 d
 | |
|  . . n i
 | |
|  . . d trace("MDB request processing for "_action_": started at "_$h_"; process: "_$j)
 | |
|  . . s i=$increment(^mdbKey)
 | |
|  . . m ^mdbKey(i)=%KEY
 | |
|  . i action="Initialise"!(action="initialise")!(action="Initialize")!(action="initialize") d  QUIT
 | |
|  . . s %KEY("db")=db
 | |
|  . . i $d(^MDBUAF("administrator")) d errorResponse("InvalidAction","M DB has already been initialised") q
 | |
|  . . s error=$$initialise(.requestId,.boxUsage)
 | |
|  . . i error'="" d errorResponse("InvalidConfigurationFile",error) q
 | |
|  . . d createResponse(action,requestId,boxUsage)
 | |
|  . i action="InstallMDBX" d  QUIT
 | |
|  . . s %KEY("db")=db
 | |
|  . . s error=$$installMDBX(.requestId,.boxUsage)
 | |
|  . . i error'="" d errorResponse("InvalidInstallRequest",error) q
 | |
|  . . d createResponse(action,requestId,boxUsage)
 | |
|  . i action="InstallMDBM" d  QUIT
 | |
|  . . s %KEY("db")=db
 | |
|  . . s error=$$installMDBM(.requestId,.boxUsage)
 | |
|  . . i error'="" d errorResponse("InvalidInstallRequest",error) q
 | |
|  . . d createResponse(action,requestId,boxUsage)
 | |
|  . i $g(%KEY("MDBToken"))'="" d  q:error
 | |
|  . . n keyId
 | |
|  . . s error=""
 | |
|  . . s keyId=$$authenticate^MDBSession(%KEY("MDBToken"))
 | |
|  . . i keyId="" s error=1 d errorResponse("InvalidTokenId","The Access Token you provided does not exist in our records") QUIT
 | |
|  . e  d  q:error=1
 | |
|  . . s error=""
 | |
|  . . s signatureVersion=+$g(%KEY("SignatureVersion"))
 | |
|  . . s signatureMethod=$g(%KEY("SignatureMethod"))
 | |
|  . . s stringToSign=$$createResponseStringToSign(signatureVersion)
 | |
|  . . s keyId=$g(%KEY("AWSAccessKeyId"))
 | |
|  . . i keyId="" s keyId=$g(%KEY("MDBAccessKeyId"))
 | |
|  . . i action="AddUser" d  i error'="" QUIT
 | |
|  . . . s error=""
 | |
|  . . . i keyId=$g(^MDBUAF("administrator")) q
 | |
|  . . . d errorResponse("InvalidAdministratorKey","The Access Key Id was not that of the Administrator")
 | |
|  . . . s error=1
 | |
|  . . i keyId="" s error=1 d errorResponse("InvalidClientTokenId","The Access Key Id you provided does not exist in our records") QUIT
 | |
|  . . i $g(^MDBUAF("keys",keyId))="" s error=1 d errorResponse("InvalidClientTokenId","The Access Key Id you provided does not exist in our records") QUIT
 | |
|  . . i $g(%KEY("Signature"))="" s error=1 d errorResponse("SignatureDoesNotMatch","The request signature we calculated does not match the signature you provided.  Check your Secret Access Key and signing method.  Consult the service documentation for details") QUIT
 | |
|  . . s secretKey=$g(^MDBUAF("keys",keyId))
 | |
|  . . s hash=$$getSignedString(stringToSign,secretKey,signatureMethod)
 | |
|  . . i $g(^zewd("trace"))=1 d trace($h_": string to sign:"_stringToSign)
 | |
|  . . i $g(^zewd("trace"))=1 d trace($h_": hash="_hash_"; signature rcvd="_%KEY("Signature"))
 | |
|  . . i hash'=%KEY("Signature") s error=1 d errorResponse("SignatureDoesNotMatch","The request signature we calculated does not match the signature you provided.  Check your Secret Access Key and signing method.  Consult the service documentation for details") QUIT
 | |
|  . ;
 | |
|  . ; Security OK
 | |
|  . ;
 | |
|  . ;d trace("security ok: db="_db)
 | |
|  . i $g(^MDBAPI(db,action))'="" d  QUIT
 | |
|  . . ; Custom extension gateway.  Method should return output in response(lineNo)
 | |
|  . . ; any error should be returned as errorCode~errorText
 | |
|  . . n doll,lineNo,method,no,requestId,response,startTime,x
 | |
|  . . s method=^MDBAPI(db,action)
 | |
|  . . s x="s error=$$"_method_"(.%KEY,.response)"
 | |
|  . . s requestId=$$init(.startTime)
 | |
|  . . x x
 | |
|  . . i error'="" d errorResponse($p(error,"~",1),$p(error,"~",2)) QUIT
 | |
|  . . i $$end(startTime,.boxUsage)
 | |
|  . . s lineNo=1
 | |
|  . . i $g(%KEY("mdbRawOutput"))'="true",$g(%KEY("OutputFormat"))'="JSON" d
 | |
|  . . . s ^CacheTempEWD($j,lineNo)="<?xml version='1.0'?>"_$c(13,10),lineNo=lineNo+1
 | |
|  . . . s ^CacheTempEWD($j,lineNo)="<"_action_"Response xmlns=""http://"_db_".mgateway.com/doc/2009-06-05/"">",lineNo=lineNo+1
 | |
|  . . s no=""
 | |
|  . . f  s no=$o(response(no)) q:no=""  d
 | |
|  . . . s ^CacheTempEWD($j,lineNo)=response(no),lineNo=lineNo+1
 | |
|  . . d createResponse(db_":"_action,requestId,boxUsage) QUIT
 | |
|  . ;
 | |
|  . i db="mdb" s %KEY("db")="mdb"
 | |
|  . i action="AddUser" d  QUIT
 | |
|  . . n userKeyId,userSecretKey
 | |
|  . . s userKeyId=$g(%KEY("UserAccessKeyId"))
 | |
|  . . i userKeyId="" d errorResponse("InvalidKeyId","The new user Access Key Id was not defined") QUIT
 | |
|  . . s userSecretKey=$g(%KEY("UserSecretKey"))
 | |
|  . . i userSecretKey="" d errorResponse("InvalidSecretKey","The new user Secret Key was not defined") QUIT
 | |
|  . . s error=$$addUser(userKeyId,userSecretKey,.requestId,.boxUsage)
 | |
|  . . i error'="" d errorResponse($p(error,"~",1),$p(error,"~",2)) QUIT
 | |
|  . . d createResponse(action,requestId,boxUsage) QUIT
 | |
|  . ;
 | |
|  . i action="GetToken" d  QUIT
 | |
|  . . n boxUsage,requestId,startTime,token
 | |
|  . . s requestId=$$init(.startTime)
 | |
|  . . s token=$$createNewSession^MDBSession(keyId,1200)
 | |
|  . . i $$end(startTime,.boxUsage)
 | |
|  . . d createResponse(action,requestId,boxUsage)
 | |
|  . ;
 | |
|  . i action="CreateDomain" d  QUIT
 | |
|  . . n domainName,resp
 | |
|  . . s domainName=$g(%KEY("DomainName"))
 | |
|  . . s error=$$createDomain(keyId,domainName,.requestId,.boxUsage)
 | |
|  . . i error'="" d errorResponse($p(error,"~",1),$p(error,"~",2)) QUIT
 | |
|  . . d createResponse(action,requestId,boxUsage) QUIT
 | |
|  . ;
 | |
|  . i action="DeleteDomain" d  QUIT
 | |
|  . . n domainName,resp
 | |
|  . . s domainName=$g(%KEY("DomainName"))
 | |
|  . . s error=$$deleteDomain(keyId,domainName,.requestId,.boxUsage)
 | |
|  . . i error'="" d errorResponse($p(error,"~",1),$p(error,"~",2)) QUIT
 | |
|  . . d createResponse(action,requestId,boxUsage) QUIT
 | |
|  . ;
 | |
|  . i action="ListDomains" d  QUIT
 | |
|  . . ;d trace("in ListDomains")
 | |
|  . . n domainList,maxNoOfDomains,nextToken,resp
 | |
|  . . s maxNoOfDomains=$g(%KEY("MaxNumberOfDomains"))
 | |
|  . . s nextToken=$g(%KEY("NextToken"))
 | |
|  . . s error=$$listDomains(keyId,maxNoOfDomains,.nextToken,.domainList,.requestId,.boxUsage)
 | |
|  . . i error'="" d errorResponse($p(error,"~",1),$p(error,"~",2)) QUIT
 | |
|  . . d createResponse(action,requestId,boxUsage) QUIT
 | |
|  . ;
 | |
|  . i action="DomainMetadata" d  QUIT
 | |
|  . . n domainName,metaData
 | |
|  . . s domainName=$g(%KEY("DomainName"))
 | |
|  . . s error=$$domainMetadata(keyId,domainName,.metaData,.requestId,.boxUsage)
 | |
|  . . i error'="" d errorResponse($p(error,"~",1),$p(error,"~",2)) QUIT
 | |
|  . . d createResponse(action,requestId,boxUsage) QUIT
 | |
|  . ;
 | |
|  . i action="PutAttributes" d  QUIT
 | |
|  . . n domainName,error,i,itemName,name,paramName,paramValue,replace,start,stop
 | |
|  . . s domainName=$g(%KEY("DomainName"))
 | |
|  . . s itemName=$g(%KEY("ItemName"))
 | |
|  . . s stop=0
 | |
|  . . s name=$o(%KEY("Attribute."))
 | |
|  . . s start=$p(name,".",2)
 | |
|  . . s error=""
 | |
|  . . f i=start:1 d  q:stop
 | |
|  . . . s paramName="Attribute."_i_".Name"
 | |
|  . . . i '$d(%KEY(paramName)) s stop=1 q
 | |
|  . . . s paramValue="Attribute."_i_".Value"
 | |
|  . . . ;i '$d(%KEY(paramValue)) s stop=1 q
 | |
|  . . . i '$d(%KEY(paramValue)) s error="MissingParameter~Attribute Value missing for Attribute Name='"_%KEY(paramName),stop=1 q
 | |
|  . . . ;i %KEY(paramValue)="" s error="MissingParameter~Attribute Value missing for Attribute Name='"_%KEY(paramName),stop=1
 | |
|  . . . s replace=$g(%KEY("Attribute."_i_".Replace"))
 | |
|  . . . i replace="true" s replace=1
 | |
|  . . . ; attributes(no,"name")=attribute name
 | |
|  . . . ; attributes(no,"value")=attribute value
 | |
|  . . . ; attributes(no,"replace")=1
 | |
|  . . . s attributes(i,"name")=%KEY(paramName)
 | |
|  . . . s attributes(i,"value")=%KEY(paramValue)
 | |
|  . . . i replace s attributes(i,"replace")=1
 | |
|  . . i error="" s error=$$putAttributes(keyId,domainName,itemName,.attributes,.requestId,.boxUsage)
 | |
|  . . i error'="" d errorResponse($p(error,"~",1),$p(error,"~",2)) QUIT
 | |
|  . . d createResponse(action,requestId,boxUsage) QUIT
 | |
|  . ;
 | |
|  . i action="GetAttributes" d  QUIT
 | |
|  . . n domainName,error,i,itemName,name,paramName,paramValue,replace,start,stop
 | |
|  . . s domainName=$g(%KEY("DomainName"))
 | |
|  . . s itemName=$g(%KEY("ItemName"))
 | |
|  . . s stop=0
 | |
|  . . s name=$o(%KEY("AttributeName."))
 | |
|  . . s start=$p(name,".",2)
 | |
|  . . s error=""
 | |
|  . . k attributes
 | |
|  . . f i=start:1 d  q:stop
 | |
|  . . . s paramName="AttributeName."_i
 | |
|  . . . i '$d(%KEY(paramName)) s stop=1 q
 | |
|  . . . s attributes(i)=%KEY(paramName)
 | |
|  . . . ;s attributes(1)="test"
 | |
|  . . s error=$$getAttributes(keyId,domainName,itemName,.attributes,.requestId,.boxUsage)
 | |
|  . . ; attributes(no)=attribute name
 | |
|  . . ; attributes(no,"value",vno)=attribute value
 | |
|  . . i error'="" d errorResponse($p(error,"~",1),$p(error,"~",2)) QUIT
 | |
|  . . d createResponse(action,requestId,boxUsage)
 | |
|  . ;
 | |
|  . i action="DeleteAttributes" d  QUIT
 | |
|  . . n attributes,domainName,error,i,itemName,name,paramName,paramValue,start,stop
 | |
|  . . s domainName=$g(%KEY("DomainName"))
 | |
|  . . s itemName=$g(%KEY("ItemName"))
 | |
|  . . s stop=0
 | |
|  . . s name=$o(%KEY("Attribute."))
 | |
|  . . s start=$p(name,".",2)
 | |
|  . . s error=""
 | |
|  . . ; attributes(no)=name
 | |
|  . . ; attributes(no,"value",vno)=value
 | |
|  . . k attributes
 | |
|  . . f i=start:1 d  q:stop
 | |
|  . . . s paramName="Attribute."_i_".Name"
 | |
|  . . . i '$d(%KEY(paramName)) s stop=1 q
 | |
|  . . . s name=%KEY(paramName)
 | |
|  . . . s attributes(i)=name
 | |
|  . . . s paramValue="Attribute."_i_".Value"
 | |
|  . . . i '$d(%KEY(paramValue)) s stop=1 q
 | |
|  . . . i %KEY(paramValue)="" s error="MissingParameter~Attribute Value missing for Attribute Name='"_%KEY(paramName),stop=1
 | |
|  . . . s attributes(i,"value",1)=%KEY(paramValue)
 | |
|  . . i error="" s error=$$deleteAttributes(keyId,domainName,itemName,.attributes,.requestId,.boxUsage)
 | |
|  . . i error'="" d errorResponse($p(error,"~",1),$p(error,"~",2)) QUIT
 | |
|  . . d createResponse(action,requestId,boxUsage) QUIT
 | |
|  . ;
 | |
|  . i action="Query" d  QUIT
 | |
|  . . n domainName,error,itemList,maxNoOfItems,nextToken,queryExpression
 | |
|  . . s domainName=$g(%KEY("DomainName"))
 | |
|  . . s queryExpression=$g(%KEY("QueryExpression"))
 | |
|  . . s maxNoOfItems=$g(%KEY("MaxNumberOfItems"))
 | |
|  . . s nextToken=$g(%KEY("NextToken"))
 | |
|  . . s error=$$query(keyId,domainName,queryExpression,maxNoOfItems,.nextToken,.itemList,.requestId,.boxUsage)
 | |
|  . . i error'="" d errorResponse($p(error,"~",1),$p(error,"~",2)) QUIT
 | |
|  . . d createResponse(action,requestId,boxUsage) QUIT
 | |
|  . ;
 | |
|  . i action="QueryWithAttributes" d  QUIT
 | |
|  . . n attribs,bx,domainName,error,ex,i,name,itemList,itemName,itemsAndAttrs,maxNoOfItems,name,nextToken
 | |
|  . . n paramName,pos,queryExpression,rx,sorted,start,stop,sub
 | |
|  . . ;
 | |
|  . . s domainName=$g(%KEY("DomainName"))
 | |
|  . . s queryExpression=$g(%KEY("QueryExpression"))
 | |
|  . . s maxNoOfItems=$g(%KEY("MaxNumberOfItems"))
 | |
|  . . s nextToken=$g(%KEY("NextToken"))
 | |
|  . . s name=$o(%KEY("AttributeName."))
 | |
|  . . s start=$p(name,".",2)
 | |
|  . . s error="",stop=0
 | |
|  . . f i=start:1 d  q:stop
 | |
|  . . . s paramName="AttributeName."_i
 | |
|  . . . i '$d(%KEY(paramName)) s stop=1 q
 | |
|  . . . s attributes(i)=%KEY(paramName)
 | |
|  . . s error=$$query(keyId,domainName,queryExpression,maxNoOfItems,.nextToken,.itemList,.requestId,.boxUsage)
 | |
|  . . s pos=""
 | |
|  . . f  s pos=$o(itemList(pos)) q:pos=""  d
 | |
|  . . . s itemName=itemList(pos)
 | |
|  . . . k attribs
 | |
|  . . . m attribs=attributes
 | |
|  . . . s ex=$$getAttributes(keyId,domainName,itemName,.attribs,.rx,.bx,1)
 | |
|  . . . m itemsAndAttrs(pos)=attribs
 | |
|  . . . s itemsAndAttrs(pos)=itemName
 | |
|  . . i error'="" d errorResponse($p(error,"~",1),$p(error,"~",2)) QUIT
 | |
|  . . d createResponse(action,requestId,boxUsage) QUIT
 | |
|  . ;
 | |
|  . i action="Select" d  QUIT
 | |
|  . . n attribs,attributes,boxUsage,bx,domainName,error,ex,itemList,itemName,nextToken
 | |
|  . . n pos,requestId,rx,selectExpression,startTime
 | |
|  . . ;
 | |
|  . . s requestId=$$init(.startTime)
 | |
|  . . s selectExpression=$g(%KEY("SelectExpression"))
 | |
|  . . s nextToken=$g(%KEY("NextToken"))
 | |
|  . . i $g(^zewd("trace"))=1 d trace($h_": Action Select, entering runSelect. keyId="_keyId_"; selectExpression="_selectExpression)
 | |
|  . . s error=$$runSelect(keyId,selectExpression,.itemList,.attributes,.domainName)
 | |
|  . . i $g(^zewd("trace")) d trace($h_": finished runSelect")
 | |
|  . . i error'="" d errorResponse($p(error,"~",1),$p(error,"~",2)) QUIT
 | |
|  . . i $g(attributes)="count(*)" d
 | |
|  . . . n count
 | |
|  . . . s itemsAndAttrs(1)="Domain"
 | |
|  . . . s itemsAndAttrs(1,1)="Count"
 | |
|  . . . s pos="",count=0
 | |
|  . . . f  s pos=$o(itemList(pos)) q:pos=""  s count=count+1
 | |
|  . . . s itemsAndAttrs(1,1,"value",1)=count
 | |
|  . . e  d
 | |
|  . . . s pos=""
 | |
|  . . . ;i $g(^zewd("trace")) d trace($h_": pos=''")
 | |
|  . . . f  s pos=$o(itemList(pos)) q:pos=""  d
 | |
|  . . . . ;i $g(^zewd("trace")) d trace($h_": pos="_pos)
 | |
|  . . . . s itemName=itemList(pos)
 | |
|  . . . . k attribs
 | |
|  . . . . m attribs=attributes
 | |
|  . . . . ;i $g(^zewd("trace")) d trace($h_": calling getAttributes for keyId="_keyId_"; domainName="_domainName_"; itemName "_itemName)
 | |
|  . . . . s ex=$$getAttributes(keyId,domainName,itemName,.attribs,.rx,.bx,1)
 | |
|  . . . . ;i $g(^zewd("trace")) d trace($h_": finished getAttributes")
 | |
|  . . . . m itemsAndAttrs(pos)=attribs
 | |
|  . . . . s itemsAndAttrs(pos)=itemName
 | |
|  . . ;i $g(^zewd("trace")) d trace($h_": about to call $$end")
 | |
|  . . i $$end(startTime,.boxUsage)
 | |
|  . . ;i $g(^zewd("trace")) d trace($h_": about to start createResponse")
 | |
|  . . d createResponse(action,requestId,boxUsage) QUIT
 | |
|  . ;
 | |
|  . d errorResponse("InvalidAction","The action "_action_" is not valid for this web service") QUIT
 | |
|  i $g(^zewd("trace"))=1 d trace("MDB request processing ended at "_$h)
 | |
|  QUIT
 | |
|  ;
 | |
| createResponse(action,requestId,boxUsage)
 | |
|  ;
 | |
|  n len,lineNo
 | |
|  ;
 | |
|  ;i $g(^zewd("trace"))=1 d trace($h_": Commencing createResponse")
 | |
|  i '$d(%KEY("isCSP")) d
 | |
|  . w "HTTP/1.0 200 OK"_$c(13,10)
 | |
|  . w "Date: "_$$inetDate^%zewdAPI($h)_" "_$tr($g(^MDBConfig("GMTOffset")),":","")_$c(13,10)
 | |
|  . i $g(%KEY("OutputFormat"))="JSON" d
 | |
|  . . w "Content-type: application/json"_$c(13,10)
 | |
|  . e  d
 | |
|  . . w "Content-type: text/xml"_$c(13,10)
 | |
|  s lineNo=1
 | |
|  i $g(%KEY("OutputFormat"))'="JSON" d
 | |
|  . i $g(%KEY("db"))="mdb" d
 | |
|  . . n apiVersion
 | |
|  . . k ^CacheTempEWD($j)
 | |
|  . . s lineNo=1
 | |
|  . . s ^CacheTempEWD($j,lineNo)="<?xml version='1.0'?>"_$c(13,10),lineNo=lineNo+1
 | |
|  . . s apiVersion=$g(%KEY("Version")) i apiVersion="" s apiVersion="2009-04-15"
 | |
|  . . s ^CacheTempEWD($j,lineNo)="<"_action_"Response xmlns=""http://sdb.amazonaws.com/doc/"_apiVersion_"/"">",lineNo=lineNo+1
 | |
|  . e  d
 | |
|  . . s action=$p(action,":",2)
 | |
|  . . s lineNo=$o(^CacheTempEWD($j,""),-1)+1
 | |
|  ;
 | |
|  i action="GetToken" d
 | |
|  . i $g(%KEY("OutputFormat"))="JSON" d
 | |
|  . . s ^CacheTempEWD($j,lineNo)="{token:"""_token_"""}"
 | |
|  . e  d
 | |
|  . . s ^CacheTempEWD($j,lineNo)="<GetTokenResult>"_token_"</GetTokenResult>",lineNo=lineNo+1
 | |
|  ;
 | |
|  i action="ListDomains" d
 | |
|  . i '$d(domainList) d
 | |
|  . . i $g(%KEY("OutputFormat"))="JSON" d
 | |
|  . . . s ^CacheTempEWD($j,lineNo)="[]",lineNo=lineNo+1
 | |
|  . . e  d
 | |
|  . . . s ^CacheTempEWD($j,lineNo)="<ListDomainsResult />",lineNo=lineNo+1
 | |
|  . e  d
 | |
|  . . n comma,no
 | |
|  . . i $g(%KEY("OutputFormat"))="JSON" d
 | |
|  . . . s ^CacheTempEWD($j,lineNo)="[",lineNo=lineNo+1
 | |
|  . . . s no="",comma=""
 | |
|  . . . f  s no=$o(domainList(no)) q:no=""  d
 | |
|  . . . . s ^CacheTempEWD($j,lineNo)=comma_""""_domainList(no)_"""",lineNo=lineNo+1,comma=","
 | |
|  . . . s ^CacheTempEWD($j,lineNo)="]",lineNo=lineNo+1
 | |
|  . . e  d
 | |
|  . . . s ^CacheTempEWD($j,lineNo)="<ListDomainsResult>",lineNo=lineNo+1
 | |
|  . . . s no=""
 | |
|  . . . f  s no=$o(domainList(no)) q:no=""  d
 | |
|  . . . . s ^CacheTempEWD($j,lineNo)="<DomainName>"_domainList(no)_"</DomainName>",lineNo=lineNo+1
 | |
|  . . . i $g(nextToken)'="" s ^CacheTempEWD($j,lineNo)="<NextToken>"_nextToken_"</NextToken>",lineNo=lineNo+1
 | |
|  . . . s ^CacheTempEWD($j,lineNo)="</ListDomainsResult>",lineNo=lineNo+1
 | |
|  ;
 | |
|  i action="CreateDomain",$g(%KEY("OutputFormat"))="JSON" d
 | |
|  . s ^CacheTempEWD($j,lineNo)="{ok:true}",lineNo=lineNo+1
 | |
|  ;
 | |
|  i action="DeleteAttributes",$g(%KEY("OutputFormat"))="JSON" d
 | |
|  . s ^CacheTempEWD($j,lineNo)="{ok:true}",lineNo=lineNo+1
 | |
|  ;
 | |
|  i action="DeleteDomain",$g(%KEY("OutputFormat"))="JSON" d
 | |
|  . s ^CacheTempEWD($j,lineNo)="{ok:true}",lineNo=lineNo+1
 | |
|  ;
 | |
|  i action="PutAttributes",$g(%KEY("OutputFormat"))="JSON" d
 | |
|  . s ^CacheTempEWD($j,lineNo)="{ok:true}",lineNo=lineNo+1
 | |
|  ;
 | |
|  i action="DomainMetadata" d
 | |
|  . i '$d(metaData) d
 | |
|  . . i $g(%KEY("OutputFormat"))="JSON" d
 | |
|  . . . s ^CacheTempEWD($j,lineNo)="{}",lineNo=lineNo+1
 | |
|  . . e  d
 | |
|  . . . s ^CacheTempEWD($j,lineNo)="<DomainMetadataResult />",lineNo=lineNo+1
 | |
|  . e  d
 | |
|  . . n comma,name
 | |
|  . . i $g(%KEY("OutputFormat"))="JSON" d
 | |
|  . . . s ^CacheTempEWD($j,lineNo)="{",lineNo=lineNo+1
 | |
|  . . . s name="",comma=""
 | |
|  . . . f  s name=$o(metaData(name)) q:name=""  d
 | |
|  . . . . s ^CacheTempEWD($j,lineNo)=comma_name_":"_metaData(name),lineNo=lineNo+1,comma=","
 | |
|  . . . s ^CacheTempEWD($j,lineNo)="}",lineNo=lineNo+1
 | |
|  . . e  d
 | |
|  . . . s ^CacheTempEWD($j,lineNo)="<DomainMetadataResult>",lineNo=lineNo+1
 | |
|  . . . s name=""
 | |
|  . . . f  s name=$o(metaData(name)) q:name=""  d
 | |
|  . . . . s ^CacheTempEWD($j,lineNo)="<"_name_">"_metaData(name)_"</"_name_">",lineNo=lineNo+1
 | |
|  . . . s ^CacheTempEWD($j,lineNo)="</DomainMetadataResult>",lineNo=lineNo+1
 | |
|  ;
 | |
|  i action="GetAttributes",%KEY("db")="mdb" d
 | |
|  . i '$d(attributes) d
 | |
|  . . i $g(%KEY("OutputFormat"))="JSON" d
 | |
|  . . . s ^CacheTempEWD($j,lineNo)="{}",lineNo=lineNo+1
 | |
|  . . e  d
 | |
|  . . . s ^CacheTempEWD($j,lineNo)="<GetAttributesResult />",lineNo=lineNo+1
 | |
|  . e  d
 | |
|  . . n acomma,comma,count,name,no,quote,stop,value,valueNo
 | |
|  . . i $g(%KEY("OutputFormat"))="JSON" d
 | |
|  . . . s ^CacheTempEWD($j,lineNo)="{",lineNo=lineNo+1
 | |
|  . . . s no="",comma=""
 | |
|  . . . f  s no=$o(attributes(no)) q:no=""  d
 | |
|  . . . . s name=attributes(no)
 | |
|  . . . . s valueNo="",count=0,stop=0
 | |
|  . . . . f  s valueNo=$o(attributes(no,"value",valueNo)) q:valueNo=""  d  q:stop
 | |
|  . . . . . s count=count+1 i count>1 s stop=1
 | |
|  . . . . i count=1 d
 | |
|  . . . . . s ^CacheTempEWD($j,lineNo)=comma_name_":",acomma="",comma=",",lineNo=lineNo+1
 | |
|  . . . . e  d
 | |
|  . . . . . s ^CacheTempEWD($j,lineNo)=comma_name_":[",acomma="",comma=",",lineNo=lineNo+1
 | |
|  . . . . s valueNo=""
 | |
|  . . . . f  s valueNo=$o(attributes(no,"value",valueNo)) q:valueNo=""  d
 | |
|  . . . . . s value=attributes(no,"value",valueNo)
 | |
|  . . . . . s quote="""" i $$numeric(value) s quote=""
 | |
|  . . . . . s ^CacheTempEWD($j,lineNo)=acomma_quote_value_quote,lineNo=lineNo+1,acomma=","
 | |
|  . . . . i count>1 s ^CacheTempEWD($j,lineNo)="]",lineNo=lineNo+1
 | |
|  . . . s ^CacheTempEWD($j,lineNo)="}",lineNo=lineNo+1
 | |
|  . . e  d
 | |
|  . . . s ^CacheTempEWD($j,lineNo)="<GetAttributesResult>",lineNo=lineNo+1
 | |
|  . . . s no=""
 | |
|  . . . f  s no=$o(attributes(no)) q:no=""  d
 | |
|  . . . . s name=attributes(no)
 | |
|  . . . . s valueNo=""
 | |
|  . . . . f  s valueNo=$o(attributes(no,"value",valueNo)) q:valueNo=""  d
 | |
|  . . . . . s value=attributes(no,"value",valueNo)
 | |
|  . . . . . s value=$$escape(value)
 | |
|  . . . . . s ^CacheTempEWD($j,lineNo)="<Attribute>",lineNo=lineNo+1
 | |
|  . . . . . s ^CacheTempEWD($j,lineNo)="<Name>"_name_"</Name>",lineNo=lineNo+1
 | |
|  . . . . . s ^CacheTempEWD($j,lineNo)="<Value>"_value_"</Value>",lineNo=lineNo+1
 | |
|  . . . . . s ^CacheTempEWD($j,lineNo)="</Attribute>",lineNo=lineNo+1
 | |
|  . . . s ^CacheTempEWD($j,lineNo)="</GetAttributesResult>",lineNo=lineNo+1
 | |
|  ;
 | |
|  i action="Select" d
 | |
|  . ;i $g(^zewd("trace"))=1 d trace($h_": action=Select")
 | |
|  . i '$d(itemsAndAttrs) d  q
 | |
|  . . s ^CacheTempEWD($j,lineNo)="<SelectResult />",lineNo=lineNo+1
 | |
|  . e  d
 | |
|  . . n attrName,attrNo,attrValue,attrValueNo,itemName,itemNo
 | |
|  . . s ^CacheTempEWD($j,lineNo)="<SelectResult>",lineNo=lineNo+1
 | |
|  . . s itemNo=""
 | |
|  . . f  s itemNo=$o(itemsAndAttrs(itemNo)) q:itemNo=""  d
 | |
|  . . . s itemName=itemsAndAttrs(itemNo)
 | |
|  . . . s ^CacheTempEWD($j,lineNo)="<Item>",lineNo=lineNo+1
 | |
|  . . . s ^CacheTempEWD($j,lineNo)="<Name>"_itemName_"</Name>",lineNo=lineNo+1
 | |
|  . . . s attrNo=""
 | |
|  . . . f  s attrNo=$o(itemsAndAttrs(itemNo,attrNo)) q:attrNo=""  d
 | |
|  . . . . s attrName=itemsAndAttrs(itemNo,attrNo)
 | |
|  . . . . s attrValueNo=""
 | |
|  . . . . f  s attrValueNo=$o(itemsAndAttrs(itemNo,attrNo,"value",attrValueNo)) q:attrValueNo=""  d
 | |
|  . . . . . s attrValue=itemsAndAttrs(itemNo,attrNo,"value",attrValueNo)
 | |
|  . . . . . s attrValue=$$escape(attrValue)
 | |
|  . . . . . s ^CacheTempEWD($j,lineNo)="<Attribute>",lineNo=lineNo+1
 | |
|  . . . . . s ^CacheTempEWD($j,lineNo)="<Name>"_attrName_"</Name><Value>"_attrValue_"</Value>",lineNo=lineNo+1
 | |
|  . . . . . s ^CacheTempEWD($j,lineNo)="</Attribute>",lineNo=lineNo+1
 | |
|  . . . s ^CacheTempEWD($j,lineNo)="</Item>",lineNo=lineNo+1
 | |
|  . . s ^CacheTempEWD($j,lineNo)="</SelectResult>",lineNo=lineNo+1
 | |
|  . ;i $g(^zewd("trace"))=1 d trace($h_": finished action=Select")
 | |
|  ;
 | |
|  i action="Query" d
 | |
|  . i '$d(itemList) d
 | |
|  . . i $g(%KEY("OutputFormat"))="JSON" d
 | |
|  . . . s ^CacheTempEWD($j,lineNo)="[]",lineNo=lineNo+1
 | |
|  . . e  d
 | |
|  . . . s ^CacheTempEWD($j,lineNo)="<QueryResult />",lineNo=lineNo+1
 | |
|  . e  d
 | |
|  . . n comma,position,quotes
 | |
|  . . i $g(%KEY("OutputFormat"))="JSON" d
 | |
|  . . . s ^CacheTempEWD($j,lineNo)="[",lineNo=lineNo+1
 | |
|  . . . s position="",comma=""
 | |
|  . . . f  s position=$o(itemList(position)) q:position=""  d
 | |
|  . . . . s quotes="""" i $$numeric(itemList(position)) s quotes=""
 | |
|  . . . . s ^CacheTempEWD($j,lineNo)=comma_quotes_itemList(position)_quotes,lineNo=lineNo+1,comma=","
 | |
|  . . . s ^CacheTempEWD($j,lineNo)="]",lineNo=lineNo+1
 | |
|  . . e  d
 | |
|  . . . n position
 | |
|  . . . s ^CacheTempEWD($j,lineNo)="<QueryResult>",lineNo=lineNo+1
 | |
|  . . . s position=""
 | |
|  . . . f  s position=$o(itemList(position)) q:position=""  d
 | |
|  . . . . s ^CacheTempEWD($j,lineNo)="<ItemName>"_itemList(position)_"</ItemName>",lineNo=lineNo+1
 | |
|  . . . i $g(nextToken)'="" s ^CacheTempEWD($j,lineNo)="<NextToken>"_nextToken_"</NextToken>",lineNo=lineNo+1
 | |
|  . . . s ^CacheTempEWD($j,lineNo)="</QueryResult>",lineNo=lineNo+1
 | |
|  ;
 | |
|  i action="QueryWithAttributes" d
 | |
|  . i '$d(itemsAndAttrs) d  q
 | |
|  . . s ^CacheTempEWD($j,lineNo)="<QueryWithAttributesResult />",lineNo=lineNo+1
 | |
|  . e  d
 | |
|  . . n attrName,attrNo,attrValue,attrValueNo,itemName,itemNo
 | |
|  . . s ^CacheTempEWD($j,lineNo)="<QueryWithAttributesResult>",lineNo=lineNo+1
 | |
|  . . s itemNo=""
 | |
|  . . f  s itemNo=$o(itemsAndAttrs(itemNo)) q:itemNo=""  d
 | |
|  . . . s itemName=itemsAndAttrs(itemNo)
 | |
|  . . . s ^CacheTempEWD($j,lineNo)="<Item>",lineNo=lineNo+1
 | |
|  . . . s ^CacheTempEWD($j,lineNo)="<Name>"_itemName_"</Name>",lineNo=lineNo+1
 | |
|  . . . s attrNo=""
 | |
|  . . . f  s attrNo=$o(itemsAndAttrs(itemNo,attrNo)) q:attrNo=""  d
 | |
|  . . . . s attrName=itemsAndAttrs(itemNo,attrNo)
 | |
|  . . . . s attrValueNo=""
 | |
|  . . . . f  s attrValueNo=$o(itemsAndAttrs(itemNo,attrNo,"value",attrValueNo)) q:attrValueNo=""  d
 | |
|  . . . . . s attrValue=itemsAndAttrs(itemNo,attrNo,"value",attrValueNo)
 | |
|  . . . . . s attrValue=$$escape(attrValue)
 | |
|  . . . . . s ^CacheTempEWD($j,lineNo)="<Attribute>",lineNo=lineNo+1
 | |
|  . . . . . s ^CacheTempEWD($j,lineNo)="<Name>"_attrName_"</Name><Value>"_attrValue_"</Value>",lineNo=lineNo+1
 | |
|  . . . . . s ^CacheTempEWD($j,lineNo)="</Attribute>",lineNo=lineNo+1
 | |
|  . . . s ^CacheTempEWD($j,lineNo)="</Item>",lineNo=lineNo+1
 | |
|  . . s ^CacheTempEWD($j,lineNo)="</QueryWithAttributesResult>",lineNo=lineNo+1
 | |
|  ;
 | |
|  i $g(%KEY("db"))="mdb",$g(%KEY("OutputFormat"))'="JSON" d
 | |
|  . s ^CacheTempEWD($j,lineNo)="<ResponseMetadata>",lineNo=lineNo+1
 | |
|  . s ^CacheTempEWD($j,lineNo)="<RequestId>"_$g(requestId)_"</RequestId>",lineNo=lineNo+1
 | |
|  . s ^CacheTempEWD($j,lineNo)="<BoxUsage>"_$g(boxUsage)_"</BoxUsage>",lineNo=lineNo+1
 | |
|  . s ^CacheTempEWD($j,lineNo)="</ResponseMetadata>",lineNo=lineNo+1
 | |
|  i $g(%KEY("mdbRawOutput"))'="true",$g(%KEY("OutputFormat"))'="JSON" d
 | |
|  . s ^CacheTempEWD($j,lineNo)="</"_action_"Response>"_$c(13,10),lineNo=lineNo+1
 | |
|  ;
 | |
|  s len=0,lineNo=""
 | |
|  f  s lineNo=$o(^CacheTempEWD($j,lineNo)) q:lineNo=""  d
 | |
|  . s len=len+$l(^CacheTempEWD($j,lineNo))
 | |
|  i '$d(%KEY("isCSP")) w "Content-length: "_len_$c(13,10,13,10) 
 | |
|  s lineNo=""
 | |
|  f  s lineNo=$o(^CacheTempEWD($j,lineNo)) q:lineNo=""  d
 | |
|  . w ^CacheTempEWD($j,lineNo)
 | |
|  k ^CacheTempEWD($j)
 | |
|  w !
 | |
|  ;i $g(^zewd("trace"))=1 d trace($h_": finished createResponse")
 | |
|  QUIT
 | |
|  ;
 | |
| errorResponse(ec,em)
 | |
|  ;
 | |
|  n resp
 | |
|  ;
 | |
|  i $g(%KEY("OutputFormat"))="JSON" d  QUIT
 | |
|  . s resp="400 Bad Request"
 | |
|  . i ec="SignatureDoesNotMatch" s resp="403 Forbidden"
 | |
|  . w "HTTP/1.0 "_resp_$c(13,10)
 | |
|  . w "Date: "_$$inetDate^%zewdAPI($h)_" "_$tr($g(^MDBConfig("GMTOffset")),":","")_$c(13,10)
 | |
|  . w "Content-type: application/json"_$c(13,10),$c(13,10)
 | |
|  . w "{""ErrorCode"":"""_ec_""",""ErrorMessage"":"""_em_"""}"_$c(13,10)
 | |
|  . w !
 | |
|  ;
 | |
|  s resp="400 Bad Request"
 | |
|  i ec="SignatureDoesNotMatch" s resp="403 Forbidden"
 | |
|  w "HTTP/1.0 "_resp_$c(13,10)
 | |
|  w "Date: "_$$inetDate^%zewdAPI($h)_" "_$tr($g(^MDBConfig("GMTOffset")),":","")_$c(13,10)
 | |
|  w "Content-type: text/xml"_$c(13,10),$c(13,10)
 | |
|  w "<?xml version='1.0'?>"_$c(13,10)
 | |
|  w "<Response><Errors><Error>"
 | |
|  w "<Code>"_ec_"</Code>"
 | |
|  w "<Message>"_em_"</Message>"
 | |
|  i ec'="SignatureDoesNotMatch",ec'="InvalidClientTokenId" w "<BoxUsage>0</BoxUsage>"
 | |
|  w "</Error></Errors>"
 | |
|  ; Note mis-spelling of ID instead of Id to follow SimpleDB's "feature"!
 | |
|  w "<RequestID>"_$$createRequestId()_"</RequestID>"
 | |
|  w "</Response>"_$c(13,10)
 | |
|  w !
 | |
|  QUIT
 | |
|  ;
 | |
| createResponseStringToSign(version)
 | |
|  ;
 | |
|  n amp,n,name,nlc,stringToSign,nvpListlc,value
 | |
|  ;
 | |
|  s stringToSign=""
 | |
|  ;
 | |
|  i version=0 d  QUIT stringToSign
 | |
|  . s stringToSign=$g(%KEY("Action"))_$g(%KEY("Timestamp"))
 | |
|  ;
 | |
|  i version=1 d  QUIT stringToSign
 | |
|  . s n=""
 | |
|  . f  s n=$o(%KEY(n)) q:n=""  d
 | |
|  . . q:$e(n,1,3)="MGW"
 | |
|  . . q:n="Signature"
 | |
|  . . q:n="isCSP"
 | |
|  . . s nvpListlc($zconvert(n,"l"))=n
 | |
|  . . ;i $zv["GT.M" d
 | |
|  . . ;. s nvpListlc($zconvert(n,"l"))=n
 | |
|  . . ;e  d
 | |
|  . . ;. s nvpListlc($zconvert(n,"l"))=n
 | |
|  . s nlc=""
 | |
|  . f  s nlc=$o(nvpListlc(nlc)) q:nlc=""  d
 | |
|  . . s name=nvpListlc(nlc)
 | |
|  . . s value=%KEY(name)
 | |
|  . . s stringToSign=stringToSign_name_value
 | |
|  ;
 | |
|  i version=2 d  QUIT stringToSign
 | |
|  . n location,method,url
 | |
|  . s name="",amp=""
 | |
|  . f  s name=$o(%KEY(name)) q:name=""  d
 | |
|  . . q:$e(name,1,3)="MGW"
 | |
|  . . q:name="Signature"
 | |
|  . . q:name="isCSP"
 | |
|  . . s value=$$urlEscape(%KEY(name))
 | |
|  . . s stringToSign=stringToSign_amp_name_"="_value
 | |
|  . . s amp="&"
 | |
|  . s method=$g(%CGIEVAR("REQUEST_METHOD"))
 | |
|  . s url=$g(%CGIEVAR("SERVER_NAME"))
 | |
|  . s location=$g(%CGIEVAR("REQUEST_URI"))
 | |
|  . i location["?" s location=$p(location,"?",1)
 | |
|  . i location="" d
 | |
|  . . s location="/scripts/mgwms32.dll"
 | |
|  . . i $d(%KEY("isCSP")) s location=$$baseUri^MDBMCache()
 | |
|  . e  d
 | |
|  . . i location["http://"!(location["https://") d
 | |
|  . . . s location=$p(location,"://",2)
 | |
|  . . . s location="/"_$p(location,"/",2,2000)
 | |
|  . . . s location=$p(location,"?",1)
 | |
|  . s stringToSign=method_$c(10)_url_$c(10)_location_$c(10)_stringToSign
 | |
|  . ;s stringToSign=$$replaceAll(stringToSign,$c(13,10),"")
 | |
|  ;
 | |
|  QUIT stringToSign
 | |
|  ;
 | |
| createToken(length)
 | |
|  ;
 | |
|  n i,string,token
 | |
|  ;
 | |
|  s string="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890"
 | |
|  s token=""
 | |
|  f i=1:1:length s token=token_$e(string,($r($l(string))+1))
 | |
|  QUIT token_"="
 | |
|  ;
 | |
| init(startTime)
 | |
|  ;
 | |
|  i $g(^zewd("trace")) d trace($h_": $$init")
 | |
|  i $zv["GT.M" d
 | |
|  . s startTime=$$ZTS^%ZMGWSIS(1)
 | |
|  e  d
 | |
|  . s startTime=$zts
 | |
|  s startTime=(startTime*86400)+$p(startTime,",",2)
 | |
|  QUIT $$createRequestId()
 | |
|  ;
 | |
| createRequestId()
 | |
|  n hex,i,responseId
 | |
|  s responseId="" 
 | |
|  f i=1:1:16 d
 | |
|  . s hex=$$hex($r(256))
 | |
|  . i $l(hex)=1 s hex=0_hex
 | |
|  . s responseId=responseId_hex
 | |
|  . i i=4!(i=6)!(i=8)!(i=10) s responseId=responseId_"-"
 | |
|  QUIT $zconvert(responseId,"l")
 | |
|  ;i $zv["GT.M" QUIT $zconvert(responseId,"l")
 | |
|  ;QUIT $zconvert(responseId,"l")
 | |
|  
 | |
| end(startTime,boxUsage,errorCode,parameter1,parameter2)
 | |
|  ;
 | |
|  n endTime,error
 | |
|  ;
 | |
|  i $g(^zewd("trace")) d trace($h_": $$end")
 | |
|  i $zv["GT.M" d
 | |
|  . s endTime=$$ZTS^%ZMGWSIS(1)
 | |
|  e  d
 | |
|  . s endTime=$zts
 | |
|  s endTime=(endTime*86400)+$p(endTime,",",2)
 | |
|  s boxUsage=endTime-startTime,boxUsage=$j(boxUsage,1,10)
 | |
|  i $g(errorCode)="" QUIT ""
 | |
|  s error=$g(^MDBErrors(errorCode))
 | |
|  i error="" QUIT errorCode_"~"_$g(parameter1)
 | |
|  i $g(parameter1)'="" s $p(error,"~",2)=parameter1
 | |
|  i $g(parameter2)'="" s $p(error,"~",4)=parameter2
 | |
|  QUIT errorCode_"~"_$tr(error,"~","")
 | |
|  ;
 | |
| getSignedString(string,secretKey,signatureMethod)
 | |
|  ;
 | |
|  n context,hash,returnValue
 | |
|  ;
 | |
|  i $zv["GT.M" d  QUIT returnValue
 | |
|  . s context=1
 | |
|  . i $d(^zewd("config","MGWSI")) s context=0
 | |
|  . i $zconvert($g(signatureMethod),"l")="hmacsha256" d
 | |
|  . . s returnValue=$$HMACSHA256^%ZMGWSIS(string,secretKey,1,context)
 | |
|  . e  d
 | |
|  . . s returnValue=$$HMACSHA1^%ZMGWSIS(string,secretKey,1,context)
 | |
|  ;
 | |
|  QUIT $$sign^MDBMCache(signatureMethod,string,secretKey)
 | |
|  ;
 | |
| runQuery(keyId,domainName,queryExpression,nextToken,itemList)
 | |
|  ;
 | |
|  n domainId,error,filter,itemId,itemName,matchList,name,no,pos,stop
 | |
|  ;
 | |
|  ;i $g(^zewd("trace")) d trace($h_": runQuery started")
 | |
|  s error=""
 | |
|  s filter="",stop=0
 | |
|  i queryExpression["itemName{}" s queryExpression=$$replaceAll(queryExpression,"itemName{}","itemName()")
 | |
|  s queryExpression=$$stripSpaces($g(queryExpression))
 | |
|  s domainId=$$getDomainId(keyId,domainName)
 | |
|  i $g(^zewd("trace"))=1 d trace("runQuery: domainId="_domainId_"; queryExpression="_queryExpression)
 | |
|  i domainId="" QUIT ""
 | |
|  ;
 | |
|  i queryExpression="" d  QUIT error
 | |
|  . s itemId="",no=0
 | |
|  . f  s itemId=$o(^MDB(keyId,"domains",domainId,"items",itemId)) q:itemId=""  d
 | |
|  . . s no=no+1
 | |
|  . . s itemList(no)=^MDB(keyId,"domains",domainId,"items",itemId)
 | |
|  ;
 | |
|  i queryExpression["sort " d  i error'="" QUIT error
 | |
|  . i queryExpression["union "!(queryExpression["union[")!(queryExpression["not ")!(queryExpression["not[") s error=$$queryError(1)
 | |
|  ;
 | |
|  f  d  q:stop  q:queryExpression=""  q:error'=""
 | |
|  . k matchList
 | |
|  . s error=$$queryPredicate(.queryExpression,keyId,domainId,.matchList,.name)
 | |
|  . q:error'=""
 | |
|  . i filter="" d mergeLists(.itemList,.matchList) ;m itemList=matchList
 | |
|  . i filter="intersection" d
 | |
|  . . s pos=""
 | |
|  . . f  s pos=$o(itemList(pos)) q:pos=""  d
 | |
|  . . . s itemName=itemList(pos)
 | |
|  . . . i '$$inMatchList(.matchList,itemName) k itemList(pos)
 | |
|  . . . ;i '$d(matchList(itemId)) k itemList(itemId)
 | |
|  . i filter="union" d mergeLists(.itemList,.matchList) ;m itemList=matchList
 | |
|  . q:queryExpression=""
 | |
|  . s filter=""
 | |
|  . i $$startsWith(queryExpression,"intersection") d  q
 | |
|  . . s queryExpression=$e(queryExpression,13,$l(queryExpression))
 | |
|  . . s queryExpression=$$stripSpaces(queryExpression)
 | |
|  . . s filter="intersection"
 | |
|  . i $$startsWith(queryExpression,"union") d  q
 | |
|  . . s queryExpression=$e(queryExpression,6,$l(queryExpression))
 | |
|  . . s queryExpression=$$stripSpaces(queryExpression)
 | |
|  . . s filter="union"
 | |
|  . i $$startsWith(queryExpression,"sort") s stop=1 q
 | |
|  . s error=$$queryError(2)
 | |
|  ;
 | |
|  i $$startsWith(queryExpression,"sort") d
 | |
|  . n attrNo,direction,found,itemName,itemId,n,sortAttr,sortAttrId,sortedList,xvalue
 | |
|  . s queryExpression=$e(queryExpression,5,$l(queryExpression))
 | |
|  . s queryExpression=$$stripSpaces(queryExpression)
 | |
|  . s sortAttr=$p(queryExpression,"'",2)
 | |
|  . i sortAttr="" s error=$$queryError(3) q
 | |
|  . s sortAttrId=$$getAttributeId(keyId,domainId,sortAttr)
 | |
|  . i sortAttrId="" s error=$$queryError(4) q
 | |
|  . i $g(name)'="",name'=sortAttr s error=$$queryError(5) q
 | |
|  . i $g(name)="" d  q:error'=""
 | |
|  . . n no,ok
 | |
|  . . s no="",ok=0
 | |
|  . . f  s no=$o(name(no)) q:no=""  d  q:ok
 | |
|  . . . i name(no)=sortAttr s ok=1 q
 | |
|  . . i 'ok s error=$$queryError(6)
 | |
|  . s direction="1"
 | |
|  . s queryExpression=$p(queryExpression,"'",3)
 | |
|  . i queryExpression["desc" s direction="-1"
 | |
|  . s pos=""
 | |
|  . ;f  s pos=$o(itemList(pos)) q:pos=""  d
 | |
|  . ;. s itemName=itemList(pos)
 | |
|  . ;. s itemNamex=$e(itemName,1,$$indexLength())
 | |
|  . ;. s sortedList(itemNamex,pos)=itemName
 | |
|  . s pos=""
 | |
|  . f  s pos=$o(itemList(pos)) q:pos=""  d
 | |
|  . . s itemName=itemList(pos)
 | |
|  . . s itemId=$$getItemId(keyId,domainId,itemName)
 | |
|  . . s attrNo=""
 | |
|  . . f  s attrNo=$o(^MDB(keyId,"domains",domainId,"items",itemId,"attribs",sortAttrId,"value",attrNo)) q:attrNo=""  d
 | |
|  . . . s xvalue=^MDB(keyId,"domains",domainId,"items",itemId,"attribs",sortAttrId,"value",attrNo)
 | |
|  . . . s sortedList(xvalue,itemName)=""
 | |
|  . k itemList
 | |
|  . s n=0
 | |
|  . s xvalue=""
 | |
|  . f  s xvalue=$o(sortedList(xvalue),direction) q:xvalue=""  d
 | |
|  . . s itemName=""
 | |
|  . . f  s itemName=$o(sortedList(xvalue,itemName)) q:itemName=""  d
 | |
|  . . . i $d(found(itemName)) q
 | |
|  . . . s n=n+1
 | |
|  . . . s itemList(n)=itemName
 | |
|  . . . s found(itemName)=""
 | |
|  ;i $g(^zewd("trace")) d trace($h_": runQuery ended")
 | |
|  QUIT error
 | |
|  ;
 | |
| inMatchList(matchList,itemName)
 | |
|  ;
 | |
|  n pos,present
 | |
|  ;
 | |
|  s pos="",present=0
 | |
|  f  s pos=$o(matchList(pos)) q:pos=""  d  q:present
 | |
|  . i matchList(pos)=itemName s present=1
 | |
|  QUIT present
 | |
|  ;
 | |
|  ;
 | |
| mergeLists(toList,fromList)
 | |
|  ;
 | |
|  n index,itemName,maxPos,newPos,pos,posx,stop,toPos
 | |
|  ;
 | |
|  s pos=""
 | |
|  f  s pos=$o(toList(pos)) q:pos=""  d
 | |
|  . s itemName=toList(pos)
 | |
|  . i itemName="" s itemName=" "
 | |
|  . s index(itemName)=pos
 | |
|  ;
 | |
|  s pos="",maxPos=$o(toList(""),-1)
 | |
|  f  s pos=$o(fromList(pos)) q:pos=""  d
 | |
|  . s itemName=fromList(pos)
 | |
|  . ;s toPos="",stop=0
 | |
|  . ;f  s toPos=$o(toList(toPos)) q:toPos=maxPos  q:toPos=""  d  q:stop
 | |
|  . ;. i toList(toPos)=itemName s stop=1
 | |
|  . ;i 'stop d
 | |
|  . s posx=$g(index(itemName))
 | |
|  . i posx="" d
 | |
|  . . s newPos=$o(toList(""),-1)+1
 | |
|  . . s toList(newPos)=itemName
 | |
|  . . s index(itemName)=newPos
 | |
|  QUIT
 | |
|  ;
 | |
| queryPredicate(query,keyId,domainId,itemList,name)
 | |
|  n c,compOp,error,i,inString,no,not,predicate,relation,stop,value
 | |
|  ;
 | |
|  ;d trace("in queryPredicate - query="_query)
 | |
|  d
 | |
|  . n queryx
 | |
|  . s queryx=$$replaceAll(query,"\\",$c(3))
 | |
|  . i queryx["\'" s query=$$replaceAll(queryx,"\'",$c(1))
 | |
|  i query["''" s query=$$replaceAll(query,"''",$c(1))
 | |
|  i query[$c(32,1,39) s query=$$replaceAll(query,$c(32,1,39),$c(32,39,1))
 | |
|  i query[$c(61,1,39) s query=$$replaceAll(query,$c(61,1,39),$c(61,39,1))
 | |
|  i query[$c(2) s query=$$replaceAll(query,$c(2),$c(1))
 | |
|  s error="",predicate=""
 | |
|  s not=$$queryNot(.query)
 | |
|  i $e(query,1)'="[" QUIT $$queryError(7)
 | |
|  s inString=0
 | |
|  s query=$e(query,2,$l(query))
 | |
|  s stop=0
 | |
|  ;d trace("1 query="_query)
 | |
|  f i=1:1:$l(query) d  q:stop
 | |
|  . s c=$e(query,i)
 | |
|  . i c="'" s inString='inString
 | |
|  . i c="]",'inString d  q
 | |
|  . . s predicate=$e(query,1,i-1)
 | |
|  . . s query=$e(query,i+1,$l(query))
 | |
|  . . s stop=1
 | |
|  ;d trace("predicate="_predicate)
 | |
|  i predicate="" QUIT $$queryError(8)
 | |
|  s query=$$stripSpaces(query)
 | |
|  ;d trace("query="_query)
 | |
|  s error=$$parsePredicate(.predicate,.name,.compOp,.value)
 | |
|  i error'="" QUIT error
 | |
|  s no=1
 | |
|  ;d trace("predicate="_predicate)
 | |
|  i predicate'="" d  i error'="" QUIT error
 | |
|  . ;d trace("name="_name)
 | |
|  . s name(1)=name
 | |
|  . ;d trace("compOp="_compOp)
 | |
|  . s compOp(1)=compOp
 | |
|  . ;d trace("value="_value)
 | |
|  . i value="" s value=$c(31)
 | |
|  . s value(1)=value
 | |
|  . f  q:predicate=""  d  q:error'=""
 | |
|  . . i $e(predicate,1,3)="and" d  q
 | |
|  . . . s predicate=$e(predicate,4,$l(predicate))
 | |
|  . . . s error=$$parseSubPredicate(.predicate,.name,.compOp,.value,.no)
 | |
|  . . . s relation(no)="&"
 | |
|  . . i $e(predicate,1,2)="or" d  q
 | |
|  . . . s predicate=$e(predicate,3,$l(predicate))
 | |
|  . . . s error=$$parseSubPredicate(.predicate,.name,.compOp,.value,.no)
 | |
|  . . . s relation(no)="!"
 | |
|  ;d trace("about to run executeQuery")
 | |
|  d executeQuery(keyId,domainId,no,.name,.compOp,.value,.relation,.itemList)
 | |
|  i not d not(.itemList)
 | |
|  QUIT error
 | |
|  ;
 | |
| parseSubPredicate(predicate,name,compOp,value,no)
 | |
|  n error
 | |
|  ;
 | |
|  s predicate=$$stripSpaces(predicate)
 | |
|  s error=$$parsePredicate(.predicate,.name,.compOp,.value)
 | |
|  i error'="" QUIT error
 | |
|  i name'=name(1) QUIT $$queryError(9)
 | |
|  i value="" s value=$c(31)
 | |
|  s no=no+1
 | |
|  s name(no)=name,compOp(no)=compOp,value(no)=value
 | |
|  QUIT ""
 | |
|  ;
 | |
| parsePredicate(predicate,name,compOp,value)
 | |
|  n c1,cx,error
 | |
|  ;
 | |
|  ;d trace("in parsePredicate - predicate="_predicate)
 | |
|  s predicate=$$stripSpaces(predicate)
 | |
|  s c1=$e(predicate,1)
 | |
|  ;d trace("c1="_c1)
 | |
|  i c1'="'" QUIT $$queryError(10)
 | |
|  s cx=$e(predicate,$l(predicate))
 | |
|  ;d trace("cx="_cx)
 | |
|  i cx'="'",cx'="""" QUIT $$queryError(11)
 | |
|  ;d trace("passed 1")
 | |
|  ;d trace("111 predicate="_predicate)
 | |
|  s error=$$getIdentifier(.predicate,.name)
 | |
|  ;d trace("name="_name)
 | |
|  i error'="" QUIT error
 | |
|  i name="" QUIT $$queryError(13)
 | |
|  s error=$$getCompOp(.predicate,.compOp)
 | |
|  i error'="" QUIT error
 | |
|  ;d trace("222 predicate="_predicate)
 | |
|  s error=$$getIdentifier(.predicate,.value)
 | |
|  ;d trace("222 value="_value)
 | |
|  i value="" s value=$c(31)
 | |
|  i error'="",compOp="starts-with",value="" s error=""
 | |
|  QUIT error
 | |
|  ;
 | |
| getIdentifier(predicate,identifier)
 | |
|  ;
 | |
|  n c,c1,cx,error,escaped,i
 | |
|  ;
 | |
|  s error=""
 | |
|  s identifier=""
 | |
|  s escaped=0
 | |
|  s c1=$e(predicate,1)
 | |
|  ;d trace("in getIdentifier: c1="_c1)
 | |
|  i c1'="'",c1'="""" QUIT $$queryError(12)
 | |
|  s cx=c1
 | |
|  f i=2:1:$l(predicate) d  q:identifier'=""
 | |
|  . s c=$e(predicate,i)
 | |
|  . i c="\",'escaped s escaped=1 q
 | |
|  . i 'escaped,c=cx d  q
 | |
|  . . s identifier=$e(predicate,2,i-1)
 | |
|  . . s predicate=$e(predicate,i+1,$l(predicate))
 | |
|  . . s predicate=$$stripSpaces(predicate)
 | |
|  . i escaped s escaped=0
 | |
|  i identifier["\\" d
 | |
|  . s identifier=$$replaceAll(identifier,"\\",$c(5))
 | |
|  . s identifier=$$replaceAll(identifier,$c(5),"\")
 | |
|  ;d trace("predicate="_predicate_"; identifier="_identifier)
 | |
|  ;i identifier="" QUIT $$queryError(13)
 | |
|  QUIT error
 | |
|  ;
 | |
| getCompOp(predicate,compOp)
 | |
|  ;
 | |
|  n error
 | |
|  ;
 | |
|  s error=""
 | |
|  i $e(predicate,1)="=" d  QUIT ""
 | |
|  . s compOp="="
 | |
|  . s predicate=$e(predicate,2,$l(predicate))
 | |
|  . s predicate=$$stripSpaces(predicate)
 | |
|  i $e(predicate,1,2)="<=" d  QUIT ""
 | |
|  . s compOp="<="
 | |
|  . s predicate=$e(predicate,3,$l(predicate))
 | |
|  . s predicate=$$stripSpaces(predicate)
 | |
|  i $e(predicate,1,2)=">=" d  QUIT ""
 | |
|  . s compOp=">="
 | |
|  . s predicate=$e(predicate,3,$l(predicate))
 | |
|  . s predicate=$$stripSpaces(predicate)
 | |
|  i $e(predicate,1,2)="!=" d  QUIT ""
 | |
|  . s compOp="!="
 | |
|  . s predicate=$e(predicate,3,$l(predicate))
 | |
|  . s predicate=$$stripSpaces(predicate)
 | |
|  i $e(predicate,1)="<" d  QUIT ""
 | |
|  . s compOp="<"
 | |
|  . s predicate=$e(predicate,2,$l(predicate))
 | |
|  . s predicate=$$stripSpaces(predicate)
 | |
|  i $e(predicate,1)=">" d  QUIT ""
 | |
|  . s compOp=">"
 | |
|  . s predicate=$e(predicate,2,$l(predicate))
 | |
|  . s predicate=$$stripSpaces(predicate)
 | |
|  i $e(predicate,1,11)="starts-with" d  QUIT ""
 | |
|  . s compOp="starts-with"
 | |
|  . s predicate=$e(predicate,12,$l(predicate))
 | |
|  . s predicate=$$stripSpaces(predicate)
 | |
|  i $e(predicate,1,4)="like" d  QUIT ""
 | |
|  . s compOp="like"
 | |
|  . s predicate=$e(predicate,5,$l(predicate))
 | |
|  . s predicate=$$stripSpaces(predicate)
 | |
|  i $e(predicate,1,8)="not like" d  QUIT ""
 | |
|  . s compOp="notlike"
 | |
|  . s predicate=$e(predicate,9,$l(predicate))
 | |
|  . s predicate=$$stripSpaces(predicate)
 | |
|  i $e(predicate,1,19)="does-not-start-with" d  QUIT ""
 | |
|  . s compOp="does-not-start-with"
 | |
|  . s predicate=$e(predicate,20,$l(predicate))
 | |
|  . s predicate=$$stripSpaces(predicate)
 | |
|  i $e(predicate,1,6)="isNull" d  QUIT ""
 | |
|  . s compOp="isNull"
 | |
|  . s predicate=$e(predicate,7,$l(predicate))
 | |
|  . s predicate=$$stripSpaces(predicate)
 | |
|  i $e(predicate,1,9)="isNotNull" d  QUIT ""
 | |
|  . s compOp="isNotNull"
 | |
|  . s predicate=$e(predicate,10,$l(predicate))
 | |
|  . s predicate=$$stripSpaces(predicate)
 | |
|  QUIT $$queryError(14)
 | |
|  ;
 | |
| queryNot(query)
 | |
|  n not
 | |
|  s not=0
 | |
|  i $e(query,1,3)="not" d
 | |
|  . s not=1
 | |
|  . s query=$e(query,4,$l(query))
 | |
|  . s query=$$stripSpaces(query)
 | |
|  QUIT not
 | |
|  ;
 | |
| queryError(x)
 | |
|  i x=5 QUIT "InvalidSortExpression~Invalid sort expression. The sort attribute must be present in at least one of the predicates, and the predicate cannot contain the is null operator."
 | |
|  QUIT "InvalidQueryExpression~The specified query expression syntax is not valid ("_x_")"
 | |
|  ;
 | |
| not(itemList)
 | |
|  ;
 | |
|  n itemId,itemName,pos,selected
 | |
|  ;
 | |
|  s pos=""
 | |
|  f  s pos=$o(itemList(pos)) q:pos=""  d
 | |
|  . s itemName=itemList(pos)
 | |
|  . s itemId=$$getItemId(keyId,domainId,itemName)
 | |
|  . s selected(itemId)=""
 | |
|  k itemList
 | |
|  s itemId="",pos=0
 | |
|  f  s itemId=$o(^MDB(keyId,"domains",domainId,"items",itemId)) q:itemId=""  d
 | |
|  . i '$d(selected(itemId)) d
 | |
|  . . s pos=pos+1
 | |
|  . . s itemList(pos)=^MDB(keyId,"domains",domainId,"items",itemId)
 | |
|  ;
 | |
|  QUIT
 | |
|  ;
 | |
| executeQuery(keyId,domainId,no,name,compOp,value,relation,itemList)
 | |
|  ;
 | |
|  n attribId,expr,func,itemId,itemName,pos,stop,xvalue
 | |
|  ;
 | |
|  s attribId=""
 | |
|  ;d trace("xx keyId="_keyId_"; domainId="_domainId_"; name="_name_": no="_no)
 | |
|  i $g(name)'="" d
 | |
|  . i $e(name,1)="`",$e(name,$l(name))="`" s name=$e(name,2,$l(name)-1)
 | |
|  . i name["``" s name=$$replace(name,"``","`")
 | |
|  . s attribId=$$getAttributeId(keyId,domainId,name)
 | |
|  ;d trace("xx attribId="_attribId)
 | |
|  i attribId="",compOp'="isNull" QUIT
 | |
|  ;
 | |
|  ;d trace("name="_name_"; value="_value_"; compOp="_compOp)
 | |
|  i value[$c(1) s value=$tr(value,$c(1),"'")
 | |
|  i name[$c(1) s name=$tr(name,$c(1),"'")
 | |
|  i no=1,compOp="=" d  QUIT
 | |
|  . s pos=0,itemId=""
 | |
|  . f  s itemId=$o(^MDB(keyId,"domains",domainId,"queryIndex",attribId,value,itemId)) q:itemId=""  d
 | |
|  . . s pos=pos+1
 | |
|  . . s itemList(pos)=$g(^MDB(keyId,"domains",domainId,"items",itemId))
 | |
|  . . ;d trace(value_" found for itemId="_itemId)
 | |
|  ;
 | |
|  i no=1,compOp="!=" d  QUIT
 | |
|  . s xvalue="",pos=0
 | |
|  . f  s xvalue=$o(^MDB(keyId,"domains",domainId,"queryIndex",attribId,xvalue)) q:xvalue=""  d
 | |
|  . . i value=xvalue q
 | |
|  . . s itemId=""
 | |
|  . . f  s itemId=$o(^MDB(keyId,"domains",domainId,"queryIndex",attribId,xvalue,itemId)) q:itemId=""  d
 | |
|  . . . s pos=pos+1
 | |
|  . . . s itemList(pos)=$g(^MDB(keyId,"domains",domainId,"items",itemId))
 | |
|  ;
 | |
|  i no=1,compOp="<" d  QUIT
 | |
|  . s xvalue="",stop=0,pos=0
 | |
|  . f  s xvalue=$o(^MDB(keyId,"domains",domainId,"queryIndex",attribId,xvalue)) q:xvalue'<value  q:xvalue=""  d  q:stop
 | |
|  . . i $e(xvalue,1)'?1N s stop=1 q
 | |
|  . . s itemId=""
 | |
|  . . f  s itemId=$o(^MDB(keyId,"domains",domainId,"queryIndex",attribId,xvalue,itemId)) q:itemId=""  d
 | |
|  . . . s pos=pos+1
 | |
|  . . . s itemList(pos)=$g(^MDB(keyId,"domains",domainId,"items",itemId))
 | |
|  ;
 | |
|  i no=1,compOp="<=" d  QUIT
 | |
|  . s xvalue="",stop=0,pos=0
 | |
|  . f  s xvalue=$o(^MDB(keyId,"domains",domainId,"queryIndex",attribId,xvalue)) q:xvalue>value  q:xvalue=""  d  q:stop
 | |
|  . . i $e(xvalue,1)'?1N s stop=1 q
 | |
|  . . s itemId=""
 | |
|  . . f  s itemId=$o(^MDB(keyId,"domains",domainId,"queryIndex",attribId,xvalue,itemId)) q:itemId=""  d
 | |
|  . . . s pos=pos+1
 | |
|  . . . s itemList(pos)=$g(^MDB(keyId,"domains",domainId,"items",itemId))
 | |
|  ;
 | |
|  i no=1,compOp=">" d  QUIT
 | |
|  . s xvalue=value,stop=0,pos=0
 | |
|  . f  s xvalue=$o(^MDB(keyId,"domains",domainId,"queryIndex",attribId,xvalue)) q:xvalue=""  d  q:stop
 | |
|  . . i $e(xvalue,1)'?1N s stop=1 q
 | |
|  . . s itemId=""
 | |
|  . . f  s itemId=$o(^MDB(keyId,"domains",domainId,"queryIndex",attribId,xvalue,itemId)) q:itemId=""  d
 | |
|  . . . s pos=pos+1
 | |
|  . . . s itemList(pos)=$g(^MDB(keyId,"domains",domainId,"items",itemId))
 | |
|  ;
 | |
|  i no=1,compOp=">=" d  QUIT
 | |
|  . s xvalue=value-1,stop=0,pos=0
 | |
|  . f  s xvalue=$o(^MDB(keyId,"domains",domainId,"queryIndex",attribId,xvalue)) q:xvalue=""  d  q:stop
 | |
|  . . i $e(xvalue,1)'?1N s stop=1 q
 | |
|  . . s itemId=""
 | |
|  . . f  s itemId=$o(^MDB(keyId,"domains",domainId,"queryIndex",attribId,xvalue,itemId)) q:itemId=""  d
 | |
|  . . . s pos=pos+1
 | |
|  . . . s itemList(pos)=$g(^MDB(keyId,"domains",domainId,"items",itemId))
 | |
|  ;
 | |
|  i no=1,compOp="isNull" d  QUIT
 | |
|  . s itemId="",pos=0
 | |
|  . f  s itemId=$o(^MDB(keyId,"domains",domainId,"items",itemId)) q:itemId=""  d
 | |
|  . . i attribId'="",$d(^MDB(keyId,"domains",domainId,"items",itemId,"attribs",attribId)) q
 | |
|  . . s pos=pos+1
 | |
|  . . s itemList(pos)=$g(^MDB(keyId,"domains",domainId,"items",itemId))
 | |
|  ;
 | |
|  i no=1,compOp="isNotNull" d  QUIT
 | |
|  . s itemId="",pos=0
 | |
|  . f  s itemId=$o(^MDB(keyId,"domains",domainId,"items",itemId)) q:itemId=""  d
 | |
|  . . i '$d(^MDB(keyId,"domains",domainId,"items",itemId,"attribs",attribId)) q
 | |
|  . . s pos=pos+1
 | |
|  . . s itemList(pos)=$g(^MDB(keyId,"domains",domainId,"items",itemId))
 | |
|  ;
 | |
|  . f  s xvalue=$o(^MDB(keyId,"domains",domainId,"queryIndex",attribId,xvalue)) q:xvalue=""  d
 | |
|  . . i $e(xvalue,1,len)=value q
 | |
|  . . s itemId=""
 | |
|  . . f  s itemId=$o(^MDB(keyId,"domains",domainId,"queryIndex",attribId,xvalue,itemId)) q:itemId=""  d
 | |
|  . . . s pos=pos+1
 | |
|  . . . s itemList(pos)=$g(^MDB(keyId,"domains",domainId,"items",itemId))
 | |
|  ;
 | |
|  i no=1,compOp="like" d
 | |
|  . i value["\%" s value=$$replaceAll(value,"\%",$c(6))
 | |
|  . i $e(value,1)="%",$e(value,$l(value))="%" d  q
 | |
|  . . s value=$e(value,2,$l(value)-1)
 | |
|  . . s compOp="contains"
 | |
|  . i $e(value,$l(value))="%" d  q
 | |
|  . . s value=$e(value,1,$l(value)-1)
 | |
|  . . s compOp="starts-with"
 | |
|  . i $e(value,1)="%" d  q
 | |
|  . . s value=$e(value,2,$l(value))
 | |
|  . . s compOp="ends-with"
 | |
|  i no=1,compOp="notlike" d
 | |
|  . i value["\%" s value=$$replaceAll(value,"\%",$c(6))
 | |
|  . i $e(value,1)="%",$e(value,$l(value))="%" d  q
 | |
|  . . s value=$e(value,2,$l(value)-1)
 | |
|  . . s compOp="does-not-contain"
 | |
|  . i $e(value,$l(value))="%" d  q
 | |
|  . . s value=$e(value,1,$l(value)-1)
 | |
|  . . s compOp="does-not-start-with"
 | |
|  . i $e(value,1)="%" d  q
 | |
|  . . s value=$e(value,2,$l(value))
 | |
|  . . s compOp="does-not-end-with"
 | |
|  . ;s compOp="does-not-start-with"
 | |
|  . ;i $e(value,$l(value))="%" s value=$e(value,1,$l(value)-1)
 | |
|  i no=1 s value=$$replaceAll(value,$c(6),"%")
 | |
|  i no=1,compOp="starts-with" d  QUIT
 | |
|  . i value=$c(31) s value=""
 | |
|  . i $l(value)=1 d
 | |
|  . . s xvalue=$c($a(value)-1)
 | |
|  . e  d
 | |
|  . . n c
 | |
|  . . q:value=""
 | |
|  . . s c=$e(value,$l(value))
 | |
|  . . s c=$c($a(c)-1)
 | |
|  . . s xvalue=$e(value,1,$l(value)-1)_c
 | |
|  . s stop=0,pos=0
 | |
|  . i value?1N.N d
 | |
|  . . n len
 | |
|  . . s xvalue=value-1
 | |
|  . . s len=$l(value)
 | |
|  . . f  s xvalue=$o(^MDB(keyId,"domains",domainId,"queryIndex",attribId,xvalue)) q:xvalue=""  d
 | |
|  . . . i $e(xvalue,1,len)'=value q
 | |
|  . . . s itemId=""
 | |
|  . . . f  s itemId=$o(^MDB(keyId,"domains",domainId,"queryIndex",attribId,xvalue,itemId)) q:itemId=""  d
 | |
|  . . . . s pos=pos+1
 | |
|  . . . . s itemList(pos)=$g(^MDB(keyId,"domains",domainId,"items",itemId))
 | |
|  . e  d
 | |
|  . . n len
 | |
|  . . i value'="" d
 | |
|  . . . s xvalue=xvalue_"~"
 | |
|  . . . s len=$l(value)
 | |
|  . . e  d
 | |
|  . . . s xvalue=""
 | |
|  . . f  s xvalue=$o(^MDB(keyId,"domains",domainId,"queryIndex",attribId,xvalue)) q:xvalue=""  d  q:stop
 | |
|  . . . i value'="",$e(xvalue,1,len)'=value s stop=1 q
 | |
|  . . . s itemId=""
 | |
|  . . . f  s itemId=$o(^MDB(keyId,"domains",domainId,"queryIndex",attribId,xvalue,itemId)) q:itemId=""  d
 | |
|  . . . . s pos=pos+1
 | |
|  . . . . s itemList(pos)=$g(^MDB(keyId,"domains",domainId,"items",itemId))
 | |
|  ;
 | |
|  i no=1,compOp="does-not-start-with" d  QUIT
 | |
|  . n len
 | |
|  . i value=$c(31) q
 | |
|  . s xvalue="",len=$l(value),pos=0
 | |
|  . f  s xvalue=$o(^MDB(keyId,"domains",domainId,"queryIndex",attribId,xvalue)) q:xvalue=""  d
 | |
|  . . i $e(xvalue,1,len)=value q
 | |
|  . . s itemId=""
 | |
|  . . f  s itemId=$o(^MDB(keyId,"domains",domainId,"queryIndex",attribId,xvalue,itemId)) q:itemId=""  d
 | |
|  . . . s pos=pos+1
 | |
|  . . . s itemList(pos)=$g(^MDB(keyId,"domains",domainId,"items",itemId))
 | |
|  ;
 | |
|  i no=1,compOp="contains" d  QUIT
 | |
|  . n len
 | |
|  . i value=$c(31) q
 | |
|  . s xvalue="",pos=0
 | |
|  . f  s xvalue=$o(^MDB(keyId,"domains",domainId,"queryIndex",attribId,xvalue)) q:xvalue=""  d
 | |
|  . . i xvalue'[value q
 | |
|  . . s itemId=""
 | |
|  . . f  s itemId=$o(^MDB(keyId,"domains",domainId,"queryIndex",attribId,xvalue,itemId)) q:itemId=""  d
 | |
|  . . . s pos=pos+1
 | |
|  . . . s itemList(pos)=$g(^MDB(keyId,"domains",domainId,"items",itemId))
 | |
|  ;
 | |
|  i no=1,compOp="does-not-contain" d  QUIT
 | |
|  . n len
 | |
|  . i value=$c(31) q
 | |
|  . s xvalue="",pos=0
 | |
|  . f  s xvalue=$o(^MDB(keyId,"domains",domainId,"queryIndex",attribId,xvalue)) q:xvalue=""  d
 | |
|  . . i xvalue[value q
 | |
|  . . s itemId=""
 | |
|  . . f  s itemId=$o(^MDB(keyId,"domains",domainId,"queryIndex",attribId,xvalue,itemId)) q:itemId=""  d
 | |
|  . . . s pos=pos+1
 | |
|  . . . s itemList(pos)=$g(^MDB(keyId,"domains",domainId,"items",itemId))
 | |
|  ;
 | |
|  i no=1,compOp="ends-with" d  QUIT
 | |
|  . n len,xend,xlen
 | |
|  . i value=$c(31) q
 | |
|  . s xvalue="",len=$l(value),pos=0
 | |
|  . f  s xvalue=$o(^MDB(keyId,"domains",domainId,"queryIndex",attribId,xvalue)) q:xvalue=""  d
 | |
|  . . s xlen=$l(xvalue)
 | |
|  . . s xend=$e(xvalue,(xlen-len+1),xlen)
 | |
|  . . i xend'=value q
 | |
|  . . s itemId=""
 | |
|  . . f  s itemId=$o(^MDB(keyId,"domains",domainId,"queryIndex",attribId,xvalue,itemId)) q:itemId=""  d
 | |
|  . . . s pos=pos+1
 | |
|  . . . s itemList(pos)=$g(^MDB(keyId,"domains",domainId,"items",itemId))
 | |
|  ;
 | |
|  i no=1,compOp="does-not-end-with" d  QUIT
 | |
|  . n len,xend,xlen
 | |
|  . i value=$c(31) q
 | |
|  . s xvalue="",len=$l(value),pos=0
 | |
|  . f  s xvalue=$o(^MDB(keyId,"domains",domainId,"queryIndex",attribId,xvalue)) q:xvalue=""  d
 | |
|  . . s xlen=$l(xvalue)
 | |
|  . . s xend=$e(xvalue,(xlen-len+1),xlen)
 | |
|  . . i xend=value q
 | |
|  . . s itemId=""
 | |
|  . . f  s itemId=$o(^MDB(keyId,"domains",domainId,"queryIndex",attribId,xvalue,itemId)) q:itemId=""  d
 | |
|  . . . s pos=pos+1
 | |
|  . . . s itemList(pos)=$g(^MDB(keyId,"domains",domainId,"items",itemId))
 | |
|  ;
 | |
|  i no=1 QUIT
 | |
|  s expr=""
 | |
|  f i=1:1:no d
 | |
|  . i i>1 s expr=expr_relation(i)
 | |
|  . d
 | |
|  . . i compOp(i)="=" s func="equals" q
 | |
|  . . i compOp(i)="<" s func="lt" q
 | |
|  . . i compOp(i)=">" s func="gt" q
 | |
|  . . i compOp(i)="!=" s func="notEquals" q
 | |
|  . . i compOp(i)="<=" s func="le" q
 | |
|  . . i compOp(i)=">=" s func="ge" q
 | |
|  . . i compOp(i)="starts-with" s func="startsWith" q
 | |
|  . . i compOp(i)="notlike" d  q
 | |
|  . . . i $e(value(i),1)="%",$e(value(i),$l(value(i)))="%" d  q
 | |
|  . . . . s value(i)=$e(value(i),2,$l(value(i))-1)
 | |
|  . . . . s func="notContains"
 | |
|  . . . i $e(value(i),$l(value(i)))="%" d  q
 | |
|  . . . . s value(i)=$e(value(i),1,$l(value(i))-1)
 | |
|  . . . . s func="notStartsWith"
 | |
|  . . . i $e(value(i),1)="%" d  q
 | |
|  . . . . s value(i)=$e(value(i),2,$l(value(i)))
 | |
|  . . . . s func="notEndsWith"
 | |
|  . . . ;s func="notStartsWith"
 | |
|  . . . ;i $e(value(i),$l(value(i)))="%" s value(i)=$e(value(i),1,$l(value(i))-1)
 | |
|  . . i compOp(i)="like" d  q
 | |
|  . . . i $e(value(i),1)="%",$e(value(i),$l(value(i)))="%" d  q
 | |
|  . . . . s value(i)=$e(value(i),2,$l(value(i))-1)
 | |
|  . . . . s func="contains"
 | |
|  . . . i $e(value(i),$l(value(i)))="%" d  q
 | |
|  . . . . s value(i)=$e(value(i),1,$l(value(i))-1)
 | |
|  . . . . s func="startsWith"
 | |
|  . . . i $e(value(i),1)="%" d  q
 | |
|  . . . . s value(i)=$e(value(i),2,$l(value(i)))
 | |
|  . . . . s func="endsWith"
 | |
|  . . . ;s func="startsWith"
 | |
|  . . . ;i $e(value(i),$l(value(i)))="%" s value(i)=$e(value(i),1,$l(value(i))-1)
 | |
|  . . i compOp(i)="does-not-start-with" s func="notStartsWith"
 | |
|  . s value(i)=$$replaceAll(value(i),$c(6),"%")
 | |
|  . s expr=expr_"$$"_func_"(xvalue,"""_value(i)_""")"
 | |
|  . ;d trace("expr="_expr)
 | |
|  s xvalue=""
 | |
|  s attribId=$$getAttributeId(keyId,domainId,name(1))
 | |
|  s pos=0
 | |
|  f  s xvalue=$o(^MDB(keyId,"domains",domainId,"queryIndex",attribId,xvalue)) q:xvalue=""  d
 | |
|  . i @expr d
 | |
|  . . s itemId=""
 | |
|  . . f  s itemId=$o(^MDB(keyId,"domains",domainId,"queryIndex",attribId,xvalue,itemId)) q:itemId=""  d
 | |
|  . . . s pos=pos+1
 | |
|  . . . s itemList(pos)=$g(^MDB(keyId,"domains",domainId,"items",itemId)) 
 | |
|  QUIT
 | |
|  ;
 | |
| equals(indexValue,targetValue)
 | |
|  QUIT indexValue=targetValue
 | |
|  ;
 | |
| notEquals(indexValue,targetValue)
 | |
|  QUIT indexValue'=targetValue
 | |
|  ;
 | |
| lt(indexValue,targetValue)
 | |
|  i $e(indexValue,1)'?1N QUIT 0
 | |
|  QUIT indexValue<targetValue
 | |
|  ;
 | |
| gt(indexValue,targetValue)
 | |
|  i $e(indexValue,1)'?1N QUIT 0
 | |
|  QUIT indexValue>targetValue
 | |
|  ;
 | |
| le(indexValue,targetValue)
 | |
|  i $e(indexValue,1)'?1N QUIT 0
 | |
|  QUIT indexValue'>targetValue
 | |
|  ;
 | |
| ge(indexValue,targetValue)
 | |
|  i $e(indexValue,1)'?1N QUIT 0
 | |
|  QUIT indexValue'<targetValue
 | |
|  ;
 | |
| startsWith(index,targetValue)
 | |
|  QUIT $e(index,1,$l(targetValue))=targetValue
 | |
|  ;
 | |
| notStartsWith(index,targetValue)
 | |
|  QUIT $e(index,1,$l(targetValue))'=targetValue
 | |
|  ;
 | |
| contains(indexValue,targetValue)
 | |
|  QUIT indexValue[targetValue
 | |
|  ;
 | |
| notContains(indexValue,targetValue)
 | |
|  QUIT indexValue'[targetValue
 | |
|  ;
 | |
| endsWith(indexValue,targetValue)
 | |
|  n ilen,tlen,end
 | |
|  s ilen=$l(indexValue)
 | |
|  s tlen=$l(targetValue)
 | |
|  s end=$e(indexValue,(ilen-tlen+1),ilen)
 | |
|  QUIT end=targetValue
 | |
|  ;
 | |
| notEndsWith(indexValue,targetValue)
 | |
|  n ilen,tlen,end
 | |
|  s ilen=$l(indexValue)
 | |
|  s tlen=$l(targetValue)
 | |
|  s end=$e(indexValue,(ilen-tlen+1),ilen)
 | |
|  QUIT end'=targetValue
 | |
|  ;
 | |
| hex(number)
 | |
|  n hex,no,str
 | |
|  s hex=""
 | |
|  s str="123456789ABCDEF"
 | |
|  f  d  q:number=0
 | |
|  . s no=number#16
 | |
|  . s number=number\16
 | |
|  . i no s no=$e(str,no)
 | |
|  . s hex=no_hex
 | |
|  QUIT hex
 | |
|  ;
 | |
| hexDecode(hex)
 | |
|  QUIT $f("0123456789ABCDEF",hex)-2
 | |
|  
 | |
| hexToDecimal(hex)
 | |
|  ;
 | |
|  n i,num
 | |
|  s num=0
 | |
|  f i=1:1:$l(hex) d
 | |
|  . s num=num*16+$$hexDecode($e(hex,i))
 | |
|  QUIT num
 | |
|  ;
 | |
| urlDecode(string)
 | |
|  ;
 | |
|  n ascii,c,hex,pos
 | |
|  ;
 | |
|  i string["%25" s string=$$replaceAll(string,"%25",$c(1))
 | |
|  i string["+" s string=$$replaceAll(string,"+","%20")
 | |
|  f  q:string'["%"  d
 | |
|  . s pos=$f(string,"%")
 | |
|  . s c=$e(string,pos) s c=$zconvert(c,"l") i "0123456789abcdef"'[c s string=$$replace(string,"%",$c(1)) q
 | |
|  . s c=$e(string,pos+1) s c=$zconvert(c,"l") i "0123456789abcdef"'[c s string=$$replace(string,"%",$c(1)) q
 | |
|  . s hex=$e(string,pos,pos+1)
 | |
|  . i $l(hex)'=2 s string=$$replace(string,"%",$c(1)) q
 | |
|  . s ascii=$$hexToDecimal(hex)
 | |
|  . s string=$e(string,1,pos-2)_$c(ascii)_$e(string,pos+2,$l(string))
 | |
|  i string[$c(1) s string=$$replaceAll(string,$c(1),"%")
 | |
|  QUIT string
 | |
|  ;
 | |
| urlEscape(string)
 | |
|  ;The unreserved characters are A-Z, a-z, 0-9, hyphen ( - ), underscore ( _ ), period ( . ), and tilde ( ~ ). 
 | |
|  i string?1AN.AN QUIT string
 | |
|  n a,c,esc,i,pass
 | |
|  f i=45,46,95,126 s pass(i)=""
 | |
|  s esc=""
 | |
|  f i=1:1:$l(string) d
 | |
|  . s c=$e(string,i)
 | |
|  . i c?1AN s esc=esc_c q
 | |
|  . s a=$a(c)
 | |
|  . i $d(pass(a)) s esc=esc_c q
 | |
|  . s a=$$hex^MDB(a)
 | |
|  . s esc=esc_"%"_$zconvert(a,"u")
 | |
|  QUIT esc
 | |
|  ;
 | |
| installMDBX(requestId,boxUsage) ; Install M/DB:X Extensions
 | |
|  n error,startTime
 | |
|  s requestId=$$init(.startTime)
 | |
|  s error=""
 | |
|  i $t(MDBX^MDBX)'="" d
 | |
|  . d install^MDBX
 | |
|  e  d
 | |
|  . s error="The M/DB:X routine is not available.  Download and install it and try again"
 | |
|  i error'="" QUIT error
 | |
|  QUIT $$end(startTime,.boxUsage)
 | |
|  ;
 | |
| installMDBM(requestId,boxUsage) ; Install M/DB:M(umps) Extensions
 | |
|  n error,startTime
 | |
|  s requestId=$$init(.startTime)
 | |
|  s error=""
 | |
|  i $t(MDBMumps^MDBMumps)'="" d
 | |
|  . d install^MDBMumps
 | |
|  e  d
 | |
|  . s error="The M/DB:M routine is not available.  Download and install it and try again"
 | |
|  i error'="" QUIT error
 | |
|  QUIT $$end(startTime,.boxUsage)
 | |
|  ;
 | |
| initialise(requestId,boxUsage) ; Initialise the M/DB database
 | |
| 	n configFile,i,io,key,line,ok,secret,startTime,stop
 | |
| 	s requestId=$$init(.startTime)
 | |
| 	s io=$io
 | |
| 	s configFile="/usr/MDB/MDB.conf"
 | |
| 	c configFile
 | |
| 	o configFile:(readonly:exception="g configFileNotExists")
 | |
| 	u configFile
 | |
| 	s stop=0,key="",secret=""
 | |
| 	f i=1:1 r line d  q:stop
 | |
| 	. i $e(line,1)="#" q
 | |
| 	. i line["AdminstratorAccessKeyId"!(line["AdministratorAccessKeyId") d  q
 | |
| 	. . s key=$p(line,"=",2)
 | |
| 	. . s key=$$stripSpaces(key)
 | |
| 	. . s key=$$replaceAll(key,$c(9),"")
 | |
| 	. . i $e(key,1)="<" s key=""  ; user hasn't changed the explanatory text
 | |
| 	. i line["AdminstratorSecretKey"!(line["AdministratorSecretKey") d  q
 | |
| 	. . s secret=$p(line,"=",2)
 | |
| 	. . s secret=$$stripSpaces(secret)
 | |
| 	. . s secret=$$replaceAll(secret,$c(9),"")
 | |
| 	. . i $e(secret,1)="<" s secret=""  ; user hasn't changed the explanatory text
 | |
| 	. . s stop=1
 | |
| 	c configFile
 | |
| 	u io
 | |
| 	i key'="",secret'="" d  QUIT $$end(startTime,.boxUsage)
 | |
| 	. i $$createAdministrator^MDBConfig(key,secret)
 | |
| 	. i $$reset^MDBConfig(key,secret)
 | |
| 	QUIT "The contents of the Configuration File /usr/MDB/MDB.conf were invalid"
 | |
| 	;
 | |
| configFileNotExists	
 | |
| 	c configFile
 | |
| 	u io
 | |
| 	QUIT "Configuration File /usr/MDB/MDB.conf was not found"
 | |
| 	;
 | |
| initialisationResponse
 | |
| 	QUIT
 | |
| 	;
 | |
| decodeBase64(string)
 | |
|  ;
 | |
|  n b64,context
 | |
|  ;
 | |
|  i $zv["GT.M" d  QUIT b64
 | |
|  . s context=1
 | |
|  . i $d(^zewd("config","MGWSI")) s context=0
 | |
|  . s b64=$$DB64^%ZMGWSIS(string,context)
 | |
|  ;
 | |
|  QUIT $$b64Decode^MDBMCache(string)
 | |
|  ;
 | |
| encodeBase64(string)
 | |
|  ;
 | |
|  n b64,context
 | |
|  ;
 | |
|  i $zv["GT.M" d  QUIT b64
 | |
|  . s context=1
 | |
|  . i $d(^zewd("config","MGWSI")) s context=0
 | |
|  . s b64=$$B64^%ZMGWSIS(string,context)
 | |
|  ;
 | |
|  QUIT $$b64Encode^MDBMCache(string)
 | |
|  ;
 | |
| parseSelect(selectExpression,domainName,queryExpression,attributes,orderBy,limit)
 | |
|  ;select Ranking,Keyword from books where Title = 'The Right Stuff'
 | |
|  ;
 | |
|  n attributeList,error,no,p1
 | |
|  ;
 | |
|  ;d trace("in parseSelect - selectExpression="_selectExpression)
 | |
|  s error=""
 | |
|  s limit=""
 | |
|  s selectExpression=$$convertSubstringToLowerCase(selectExpression,"select ")
 | |
|  s selectExpression=$$convertSubstringToLowerCase(selectExpression," and ")
 | |
|  i selectExpression=$$stripSpaces(selectExpression)
 | |
|  i $e(selectExpression,1,7)'="select " QUIT $$invalid(1)
 | |
|  s selectExpression=$$convertSubstringToLowerCase(selectExpression," from ")
 | |
|  i selectExpression'[" from " QUIT $$invalid(3)
 | |
|  s selectExpression=$$convertSubstringToLowerCase(selectExpression,"count(*)")
 | |
|  s p1=$p(selectExpression,"select",2)
 | |
|  s attributeList=$p(p1,"from",1)
 | |
|  s attributeList=$$stripSpaces(attributeList)
 | |
|  i attributeList="" QUIT $$invalid(2)
 | |
|  i attributeList="*" d
 | |
|  . ; do nothing
 | |
|  e  i attributeList="count(*)" d
 | |
|  . s attributes="count(*)"
 | |
|  e  i attributeList'["," d
 | |
|  . s attributes(1)=attributeList
 | |
|  e  d
 | |
|  . f no=1:1 q:attributeList=""  d
 | |
|  . . s p1=$p(attributeList,",",1)
 | |
|  . . s attributeList=$p(attributeList,",",2,5000)
 | |
|  . . s p1=$$stripSpaces(p1)
 | |
|  . . s attributes(no)=p1
 | |
|  s p1=$p(selectExpression," from",2,1000)
 | |
|  s domainName=p1
 | |
|  s domainName=$$stripSpaces(domainName)
 | |
|  s domainName=$p(domainName," ",1)
 | |
|  i domainName="" QUIT $$invalid(4)
 | |
|  i $e(domainName,1)="`",$e(domainName,$l(domainName))="`" s domainName=$e(domainName,2,$l(domainName)-1)
 | |
|  s selectExpression=$p(selectExpression,domainName,2,5000)
 | |
|  s selectExpression=$$convertSubstringToLowerCase(selectExpression," where ")
 | |
|  s selectExpression=$$stripSpaces(selectExpression)
 | |
|  s selectExpression=$$convertSubstringToLowerCase(selectExpression,"order by")
 | |
|  s orderBy=""
 | |
|  i selectExpression["order by" d
 | |
|  . n attrName,dir
 | |
|  . s orderBy=$p(selectExpression,"order by",2)
 | |
|  . s orderBy=$$stripSpaces(orderBy)
 | |
|  . s orderBy=$$convertSubstringToLowerCase(orderBy," limit ")
 | |
|  . i orderBy[" limit " d
 | |
|  . . s limit=$p(orderBy," limit ",2)
 | |
|  . . s orderBy=$p(orderBy," limit ",1)
 | |
|  . s attrName=$p(orderBy," ",1)
 | |
|  . s dir=$p(orderBy," ",2)
 | |
|  . i dir="" s dir="asc"
 | |
|  . s orderBy="'"_attrName_"' "_dir
 | |
|  . s selectExpression=$p(selectExpression,"order by",1)
 | |
|  s selectExpression=$$convertSubstringToLowerCase(selectExpression," limit ")
 | |
|  i limit="",selectExpression["limit " d
 | |
|  . s limit=$p(selectExpression,"limit ",2)
 | |
|  . s selectExpression=$p(selectExpression,"limit ",1)
 | |
|  s selectExpression=$p(selectExpression,"where",2,1000)
 | |
|  s queryExpression=selectExpression
 | |
|  s queryExpression=$$stripSpaces(queryExpression)
 | |
|  ;
 | |
|  QUIT error
 | |
|  ;
 | |
| convertSubstringToLowerCase(string,subString)
 | |
|  ;
 | |
|  n lcString,newString,p1,pos,to1
 | |
|  ;
 | |
|  s lcString=$zconvert(string,"l")
 | |
|  s subString=$zconvert(subString,"l")
 | |
|  i lcString'[subString QUIT string
 | |
|  s p1=$p(lcString,subString,1)
 | |
|  s to1=$l(p1)
 | |
|  s pos=$f(lcString,subString)
 | |
|  s newString=$e(string,1,to1)_subString_$e(string,pos,$l(string))
 | |
|  ;
 | |
|  QUIT newString
 | |
|  ;
 | |
| inProc(queryExpression,expr,thisWord)
 | |
|  ;
 | |
|  n attrName,c,i,inValue,list,no,np,or,str,value
 | |
|  ;
 | |
|  i thisWord="in" s expr=expr_" "
 | |
|  s list=$p(queryExpression,")",1)
 | |
|  s queryExpression=$p(queryExpression,")",2,5000)
 | |
|  s inValue=0,no=0,str=""
 | |
|  f  q:list=""  d
 | |
|  . s c=$e(list,1),list=$e(list,2,$l(list))
 | |
|  . i c="'" d  q
 | |
|  . . s inValue='inValue
 | |
|  . . i inValue q
 | |
|  . . s no=no+1
 | |
|  . . s value(no)=str
 | |
|  . . s str=""
 | |
|  . i 'inValue q
 | |
|  . s str=str_c
 | |
|  s np=$l(expr," ")
 | |
|  s attrName=$p(expr," ",np-2)
 | |
|  s expr=$p(expr," ",1,np-3)
 | |
|  s or=""
 | |
|  f i=1:1:no d
 | |
|  . s expr=expr_or_attrName_" = '"_value(i)_"'"
 | |
|  . s or=" or "
 | |
|  QUIT
 | |
|  ;
 | |
| executeSelect(queryExpression,itemList,keyId,itemStack)
 | |
|  n c,error,expr,inAttr,lastWord,thisWord
 | |
|  i $g(^zewd("trace"))=1 d trace($h_": in executeSelect.  queryExpression="_queryExpression)
 | |
|  i queryExpression["''" d
 | |
|  . s queryExpression=$$replaceAll(queryExpression," '''"," '"_$c(2))
 | |
|  . s queryExpression=$$replaceAll(queryExpression,"='''","='"_$c(2))
 | |
|  . s queryExpression=$$replaceAll(queryExpression,"'''",$c(2)_"'")
 | |
|  . s queryExpression=$$replaceAll(queryExpression,"''",$c(2))
 | |
|  k itemList
 | |
|  s error=""
 | |
|  s inAttr=0,expr="",lastWord="",thisWord=""
 | |
|  f  q:queryExpression=""  d  q:c=")"
 | |
|  . s c=$e(queryExpression,1),queryExpression=$e(queryExpression,2,$l(queryExpression))
 | |
|  . i c="(" d  q
 | |
|  . . n rel
 | |
|  . . i thisWord="in"!(lastWord="in") d  q
 | |
|  . . . d inProc(.queryExpression,.expr,thisWord)
 | |
|  . . s error=$$executeSelect(.queryExpression,.itemList,keyId,.itemStack)
 | |
|  . . i error'="" s queryExpression="",expr="" q
 | |
|  . . s rel=$g(itemStack("rel"))
 | |
|  . . i '$d(itemStack("list")) d
 | |
|  . . . m itemStack("list")=itemList
 | |
|  . . e  d
 | |
|  . . . i rel="or" d
 | |
|  . . . . n index,itemNo,no,newList
 | |
|  . . . . s no=""
 | |
|  . . . . f  s no=$o(itemList(no)) q:no=""  d
 | |
|  . . . . . s itemNo=itemList(no)
 | |
|  . . . . . s index(itemNo)=""
 | |
|  . . . . s no=""
 | |
|  . . . . f  s no=$o(itemStack("list",no)) q:no=""  d
 | |
|  . . . . . s itemNo=itemStack("list",no)
 | |
|  . . . . . s index(itemNo)=""
 | |
|  . . . . s itemNo="",no=0
 | |
|  . . . . k itemStack
 | |
|  . . . . f  s itemNo=$o(index(itemNo)) q:itemNo=""  d
 | |
|  . . . . . s no=no+1
 | |
|  . . . . . s itemStack("list",no)=itemNo
 | |
|  . . . i rel="and" d
 | |
|  . . . . n index,itemNo,no,newList
 | |
|  . . . . s no=""
 | |
|  . . . . f  s no=$o(itemList(no)) q:no=""  d
 | |
|  . . . . . s itemNo=itemList(no)
 | |
|  . . . . . s index(itemNo)=""
 | |
|  . . . . s no=""
 | |
|  . . . . f  s no=$o(itemStack("list",no)) q:no=""  d
 | |
|  . . . . . s itemNo=itemStack("list",no)
 | |
|  . . . . . i $d(index(itemNo)) s newList(itemNo)=""
 | |
|  . . . . s itemNo="",no=0
 | |
|  . . . . k itemStack
 | |
|  . . . . f  s itemNo=$o(newList(itemNo)) q:itemNo=""  d
 | |
|  . . . . . s no=no+1
 | |
|  . . . . . s itemStack("list",no)=itemNo
 | |
|  . . s queryExpression=$$stripSpaces(queryExpression)
 | |
|  . . s rel=$p(queryExpression," ",1)
 | |
|  . . s queryExpression=$p(queryExpression," ",2,5000)
 | |
|  . . s queryExpression=$$stripSpaces(queryExpression)
 | |
|  . . i queryExpression'="",$e(queryExpression,1)'="(" s queryExpression="("_queryExpression_")"
 | |
|  . . s itemStack("rel")=rel
 | |
|  . i c=")" d  quit  ; pop
 | |
|  . . k itemList
 | |
|  . i expr="",c=" " q
 | |
|  . i expr="" s inAttr=1,expr="'",thisWord=expr
 | |
|  . i 'inAttr d
 | |
|  . . n stop
 | |
|  . . s stop=0
 | |
|  . . i lastWord="and",expr["between" d  q:stop
 | |
|  . . . n np
 | |
|  . . . s np=$l(expr," ")
 | |
|  . . . i $p(expr," ",np-3)="between" d
 | |
|  . . . . n p1
 | |
|  . . . . s stop=1
 | |
|  . . . . s p1=$p(expr," ",1,np-4)_" >= "
 | |
|  . . . . s p1=p1_$p(expr," ",np-2)_" and "_$p(expr," ",np-4)_" <= "
 | |
|  . . . . s expr=p1
 | |
|  . . . . s lastWord="<="
 | |
|  . . i lastWord="and" s inAttr=1,expr=expr_"'",thisWord="'"
 | |
|  . . i lastWord="or" s inAttr=1,expr=expr_"'",thisWord="'"
 | |
|  . . i lastWord="union" s inAttr=1,expr=expr_"'",thisWord="'"
 | |
|  . . i lastWord="intersection" s inAttr=1,expr=expr_"'",thisWord="'"
 | |
|  . i inAttr,c="=" d
 | |
|  . . s c=" "
 | |
|  . . i $e(queryExpression,1)'=" " s queryExpression=" "_queryExpression
 | |
|  . . s queryExpression="="_queryExpression
 | |
|  . i c'=" " d  q
 | |
|  . . s thisWord=thisWord_c
 | |
|  . . s expr=expr_c
 | |
|  . i inAttr d
 | |
|  . . s expr=expr_"'"
 | |
|  . . s thisWord=thisWord_"'"
 | |
|  . . s inAttr=0
 | |
|  . s expr=expr_c
 | |
|  . s lastWord=thisWord
 | |
|  . s thisWord=""
 | |
|  . i lastWord="is" d
 | |
|  . . i $e(queryExpression,1,4)="null" d
 | |
|  . . . s lastWord="isNull"
 | |
|  . . . s expr=$e(expr,1,$l(expr)-3)_"isNull "
 | |
|  . . . s queryExpression="'null'"_$e(queryExpression,5,$l(queryExpression))
 | |
|  . . i $e(queryExpression,1,8)="not null" d
 | |
|  . . . s lastWord="isNotNull"
 | |
|  . . . s expr=$e(expr,1,$l(expr)-3)_"isNotNull "
 | |
|  . . . s queryExpression="'null'"_$e(queryExpression,9,$l(queryExpression))
 | |
|  i expr'="" d
 | |
|  . n i,name,np,offset,prevName,rel,term
 | |
|  . s expr=$$escVals(expr)
 | |
|  . s np=$l(expr," ")
 | |
|  . i np>3 d
 | |
|  . . n diffNames,name
 | |
|  . . f i=1:1:np s term(i)=$p(expr," ",i)
 | |
|  . . s offset=4
 | |
|  . . s diffNames=0
 | |
|  . . s name=term(1)
 | |
|  . . f i=1:offset q:'$d(term(i))  d  q:diffNames
 | |
|  . . . i term(i)'=name s diffNames=1 q
 | |
|  . . . i $g(term(i+3))="intersection" s diffNames=1 q
 | |
|  . . . i $g(term(i+3))="union" s diffNames=1 q
 | |
|  . . i diffNames d
 | |
|  . . . s expr="["_term(1)_" "_term(2)_" "_term(3)
 | |
|  . . . f  d  q:'$d(term(offset+1))
 | |
|  . . . . s name=term(offset+1)
 | |
|  . . . . s rel=term(offset)
 | |
|  . . . . i rel="and"!(rel="intersection") d
 | |
|  . . . . . s expr=expr_"] intersection ["
 | |
|  . . . . i rel="or"!(rel="union") d
 | |
|  . . . . . s expr=expr_"] union ["
 | |
|  . . . . s expr=expr_term(offset+1)_" "_term(offset+2)_" "_term(offset+3)
 | |
|  . . . . s offset=offset+4
 | |
|  . . . s expr=expr_"]"
 | |
|  . . e  d
 | |
|  . . . s expr="["_expr_"]"
 | |
|  . e  d
 | |
|  . . s expr="["_expr_"]"
 | |
|  . k itemList
 | |
|  . s expr=$tr(expr,$c(1)," ")
 | |
|  . i $g(orderBy)'="" s expr=expr_" sort "_orderBy
 | |
|  . s error=$$runQuery(keyId,domainName,expr,,.itemList)
 | |
|  QUIT error
 | |
|  ;
 | |
| escVals(expr)
 | |
|  ;
 | |
|  n c,inValue,no,str
 | |
|  ;
 | |
|  s inValue=0,no=0,str=""
 | |
|  f  q:expr=""  d
 | |
|  . s c=$e(expr,1),expr=$e(expr,2,$l(expr))
 | |
|  . i c="'" d  q
 | |
|  . . s inValue='inValue
 | |
|  . . s str=str_c
 | |
|  . i 'inValue s str=str_c q
 | |
|  . i c=" " s c=$c(1)
 | |
|  . s str=str_c
 | |
|  QUIT str
 | |
|  ;
 | |
| invalid(x)
 | |
|  QUIT "InvalidQueryExpression~The specified query expression syntax is not valid. ("_x_")"
 | |
|  ;
 | |
| runSelect(keyId,query,itemList,attributes,domainName)
 | |
|  ;
 | |
|  n error,limit,orderBy,queryExpression
 | |
|  ;
 | |
|  ;d trace("in runSelect: query="_query)
 | |
|  s error=$$parseSelect(query,.domainName,.queryExpression,.attributes,.orderBy,.limit)
 | |
|  i $g(^zewd("trace"))=1 d trace($h_": completed parseSelect: queryExpression="_$g(queryExpression))
 | |
|  i error'="" QUIT error
 | |
|  i queryExpression="" d
 | |
|  . i orderBy'="" d
 | |
|  . . s error=$$invalid(5)
 | |
|  . e  d
 | |
|  . . s error=$$runQuery(keyId,domainName,"",,.itemList)
 | |
|  e  d
 | |
|  . i queryExpression["itemName()" s queryExpression=$$replaceAll(queryExpression,"itemName()","itemName{}")
 | |
|  . s error=$$executeSelect(queryExpression,.itemList,keyId,.itemStack)
 | |
|  . i $g(^zewd("trace"))=1 d trace($h_": finished executeSelect and returned to runSelect")
 | |
|  ;***
 | |
|  i $d(itemStack("list")) k itemList m itemList=itemStack("list")
 | |
|  ;***
 | |
|  i limit>0 d
 | |
|  . n count,listCopy,no,stop
 | |
|  . s count=0,no="",stop=0
 | |
|  . f  s no=$o(itemList(no)) q:no=""  d  q:stop
 | |
|  . . s count=count+1
 | |
|  . . i count>limit s stop=1 q
 | |
|  . . s listCopy(no)=itemList(no)
 | |
|  . k itemList
 | |
|  . m itemList=listCopy
 | |
|  QUIT error
 | |
|  ;
 | |
| numeric(value)
 | |
|  i $e(value,1)=0,$l(value)>1 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
 | |
|  QUIT 0
 | |
|  ; 
 | |
| escape(value)
 | |
|  i value["&" s value=$$replaceAll(value,"&","&")
 | |
|  i value["<" s value=$$replaceAll(value,"<","<")
 | |
|  i value[">" s value=$$replaceAll(value,">",">")
 | |
|  QUIT value
 | |
|  ;
 | |
| externalSelect(keyId,selectExpression) ;
 | |
|  ;
 | |
|  n attributes,count,domainName,error,itemList,itemsAndAttrs,json,pos
 | |
|  ;
 | |
|  i $g(^zewd("trace"))=1 d trace("in externalSelect - keyId = "_keyId_": select="_selectExpression)
 | |
|  s error=$$runSelect(keyId,selectExpression,.itemList,.attributes,.domainName)
 | |
|  i error'="" d  QUIT json
 | |
|  . s json="{""error"":{""errorCode"":"""_$p(error,"~",1)_""",""errorMessage"":"""_$p(error,"~",2)_"""}}"
 | |
|  i $g(attributes)="count(*)" d
 | |
|  . n count,pos
 | |
|  . s itemsAndAttrs(1,"i")="Domain"
 | |
|  . s itemsAndAttrs(1,"a",1,"n")="Count"
 | |
|  . s pos="",count=0
 | |
|  . f  s pos=$o(itemList(pos)) q:pos=""  s count=count+1
 | |
|  . s itemsAndAttrs(1,"a",1,"v",1)=count
 | |
|  e  d
 | |
|  . n attribs,attribArray,ex,itemName,no,rx,bx,val,vno
 | |
|  . s pos=""
 | |
|  . f  s pos=$o(itemList(pos)) q:pos=""  d
 | |
|  . . s itemName=itemList(pos)
 | |
|  . . k attribs,attribArray
 | |
|  . . m attribs=attributes
 | |
|  . . s ex=$$getAttributes(keyId,domainName,itemName,.attribs,.rx,.bx,1)
 | |
|  . . s no=""
 | |
|  . . f  s no=$o(attribs(no)) q:no=""  d
 | |
|  . . . s attribArray(no,"n")=$g(attribs(no))
 | |
|  . . . s vno=""
 | |
|  . . . f  s vno=$o(attribs(no,"value",vno)) q:vno=""  d
 | |
|  . . . . s val=attribs(no,"value",vno)
 | |
|  . . . . ;s val=$$replaceAll(val,"""","\""")
 | |
|  . . . . s val=$$replaceAll(val,"\","\\")
 | |
|  . . . . s attribArray(no,"v",vno)=val
 | |
|  . . m itemsAndAttrs(pos,"a")=attribArray
 | |
|  . . s itemsAndAttrs(pos,"i")=itemName
 | |
|  s pos="",count=0
 | |
|  f  s pos=$o(itemsAndAttrs(pos)) q:pos=""  s count=count+1
 | |
|  i count=1 d
 | |
|  . n array
 | |
|  . m array=itemsAndAttrs(1)
 | |
|  . ;m ^rob=array
 | |
|  . s json=$$arrayToJSON^zmwire("array")
 | |
|  . s json="["_json_"]"
 | |
|  e  d
 | |
|  . s json=$$arrayToJSON^zmwire("itemsAndAttrs")
 | |
|  i $g(^zewd("trace"))=1 d trace("json="_json)
 | |
|  QUIT json
 | |
|  ;
 | |
| 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
 | |
|  ;
 | |
| 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
 | |
|  ;
 | |
| 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
 | |
|  ;
 | |
| test
 | |
|  s select="select * from testing where attr3 = 'control'"
 | |
|  s key="rob"
 | |
|  s ok=$$externalSelect^MDB(key,select)
 | |
|  QUIT
 | |
|  ;
 |