快速创建命名空间
一般情况下,我们根据iris的portal向导创建数据库,然后创建命名空间。这个过程比较花时间,如果是已经存在的数据库,还需要再装载。翻阅portal调用的方法后,我整合了这几个方法。把这几个方法拷贝到任意已经存在的命名空间,通过执行CNNS(路径,命名空间),就可以快速创建好命名空间。方法的大概过程是,进入到%sys命名空间,然后依次创建数据库,创建命名空间,创建web应用。创建完成后,回到当前命名空间。
ClassMethod CNNS(pathroot = "E:\IRIS", NS = "TEST")
{
s currentNS = $namespace
s $zt="Err"
zn "%SYS"
s ret=..CNNS1(pathroot,NS)
zn currentNS
q ret
Err
zn currentNS
q $ze
}ClassMethod CNNS1(pathroot, NS)
{
s APP="APP"
d ..CDB(pathroot,APP,NS,.sc)
q:sc'=1 sc
s DATA="DATA"
d ..CDB(pathroot,DATA,NS,.sc)
q:sc'=1 sc
s NSP("Globals") = NS_"-"_DATA
s NSP("Routines") = NS_"-"_APP
d ..CNS(NS,.NSP,.sc)
q:sc'=1 sc
d ..CWA(NS,.sc)
q sc
}ClassMethod CWA(NS, Output sc)
{
w "开始更新web应用 ...",!
s WN = "/csp/healthshare/"_NS
s WP("AutheEnabled")=$$$AutheUnauthenticated
s WP("AutoCompile")=$$$NO
s WP("CSPZENEnabled")=$$$YES
s WP("CSRFToken")=$$$NO
s WP("ChangePasswordPage")=""
s WP("CookiePath")="/"
s WP("DeepSeeEnabled")=$$$NO
s WP("Description")=NS
s WP("DispatchClass")=""
s WP("Enabled")=$$$YES
s WP("ErrorPage")=""
s WP("EventClass")=""
s WP("GroupById")="%ISCMgtPortal"
s WP("HyperEvent")=$$$NO
s WP("InbndWebServicesEnabled")=$$$YES
s WP("IsNameSpaceDefault")=$$$YES
s WP("LockCSPName")=$$$YES
s WP("LoginPage")=""
s WP("MatchRoles")=":%DB_HSCUSTOM:%DB_HSLIB:%HS_DB_CDYZONE:%HS_DB_HSSYS"
s WP("NameSpace")=NS
s WP("Package")=""
s Path=##class(%File).ComputeFullDBDir("")
s WP("Path")=$p(Path,"\",1,3)_"\CSP\healthshare\"_NS
s WP("PermittedClasses")=""
s WP("Recurse")=$$$YES
s WP("Resource")="%Ens_Portal"
s WP("ServeFiles")=$$$YES
s WP("ServeFilesTimeout")=3600
s WP("SuperClass")=""
s WP("Timeout")=900
s WP("TwoFactorEnabled")=$$$NO
s WP("Type")=2
s WP("UseCookies")=2
s WP("iKnowEnabled")=$$$NO
s sc = ##class(Security.Applications).Modify(WN, .WP)
d:'sc $system.Status.DisplayError(sc)
w "web 应用 "_NS_" 更新成功!",!
q $$$OK
}ClassMethod CNS(NS, Output NSP, Output sc)
{
w "开始创建命名空间 ...",!
s NSP("Library")="IRISLIB"
s NSP("SysGlobals")="IRISSYS"
s NSP("SysRoutines")="IRISSYS"
s NSP("TempGlobals")="IRISTEMP"
s sc=##Class(Config.Namespaces).Create(NS,.NSP)
d:'sc $system.Status.DisplayError(sc)
q:sc'=1 $$$OK
s sc = ##class(%Library.EnsembleMgr).EnableNamespace(NS,1)
d:'sc $system.Status.DisplayError(sc)
q:sc'=1 $$$OK
w "命名空间 "_NS_" 创建成功!",!
q $$$OK
}ClassMethod CDB(path, DBN, NS, Output sc)
{
s sc=1
s DBN1=NS_"-"_DBN
s pathroot=path_"/"_NS_"/"_DBN
w "开始创建数据库 ...",!
i (##class(%Library.File).DirectoryExists(pathroot)=0) d
.s sc=##class(%Library.File).CreateDirectoryChain(pathroot)
d:'sc $system.Status.DisplayError(sc)
q:'sc $$$OK
s Directory=pathroot_"/"
s dbProperties("Directory") = pathroot
i ..DbExists(Directory)=0 d
.s sc = ##class(SYS.Database).CreateDatabase(Directory,1,8192,0,"%DB_%DEFAULT",3,"","")
d:'sc $system.Status.DisplayError(sc)
q:'sc $$$OK
s sc=##Class(Config.Databases).Create(DBN1,.dbProperties)
d:'sc $system.Status.DisplayError(sc)
q:'sc $$$OK
w "数据库 "_DBN1_" 创建成功!",!
q $$$OK
}ClassMethod DbExists(Dir)
{Set Value1 = $zu(12,Dir,1)
If Value1 = "" {
If $$$isVMS Set Value1 = $zu(12,Value1,4)
If Value1 = "" Quit 0
}
Set Dir = Value1 _ "IRIS.EXT"
If (##class(%File).Exists(Dir)) Quit 2
Set Dir = Value1 _ "IRIS.DAT"
If (##class(%File).Exists(Dir)) {
s db=##class(SYS.Database).%OpenId(Value1,,.status)
if '$$$ISOK(status) Quit 3
q Dir
}
Quit 0
}
需要注意的是,如果是linux系统,使用文件夹需要有读写权限,否则,创建过程会报错。代码在iris 以下版本的数据库,略有变化,大致过程都是一样。