Created
April 20, 2014 06:52
-
-
Save daimor/11107056 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?xml version="1.0" encoding="UTF-8"?> | |
<Export generator="Cache" version="25"> | |
<Class name="%CDEV.JSON.Base"> | |
<Abstract>1</Abstract> | |
<Super>%Library.RegisteredObject</Super> | |
<TimeCreated>63290,83008.228357</TimeCreated> | |
<Method name="%WriteJSON"> | |
</Method> | |
<Method name="%WriteJSONString"> | |
<ClassMethod>1</ClassMethod> | |
<FormalSpec>x:%String</FormalSpec> | |
<Implementation><![CDATA[ | |
try { | |
w $zcvt(x, "O", "JSON") | |
} catch { | |
w $replace($replace($zcvt(x, "O", "JS"), "\/", "/"), "\'", "'") | |
} | |
]]></Implementation> | |
</Method> | |
</Class> | |
<Class name="%CDEV.JSON.Boolean"> | |
<Super>Base</Super> | |
<TimeCreated>63290,83008.67636</TimeCreated> | |
<Property name="%data"> | |
<Type>%String</Type> | |
<Internal>1</Internal> | |
</Property> | |
<Method name="%OnNew"> | |
<FormalSpec>data</FormalSpec> | |
<ReturnType>%Status</ReturnType> | |
<Implementation><![CDATA[ | |
s %data = data | |
q $$$OK | |
]]></Implementation> | |
</Method> | |
<Method name="%WriteJSON"> | |
<Implementation><![CDATA[ w $s(%data: "true", 1: "false") | |
]]></Implementation> | |
</Method> | |
</Class> | |
<Class name="%CDEV.JSON.List"> | |
<Super>Base</Super> | |
<TimeCreated>63290,83008.964801</TimeCreated> | |
<Property name="%data"> | |
<Type>%ZEN.Datatype.string</Type> | |
<Internal>1</Internal> | |
<MultiDimensional>1</MultiDimensional> | |
<Parameter name="XMLPROJECTION" value="NONE"/> | |
</Property> | |
<Method name="%WriteJSON"> | |
<Implementation><![CDATA[ | |
w "[" | |
f i=0:1:..Count()-1 | |
{ | |
s x = ..Get(i) | |
i $isobject(x) | |
{ | |
d x.%WriteJSON() | |
} else { | |
w """" | |
d ..%WriteJSONString(x) | |
w """" | |
} | |
w:..Count()>(i+1) "," | |
} | |
w "]" | |
]]></Implementation> | |
</Method> | |
<Method name="Create"> | |
<Internal>1</Internal> | |
<ClassMethod>1</ClassMethod> | |
<FormalSpec>data...</FormalSpec> | |
<ReturnType>List</ReturnType> | |
<Implementation><![CDATA[ | |
s x = ##class(List).%New() | |
d x.OnCreate(data...) | |
q x | |
]]></Implementation> | |
</Method> | |
<Method name="OnCreate"> | |
<Internal>1</Internal> | |
<FormalSpec>data...</FormalSpec> | |
<Implementation><![CDATA[ m ..%data = data | |
]]></Implementation> | |
</Method> | |
<Method name="Get"> | |
<FormalSpec>index:%Integer</FormalSpec> | |
<ReturnType>%String</ReturnType> | |
<Implementation><![CDATA[ | |
s trueStart = $o(..%data("")) | |
s trueEnd = $o(..%data(""), -1) | |
s trueIndex = $s(index >= 0: trueStart + index, 1: trueEnd + (index+1)) | |
q ..%data(trueIndex) | |
]]></Implementation> | |
</Method> | |
<Method name="Slice"> | |
<FormalSpec>start="",end=""</FormalSpec> | |
<ReturnType>List</ReturnType> | |
<Implementation><![CDATA[ | |
s trueStart = $o(..%data("")) | |
s trueEnd = $o(..%data(""), -1) | |
s startIndex = $s(start = "": trueStart, start >= 0: trueStart + start, 1: trueEnd + start + 1) | |
s endIndex = $s(end = "": trueEnd, end >= 0: trueStart + end - 1, 1: trueEnd + end) | |
f i=startIndex:1:endIndex | |
{ | |
s x($i(x)) = ..%data(i) | |
} | |
q ##class(List).Create(x...) | |
]]></Implementation> | |
</Method> | |
<Method name="Append"> | |
<FormalSpec>value:%String</FormalSpec> | |
<Implementation><![CDATA[ d ..Add(value, -1) | |
]]></Implementation> | |
</Method> | |
<Method name="Prepend"> | |
<FormalSpec>value:%String</FormalSpec> | |
<Implementation><![CDATA[ d ..Add(value, 1) | |
]]></Implementation> | |
</Method> | |
<Method name="PopBack"> | |
<ReturnType>%String</ReturnType> | |
<Implementation><![CDATA[ q ..Pop(-1) | |
]]></Implementation> | |
</Method> | |
<Method name="PopFront"> | |
<ReturnType>%String</ReturnType> | |
<Implementation><![CDATA[ q ..Pop(1) | |
]]></Implementation> | |
</Method> | |
<Method name="Count"> | |
<ReturnType>%Integer</ReturnType> | |
<Implementation><![CDATA[ q ..%data | |
]]></Implementation> | |
</Method> | |
<Method name="Add"> | |
<Internal>1</Internal> | |
<FormalSpec>value:%String,order</FormalSpec> | |
<Implementation><![CDATA[ | |
s index = $o(..%data(""), order) | |
s:index="" index = order | |
s ..%data(index-order) = value | |
s ..%data = $i(..%data) | |
]]></Implementation> | |
</Method> | |
<Method name="Pop"> | |
<Internal>1</Internal> | |
<FormalSpec>order</FormalSpec> | |
<ReturnType>%String</ReturnType> | |
<Implementation><![CDATA[ | |
s lastIndex = $o(..%data(""), order) | |
s x = ..%data(lastIndex) | |
k ..%data(lastIndex) | |
s ..%data = $i(..%data, -1) | |
q x | |
]]></Implementation> | |
</Method> | |
</Class> | |
<Class name="%CDEV.JSON.Null"> | |
<Super>Base</Super> | |
<TimeCreated>63290,83009.219996</TimeCreated> | |
<Method name="%WriteJSON"> | |
<Implementation><![CDATA[ w "null" | |
]]></Implementation> | |
</Method> | |
</Class> | |
<Class name="%CDEV.JSON.Number"> | |
<Super>Base</Super> | |
<TimeCreated>63290,83009.427167</TimeCreated> | |
<Property name="%data"> | |
<Type>%String</Type> | |
<Internal>1</Internal> | |
</Property> | |
<Method name="%OnNew"> | |
<FormalSpec>data</FormalSpec> | |
<ReturnType>%Status</ReturnType> | |
<Implementation><![CDATA[ | |
s %data = data | |
q $$$OK | |
]]></Implementation> | |
</Method> | |
<Method name="%WriteJSON"> | |
<Implementation><![CDATA[ w %data | |
]]></Implementation> | |
</Method> | |
</Class> | |
<Class name="%CDEV.JSON.Object"> | |
<Super>Base</Super> | |
<TimeCreated>63290,83009.635359</TimeCreated> | |
<Property name="%data"> | |
<Type>%String</Type> | |
<Internal>1</Internal> | |
<MultiDimensional>1</MultiDimensional> | |
</Property> | |
<Method name="%WriteJSON"> | |
<Implementation><![CDATA[ | |
w "{" | |
s k = $o(..%data(""), 1, v) | |
f | |
{ | |
q:k="" | |
w """" | |
d ..%WriteJSONString(k) | |
w """:" | |
if $isobject(v) | |
{ | |
d v.%WriteJSON() | |
} else { | |
w """" | |
d ..%WriteJSONString(v) | |
w """" | |
} | |
s k = $o(..%data(k), 1, v) | |
q:k="" | |
w "," | |
} | |
w "}" | |
]]></Implementation> | |
</Method> | |
<Method name="Count"> | |
<ReturnType>%Integer</ReturnType> | |
<Implementation><![CDATA[ q ..%data | |
]]></Implementation> | |
</Method> | |
<Method name="%DispatchGetProperty"> | |
<Final>1</Final> | |
<Internal>1</Internal> | |
<FormalSpec>name:%String</FormalSpec> | |
<Implementation><![CDATA[ q $G(..%data(name)) | |
]]></Implementation> | |
</Method> | |
<Method name="%DispatchSetProperty"> | |
<Final>1</Final> | |
<Internal>1</Internal> | |
<FormalSpec>name:%String,value:%String</FormalSpec> | |
<Implementation><![CDATA[ | |
s:'$data(..%data(name)) ..%data = $i(..%data) | |
s ..%data(name) = value | |
]]></Implementation> | |
</Method> | |
</Class> | |
<Class name="%CDEV.JSON.Stream"> | |
<Super>Base</Super> | |
<TimeCreated>63290,83009.845137</TimeCreated> | |
<Property name="%data"> | |
<Type>%Stream.Object</Type> | |
<Internal>1</Internal> | |
</Property> | |
<Method name="%OnNew"> | |
<FormalSpec>data:%Stream.Object</FormalSpec> | |
<ReturnType>%Status</ReturnType> | |
<Implementation><![CDATA[ | |
s ..%data = ##class(%Stream.TmpCharacter).%New() | |
s sc = ..%data.CopyFrom(data) | |
q sc | |
]]></Implementation> | |
</Method> | |
<Method name="%WriteJSON"> | |
<Implementation><![CDATA[ | |
s len = 32000 | |
w """" | |
f | |
{ | |
d ..%WriteJSONString(..%data.Read(.len, .sc)) | |
q:len=-1 | |
} | |
w """" | |
]]></Implementation> | |
</Method> | |
</Class> | |
<Class name="%CDEV.Server"> | |
<IncludeCode>%CDEV.JSON.Includes</IncludeCode> | |
<Super>%CSP.REST</Super> | |
<TimeCreated>63290,83432.401149</TimeCreated> | |
<UDLText name="T"> | |
<Content><![CDATA[ | |
// Used to handle Namespace Switching. If a ClassMethod that ends in an N and does not exist is called, it will switch the NameSpace | |
]]></Content> | |
</UDLText> | |
<UDLText name="T"> | |
<Content><![CDATA[ | |
// to the first argument, and call the classmethod with the same arguments, but without the N | |
]]></Content> | |
</UDLText> | |
<Method name="%DispatchClassMethod"> | |
<ClassMethod>1</ClassMethod> | |
<FormalSpec>Class:%String,Method:%String,Args...</FormalSpec> | |
<Implementation><![CDATA[ | |
if $extract(Method, *) = "N" | |
{ | |
s actualMethod = $extract(Method, 1, *-1) | |
if $g(Args) { | |
s namespace = Args(1) | |
n $namespace | |
s $namespace = namespace | |
} | |
s %response.ContentType = "application/json" | |
s %input = ..GetRequest() | |
s response = $classmethod(Class, actualMethod, Args...) | |
d response.%WriteJSON() | |
q $$$OK | |
} else { | |
q "Class Method Not Found" | |
} | |
]]></Implementation> | |
</Method> | |
<XData name="UrlMap"> | |
<XMLNamespace>http://www.intersystems.com/urlmap</XMLNamespace> | |
<Data><![CDATA[ | |
<Routes> | |
<Route Url="/" Method="GET" Call="ListOptionsN" /> | |
<Route Url="/namespaces" Method="GET" Call="GetNamespaceListN" /> | |
<Route Url="/namespaces/:namespace" Method="GET" Call="GetNamespaceN" /> | |
<Route Url="/namespaces/:namespace/files" Method="GET" Call="GetFileListN" /> | |
<Route Url="/namespaces/:namespace/files" Method="PUT" Call="PutNewFileN" /> | |
<Route Url="/namespaces/:namespace/files/:filename" Method="GET" Call="GetFileN" /> | |
<Route Url="/namespaces/:namespace/files/:filename" Method="PUT" Call="PutFileN" /> | |
<Route Url="/namespaces/:namespace/files/:filename" Method="POST" Call="FileActionN" /> | |
<Route Url="/namespaces/:namespace/files/:filename/generated" Method="GET" Call="GetFileGeneratedN" /> | |
<Route Url="/namespaces/:namespace/files/:filename/xml" Method="GET" Call="GetXMLN" /> | |
<Route Url="/namespaces/:namespace/files/:filename/xml" Method="PUT" Call="PutXMLN" /> | |
<Route Url="/namespaces/:namespace/xml" Method="PUT" Call="PutNewXMLN" /> | |
<Route Url="/namespaces/:namespace/globals" Method="GET" Call="GetGlobalListN" /> | |
<Route Url="/namespaces/:namespace/globals/:globalname" Method="GET" Call="GetGlobalN" /> | |
<Route Url="/namespaces/:namespace/queries" Method="GET" Call="GetQueryListN" /> | |
<Route Url="/namespaces/:namespace/queries" Method="PUT" Call="PutNewQueryN" /> | |
<Route Url="/namespaces/:namespace/queries/:query" Method="GET" Call="GetQueryN" /> | |
<Route Url="/namespaces/:namespace/queries/:query" Method="POST" Call="QueryActionN" /> | |
<Route Url="/namespaces/:namespace/queries/:query/plan" Method="GET" Call="GetQueryPlanN" /> | |
<Route Url="/namespaces/:namespace/queries/:query/cached" Method="GET" Call="GetQueryCachedN" /> | |
<Route Url="/namespaces/:namespace/code" Method="GET" Call="GetCodeListN" /> | |
<Route Url="/namespaces/:namespace/code" Method="PUT" Call="PutNewCodeN" /> | |
<Route Url="/namespaces/:namespace/code/:code" Method="GET" Call="GetCodeN" /> | |
<Route Url="/namespaces/:namespace/code/:code" Method="POST" Call="CodeActionN" /> | |
</Routes> | |
]]></Data> | |
</XData> | |
<Method name="ListOptions"> | |
<ClassMethod>1</ClassMethod> | |
<ReturnType>%Status</ReturnType> | |
<Implementation><![CDATA[ | |
s result = $$$jsobj | |
s result.namespaces = ..CreatePath("namespaces") | |
s result.version = "v0.0.3" | |
q result | |
]]></Implementation> | |
</Method> | |
<Method name="GetNamespaceList"> | |
<ClassMethod>1</ClassMethod> | |
<ReturnType>%Status</ReturnType> | |
<Implementation><![CDATA[ | |
s rs = ..DoSQL("%SYS.Namespace::List") | |
s results = $$$jslist | |
while rs.%Next() | |
{ | |
if '$d(%request.Data("name", 1)) || (rs.%GetData(1) = $zcvt(%request.Data("name", 1), "U")) | |
{ | |
s obj = ..NamespaceObject($zcvt(rs.%GetData(1), "L")) | |
d results.Append(obj) | |
} | |
} | |
q results | |
]]></Implementation> | |
</Method> | |
<Method name="GetFileList"> | |
<ClassMethod>1</ClassMethod> | |
<FormalSpec>namespace:%String</FormalSpec> | |
<ReturnType>%Status</ReturnType> | |
<Implementation><![CDATA[ | |
s results = $$$jslist | |
s sql = "SELECT Name||'.cls' FROM %Dictionary.ClassDefinition" | |
s rs = ..DoSQL(sql) | |
while rs.%Next() { | |
s obj = $$$jsobj | |
s obj.name = rs.%GetData(1) | |
s obj.id = ..CreatePath("namespaces", namespace, "files", obj.name) | |
d results.Append(obj) | |
} | |
s sql = "%Library.Routine::RoutineList" | |
s rs = ..DoSQL(sql) | |
while rs.%Next() { | |
s obj = $$$jsobj | |
s obj.name = ..FileName(rs.%GetData(1)) _ "." _ ..FileExtension(rs.%GetData(1)) | |
s obj.id = ..CreatePath("namespaces", namespace, "files", obj.name) | |
d results.Append(obj) | |
} | |
q results | |
]]></Implementation> | |
</Method> | |
<Method name="GetNamespace"> | |
<ClassMethod>1</ClassMethod> | |
<FormalSpec>namespace:%String</FormalSpec> | |
<ReturnType>%Status</ReturnType> | |
<Implementation><![CDATA[ | |
s result = ..NamespaceObject(namespace) | |
q result | |
]]></Implementation> | |
</Method> | |
<Method name="NamespaceObject"> | |
<ClassMethod>1</ClassMethod> | |
<FormalSpec>namespace:%String</FormalSpec> | |
<ReturnType>%CDEV.JSON.Object</ReturnType> | |
<Implementation><![CDATA[ | |
s obj = $$$jsobj | |
s obj.id = ..CreatePath("namespaces", namespace) | |
s obj.name = $zcvt(namespace, "U") | |
s obj.files = ..CreatePath("namespaces", namespace, "files") | |
s obj.globals = ..CreatePath("namespaces", namespace, "globals") | |
s obj.xml = ..CreatePath("namespaces", namespace, "xml") | |
s obj.queries = ..CreatePath("namespaces", namespace, "queries") | |
q obj | |
]]></Implementation> | |
</Method> | |
<Method name="FileObject"> | |
<ClassMethod>1</ClassMethod> | |
<FormalSpec>namespace:%String,filename:%String</FormalSpec> | |
<ReturnType>%CDEV.JSON.Object</ReturnType> | |
<Implementation><![CDATA[ | |
s obj = $$$jsobj | |
if ..FileExtension(filename) = "cls" | |
{ | |
s systemName = ..FileName(filename) | |
if ##class(%Dictionary.ClassDefinition).%ExistsId(systemName) | |
{ | |
d ##class(%Compiler.UDL.TextServices).GetTextAsStream(,..FileName(filename),.classStream) | |
s obj.content = $$$jsstream(classStream) | |
} else { | |
q "" | |
} | |
} else { | |
s systemName = filename | |
i ##class(%Routine).Exists(filename) | |
{ | |
s routine = ##class(%Routine).%OpenId(filename) | |
s obj.content = $$$jsstream(routine) | |
} else { | |
q "" | |
} | |
} | |
s obj.id = ..CreatePath("namespaces", namespace, "files", filename) | |
s obj.generatedfiles = obj.id _ "/generated" | |
s obj.name = filename | |
s obj.xml = ..CreatePath("namespaces", namespace, "files", filename, "xml") | |
s obj.url = ..GetURLForClass(systemName) | |
q obj | |
]]></Implementation> | |
</Method> | |
<Method name="GetFile"> | |
<ClassMethod>1</ClassMethod> | |
<FormalSpec>namespace:%String,filename:%String</FormalSpec> | |
<ReturnType>%Status</ReturnType> | |
<Implementation><![CDATA[ | |
s result = ..FileObject(namespace, filename) | |
q result | |
]]></Implementation> | |
</Method> | |
<Method name="PutFile"> | |
<ClassMethod>1</ClassMethod> | |
<FormalSpec>namespace:%String,filename:%String</FormalSpec> | |
<ReturnType>%Status</ReturnType> | |
<Implementation><![CDATA[ | |
if ..FileExtension(filename) = "cls" | |
{ | |
s systemName = ..FileName(filename) | |
i $isobject(%input.content) | |
{ | |
s sc = ##class(%Compiler.UDL.TextServices).SetTextFromStream(,systemName,%input.content.Read()) | |
} else { | |
s sc = ##class(%Compiler.UDL.TextServices).SetTextFromString(,systemName,%input.content) | |
} | |
} else { | |
s trueName = ..FileName(filename) _ "." _ $zcvt(..FileExtension(filename), "U") | |
if ##class(%Routine).Exists(trueName) | |
{ | |
s routine = ##class(%Routine).%OpenId(trueName) | |
d routine.Clear() | |
} else { | |
s routine = ##class(%Routine).%New(trueName) | |
} | |
i $isobject(%input.content) | |
{ | |
d routine.CopyFrom(%input.content) | |
} else { | |
d routine.Write(%input.content) | |
} | |
s sc = routine.%Save() | |
} | |
s result = $$$jsobj | |
i $$$ISERR(sc) | |
{ | |
s result.success = $$$jsfalse | |
s result.errors = ..ErrorsList(sc) | |
} else { | |
s result.success = $$$jstrue | |
s result.name = filename | |
s result.file = ..FileObject(namespace, filename) | |
} | |
q result | |
]]></Implementation> | |
</Method> | |
<Method name="PutNewFile"> | |
<ClassMethod>1</ClassMethod> | |
<FormalSpec>namespace:%String</FormalSpec> | |
<ReturnType>%Status</ReturnType> | |
<Implementation><![CDATA[ q ..PutFile(namespace, %input.name) | |
]]></Implementation> | |
</Method> | |
<Method name="FileAction"> | |
<ClassMethod>1</ClassMethod> | |
<FormalSpec>namespace:%String,filename:%String</FormalSpec> | |
<ReturnType>%Status</ReturnType> | |
<Implementation><![CDATA[ | |
s classname = ..FileName(filename) | |
s result = $$$jsobj | |
if %input.action = "compile" | |
{ | |
d $system.OBJ.Compile(classname, %input.spec_"-d", .errorlog) | |
i errorlog { | |
s result.success = $$$jsfalse | |
s result.errors = $$$jslist | |
f i=1:1:errorlog | |
{ | |
d result.errors.Append(errorlog(i)) | |
} | |
} else { | |
s result.success = $$$jstrue | |
} | |
} | |
s result.file = ..FileObject(namespace, filename) | |
q result | |
]]></Implementation> | |
</Method> | |
<Method name="GetXML"> | |
<ClassMethod>1</ClassMethod> | |
<FormalSpec>namespace:%String,filename:%String</FormalSpec> | |
<ReturnType>%Status</ReturnType> | |
<Implementation><![CDATA[ | |
s exportname = ..FileName(filename) _ "." _ $zcvt(..FileExtension(filename), "U") | |
s sc = $system.OBJ.ExportToStream(exportname, .stream, "-d /diffexport") | |
s result = $$$jsobj | |
s result.id = ..CreatePath("namespaces", namespace, "files", filename, "xml") | |
s result.content = $$$jsstream(stream) | |
q result | |
]]></Implementation> | |
</Method> | |
<Method name="PutXML"> | |
<ClassMethod>1</ClassMethod> | |
<FormalSpec>namespace:%String,filename:%String</FormalSpec> | |
<ReturnType>%Status</ReturnType> | |
<Implementation><![CDATA[ | |
if '$isobject(%input.content) { | |
s stream = ##class(%Stream.TmpCharacter).%New() | |
d stream.Write(%input.content) | |
} else { | |
s stream = %input.content | |
} | |
s sc = $system.OBJ.LoadStream(stream, "-c-d",,.loadedlist) | |
s result = $$$jsobj | |
if $$$ISERR(sc) | |
{ | |
s result.success = $$$jsfalse | |
s result.errors = ..ErrorsList(sc) | |
} else { | |
s result.success = $$$jstrue | |
s name = $o(loadedlist("")) | |
s displayname = ..FileName(name) _ "." _ $zcvt(..FileExtension(name),"L") | |
s result.file = ..FileObject(namespace, displayname) | |
} | |
q result | |
]]></Implementation> | |
</Method> | |
<Method name="PutNewXML"> | |
<ClassMethod>1</ClassMethod> | |
<FormalSpec>namespace:%String</FormalSpec> | |
<ReturnType>%Status</ReturnType> | |
<Implementation><![CDATA[ | |
//This is fine, because it doesn't make use of filename, yet | |
q ..PutXML(namespace, "") | |
]]></Implementation> | |
</Method> | |
<Method name="GetFileGenerated"> | |
<ClassMethod>1</ClassMethod> | |
<FormalSpec>namespace:%String,filename:%String</FormalSpec> | |
<ReturnType>%Status</ReturnType> | |
<Implementation><![CDATA[ | |
s type = $zcvt(..FileExtension(filename),"U") | |
s file = ..FileName(filename) | |
s results = $$$jslist | |
s genFileList = ##class(%RoutineMgr).GetOther(file,type) | |
i $l(genFileList) | |
{ | |
f i=1:1:$l(genFileList, ",") | |
{ | |
s obj = $$$jsobj | |
s name = $p(genFileList, ",", i) | |
s obj.name = ..FileName(name) _ "." _ $zcvt(..FileExtension(name),"L") | |
s obj.id = ..CreatePath("namespaces",namespace,"files",obj.name) | |
d results.Append(obj) | |
} | |
} | |
q results | |
]]></Implementation> | |
</Method> | |
<Method name="GlobalObject"> | |
<ClassMethod>1</ClassMethod> | |
<FormalSpec>namespace:%String,global:%String</FormalSpec> | |
<ReturnType>%CDEV.JSON.Object</ReturnType> | |
<Implementation><![CDATA[ | |
s obj = $$$jsobj | |
s obj.id = ..CreatePath("namespaces", namespace, "globals", global) | |
s jsrep = $$$jsobj | |
s node = "^"_global_"("""")" | |
f { | |
s node = $query(@node, 1, target) | |
q:node="" | |
s nodename = $replace($replace($e($p(node, "(", 2,9999), 1, *-1), ",""", ","), """,", ",") | |
s $property(jsrep, nodename) = target | |
} | |
s obj.content = jsrep | |
s obj.name = global | |
q obj | |
]]></Implementation> | |
</Method> | |
<Method name="GetGlobalList"> | |
<ClassMethod>1</ClassMethod> | |
<FormalSpec>namespace:%String</FormalSpec> | |
<Implementation><![CDATA[ | |
s results = $$$jslist | |
s global = "" | |
f | |
{ | |
s global = $o(^$g(global)) | |
q:global="" | |
s obj = $$$jsobj | |
s obj.name = $e(global,2,999) | |
s obj.id = ..CreatePath("namespaces", namespace, "globals", obj.name) | |
d results.Append(obj) | |
} | |
q results | |
]]></Implementation> | |
</Method> | |
<Method name="GetGlobal"> | |
<ClassMethod>1</ClassMethod> | |
<FormalSpec>namespace:%String,global:%String</FormalSpec> | |
<Implementation><![CDATA[ q ..GlobalObject(namespace, global) | |
]]></Implementation> | |
</Method> | |
<Method name="QueryObject"> | |
<ClassMethod>1</ClassMethod> | |
<FormalSpec>namespace:%String,id:%Integer</FormalSpec> | |
<ReturnType>%CDEV.JSON.Object</ReturnType> | |
<Implementation><![CDATA[ | |
s obj = $$$jsobj | |
s obj.id = ..CreatePath("namespaces", namespace, "queries", id) | |
s obj.content = ^CacheTempCDEVQuery(id, "text") | |
s obj.plan = ..CreatePath("namespaces", namespace, "queries", id, "plan") | |
s obj.cached = ..CreatePath("namespaces", namespace, "queries", id, "cached") | |
q obj | |
]]></Implementation> | |
</Method> | |
<Method name="GetQueryList"> | |
<ClassMethod>1</ClassMethod> | |
<FormalSpec>namespace:%String</FormalSpec> | |
<Implementation><![CDATA[ | |
s results = $$$jslist | |
s id = "" | |
if $data(^CacheTempCDEVQuery) | |
{ | |
f | |
{ | |
s id = $o(^CacheTempCDEVQuery(id)) | |
q:id="" | |
d results.Append(..QueryObject(namespace, id)) | |
} | |
} | |
q results | |
]]></Implementation> | |
</Method> | |
<Method name="GetQuery"> | |
<ClassMethod>1</ClassMethod> | |
<FormalSpec>namespace:%String,query:%Integer</FormalSpec> | |
<Implementation><![CDATA[ | |
s result = ..QueryObject(namespace, query) | |
q result | |
]]></Implementation> | |
</Method> | |
<Method name="PutNewQuery"> | |
<ClassMethod>1</ClassMethod> | |
<FormalSpec>namespace:%String</FormalSpec> | |
<Implementation><![CDATA[ | |
s result = $$$jsobj | |
if $length(%input.content) | |
{ | |
s id = $increment(^CacheTempCDEVQuery) | |
s ^CacheTempCDEVQuery(id, "text") = %input.content | |
s result.success = $$$jstrue | |
s result.query = ..QueryObject(namespace, id) | |
} else { | |
s result.success = $$$jsfalse | |
s result.errors = "No query supplied" | |
} | |
q result | |
]]></Implementation> | |
</Method> | |
<Method name="QueryAction"> | |
<ClassMethod>1</ClassMethod> | |
<FormalSpec>namespace:%String,query:%Integer</FormalSpec> | |
<Implementation><![CDATA[ | |
s queryObject = ..QueryObject(namespace, query) | |
s result = $$$jsobj | |
i %input.action = "execute" | |
{ | |
s st = ##class(%SQL.Statement).%New() | |
s sc = st.%Prepare(queryObject.content) | |
if $$$ISERR(sc) | |
{ | |
s result.success = $$$jsfalse | |
s result.errors = ..ErrorsList(sc) | |
} else { | |
d st.%GetImplementationDetails(.cachedQueryName) | |
s ^CacheTempCDEVQuery(query, "cachedQueryName") = cachedQueryName | |
s result.success = $$$jstrue | |
s result.resultset = $$$jsobj | |
s rs = st.%Execute() | |
s mt = rs.%GetMetadata() | |
//This could probably be optimized significantly! | |
for i=1:1:mt.columnCount | |
{ | |
s $property(result.resultset, mt.columns.GetAt(i).colName) = $$$jslist | |
} | |
while rs.%Next() | |
{ | |
for i=1:1:mt.columnCount | |
{ | |
d $method($property(result.resultset, mt.columns.GetAt(i).colName), "Append", rs.%GetData(i)) | |
} | |
} | |
} | |
} | |
q result | |
]]></Implementation> | |
</Method> | |
<Method name="CodeObject"> | |
<ClassMethod>1</ClassMethod> | |
<FormalSpec>namespace:%String,id:%Integer</FormalSpec> | |
<ReturnType>%CDEV.JSON.Object</ReturnType> | |
<Implementation><![CDATA[ | |
s obj = $$$jsobj | |
s obj.id = ..CreatePath("namespaces", namespace, "code", id) | |
s obj.content = ^CacheTempCDEVCode(id, "text") | |
q obj | |
]]></Implementation> | |
</Method> | |
<Method name="GetCodeList"> | |
<ClassMethod>1</ClassMethod> | |
<FormalSpec>namespace:%String</FormalSpec> | |
<Implementation><![CDATA[ | |
s results = $$$jslist | |
s id = "" | |
if $data(^CacheTempCDEVQuery) | |
{ | |
f | |
{ | |
s id = $o(^CacheTempCDEVCode(i)) | |
d results.Append(..QueryObject(namespace, id)) | |
} | |
} | |
q results | |
]]></Implementation> | |
</Method> | |
<Method name="GetCode"> | |
<ClassMethod>1</ClassMethod> | |
<FormalSpec>namespace:%String,code:%Integer</FormalSpec> | |
<Implementation><![CDATA[ | |
s result = ..CodeObject(namespace, code) | |
q result | |
]]></Implementation> | |
</Method> | |
<Method name="PutNewCode"> | |
<ClassMethod>1</ClassMethod> | |
<FormalSpec>namespace:%String</FormalSpec> | |
<Implementation><![CDATA[ | |
s result = $$$jsobj | |
if $length(%input.content) | |
{ | |
s id = $increment(^CacheTempCDEVCode) | |
s ^CacheTempCDEVCode(id, "text") = %input.content | |
s result.success = $$$jstrue | |
s result.code = ..CodeObject(namespace, id) | |
} else { | |
s result.success = $$$jsfalse | |
s result.errors = "No code supplied" | |
} | |
q result | |
]]></Implementation> | |
</Method> | |
<Method name="CodeAction"> | |
<ClassMethod>1</ClassMethod> | |
<FormalSpec>namespace:%String,code:%Integer</FormalSpec> | |
<Implementation><![CDATA[ | |
s queryObject = ..CodeObject(namespace, code) | |
i %input.action = "execute" | |
{ | |
s result = $$$jsobj | |
try { | |
s resultStream = ..CaptureIO(queryObject.content) | |
s result.success = $$$jstrue | |
s result.results = $$$jsstream(resultStream) | |
} catch { | |
s result.success = $$$jsfalse | |
s result.errors = ..ErrorsList($ze) | |
} | |
} | |
q result | |
]]></Implementation> | |
</Method> | |
<Method name="QueryPlanOperationObject"> | |
<ClassMethod>1</ClassMethod> | |
<FormalSpec>text:%String</FormalSpec> | |
<ReturnType>%CDEV.JSON.Object</ReturnType> | |
<Implementation><![CDATA[ | |
s %queryArray = 1 | |
s %queryArray(1) = text | |
s xStatement = "do ShowPlan^%apiSQL(.%queryArray, 0, 0, 1)" | |
s planStream = ..CaptureIO(xStatement) | |
s sc = ##class(%XML.TextReader).ParseStream(planStream, .reader) | |
s obj = $$$jsobj | |
if $$$ISERR(sc) | |
{ | |
s obj.success = $$$jsfalse | |
s obj.errors = $$$jslist | |
d planStream.Rewind() | |
d obj.errors.Append(planStream.Read()) | |
} else { | |
s obj.success = $$$jstrue | |
s textStream = ##class(%Stream.TmpCharacter).%New() | |
s elementStack = $$$jslist | |
while reader.Read() | |
{ | |
if reader.NodeType = "element" | |
{ | |
d elementStack.Append(reader.Name) | |
} elseif reader.NodeType = "endelement" | |
{ | |
d elementStack.PopBack() | |
} | |
elseif reader.NodeType = "chars" | |
{ | |
if elementStack.Get(-1) = "plan" | |
{ | |
d textStream.Write(reader.Value) | |
} | |
} | |
} | |
s obj.content = $$$jsstream(textStream) | |
} | |
q obj | |
]]></Implementation> | |
</Method> | |
<Method name="GetQueryPlan"> | |
<ClassMethod>1</ClassMethod> | |
<FormalSpec>namespace:%String,query:%Integer</FormalSpec> | |
<Implementation><![CDATA[ | |
s obj = ..QueryObject(namespace, query) | |
s result = ..QueryPlanOperationObject(obj.content) | |
q result | |
]]></Implementation> | |
</Method> | |
<Method name="GetQueryCached"> | |
<ClassMethod>1</ClassMethod> | |
<FormalSpec>namespace:%String,query:%Integer</FormalSpec> | |
<Implementation><![CDATA[ | |
s filename = ^CacheTempCDEVQuery(query, "cachedQueryName") | |
s result = ..FileObject(namespace, filename _ ".1.int") | |
q result | |
]]></Implementation> | |
</Method> | |
<Method name="RunCode"> | |
<ClassMethod>1</ClassMethod> | |
<FormalSpec>namespace:%String</FormalSpec> | |
<Implementation><![CDATA[ | |
i %input.action = "execute" | |
{ | |
} | |
]]></Implementation> | |
</Method> | |
<Method name="FileExtension"> | |
<ClassMethod>1</ClassMethod> | |
<FormalSpec>filename:%String</FormalSpec> | |
<ReturnType>%String</ReturnType> | |
<Implementation><![CDATA[ q $zcvt($p(filename, ".", *), "L") | |
]]></Implementation> | |
</Method> | |
<Method name="FileName"> | |
<ClassMethod>1</ClassMethod> | |
<FormalSpec>filename:%String</FormalSpec> | |
<ReturnType>%String</ReturnType> | |
<Implementation><![CDATA[ q $p(filename, ".", 1, *-1) | |
]]></Implementation> | |
</Method> | |
<Method name="CreatePath"> | |
<ClassMethod>1</ClassMethod> | |
<FormalSpec>components...</FormalSpec> | |
<ReturnType>%String</ReturnType> | |
<Implementation><![CDATA[ | |
s path = $e(%request.Application, 1, *-1) | |
s i = "" | |
f | |
{ | |
s i = $o(components(i), 1, component) | |
q:i="" | |
s path = path _ "/" _ $zcvt(component,"O","URL") | |
} | |
q path | |
]]></Implementation> | |
</Method> | |
<Method name="GetRequest"> | |
<ClassMethod>1</ClassMethod> | |
<ReturnType>%ZEN.proxyObject</ReturnType> | |
<Implementation><![CDATA[ | |
s request = "" | |
if %request.Content | |
{ | |
d %request.Content.Rewind() | |
d ##class(%ZEN.Auxiliary.jsonProvider).%ConvertJSONToObject(%request.Content,,.request) | |
} | |
q request | |
]]></Implementation> | |
</Method> | |
<Method name="DoSQL"> | |
<ClassMethod>1</ClassMethod> | |
<FormalSpec>sql:%String,args...</FormalSpec> | |
<ReturnType>%SQL.StatementResult</ReturnType> | |
<Implementation><![CDATA[ | |
s st = ##class(%SQL.Statement).%New() | |
if $find(sql,"::") { | |
d st.%PrepareClassQuery($p(sql,"::",1), $p(sql,"::",2)) | |
} else { | |
d st.%Prepare(sql) | |
} | |
s x = st.%Execute(args...) | |
q x | |
]]></Implementation> | |
</Method> | |
<Method name="GetURLForClass"> | |
<ClassMethod>1</ClassMethod> | |
<FormalSpec>classname:%String</FormalSpec> | |
<ReturnType>%String</ReturnType> | |
<Implementation><![CDATA[ | |
s classNamespace = $namespace | |
n $namespace | |
s $namespace = "%SYS" | |
s rs = ..DoSQL("SELECT %ID FROM Security.Applications WHERE NameSpace=?", classNamespace) | |
s cspapp = rs.%GetData(1) | |
q cspapp _ classname _ ".cls" | |
]]></Implementation> | |
</Method> | |
<Method name="ErrorsList"> | |
<ClassMethod>1</ClassMethod> | |
<FormalSpec>sc:%Status</FormalSpec> | |
<ReturnType>%CDEV.JSON.List</ReturnType> | |
<Implementation><![CDATA[ | |
s list = $$$jslist | |
d DecomposeStatus^%apiOBJ(sc, .err, "-d") | |
for i=1:1:err | |
{ | |
d list.Append(err(i)) | |
} | |
q list | |
]]></Implementation> | |
</Method> | |
<Method name="CaptureIO"> | |
<ClassMethod>1</ClassMethod> | |
<FormalSpec>textString:%String</FormalSpec> | |
<ProcedureBlock>0</ProcedureBlock> | |
<ReturnType>%Stream.TmpCharacter</ReturnType> | |
<Implementation><![CDATA[ | |
//I don't know why this is required but it is. | |
w " " | |
set myStream = ##class(%Stream.TmpCharacter).%New() | |
use $io::("^"_$ZNAME) | |
do ##class(%Device).ReDirectIO(1) | |
xecute textString | |
do ##class(%Device).ReDirectIO(0) | |
quit myStream | |
rchr(c) quit | |
rstr(sz,to) quit | |
wchr(s) do output($char(s)) quit | |
wff() do output($char(12)) quit | |
wnl() do output($char(13,10)) quit | |
wstr(s) do output(s) quit | |
wtab(s) do output($char(9)) quit | |
output(s) do myStream.Write(s) quit | |
]]></Implementation> | |
</Method> | |
</Class> | |
</Export> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment