文章
· 十月 6, 2023 阅读大约需 4 分钟

快速创建命名空间

一般情况下,我们根据iris的portal向导创建数据库,然后创建命名空间。这个过程比较花时间,如果是已经存在的数据库,还需要再装载。翻阅portal调用的方法后,我整合了这几个方法。把这几个方法拷贝到任意已经存在的命名空间,通过执行CNNS(路径,命名空间),就可以快速创建好命名空间。方法的大概过程是,进入到%sys命名空间,然后依次创建数据库,创建命名空间,创建web应用。创建完成后,回到当前命名空间。

ClassMethod CNNS(pathroot = "E:\IRIS", NS = "TEST")
{
currentNS = $namespace
$zt="Err"
    zn "%SYS"
    ret=..CNNS1(pathroot,NS)
    zn currentNS
    ret
Err
zn currentNS
$ze
} ClassMethod CNNS1(pathroot, NS)
{
    APP="APP"
    ..CDB(pathroot,APP,NS,.sc)
q:sc'=1 sc
    DATA="DATA"
    ..CDB(pathroot,DATA,NS,.sc)
q:sc'=1 sc
    NSP("Globals") = NS_"-"_DATA
    NSP("Routines") = NS_"-"_APP
    ..CNS(NS,.NSP,.sc)
    q:sc'=1 sc
    ..CWA(NS,.sc)
    sc
} ClassMethod CWA(NS, Output sc)
{
"开始更新web应用 ...",!
    WN = "/csp/healthshare/"_NS
    WP("AutheEnabled")=$$$AutheUnauthenticated
WP("AutoCompile")=$$$NO
WP("CSPZENEnabled")=$$$YES
WP("CSRFToken")=$$$NO
WP("ChangePasswordPage")=""
WP("CookiePath")="/"
WP("DeepSeeEnabled")=$$$NO
WP("Description")=NS
WP("DispatchClass")=""
WP("Enabled")=$$$YES
WP("ErrorPage")=""
WP("EventClass")=""
WP("GroupById")="%ISCMgtPortal"
WP("HyperEvent")=$$$NO
WP("InbndWebServicesEnabled")=$$$YES
WP("IsNameSpaceDefault")=$$$YES
WP("LockCSPName")=$$$YES
WP("LoginPage")=""
WP("MatchRoles")=":%DB_HSCUSTOM:%DB_HSLIB:%HS_DB_CDYZONE:%HS_DB_HSSYS"
WP("NameSpace")=NS
WP("Package")=""
Path=##class(%File).ComputeFullDBDir("")
WP("Path")=$p(Path,"\",1,3)_"\CSP\healthshare\"_NS
WP("PermittedClasses")=""
WP("Recurse")=$$$YES
WP("Resource")="%Ens_Portal"
WP("ServeFiles")=$$$YES
WP("ServeFilesTimeout")=3600
WP("SuperClass")=""
WP("Timeout")=900
WP("TwoFactorEnabled")=$$$NO
WP("Type")=2
WP("UseCookies")=2
WP("iKnowEnabled")=$$$NO
    sc = ##class(Security.Applications).Modify(WN, .WP)
    d:'sc $system.Status.DisplayError(sc)
    "web 应用 "_NS_" 更新成功!",!
    $$$OK
} ClassMethod CNS(NS, Output NSP, Output sc)
{
"开始创建命名空间 ...",!
NSP("Library")="IRISLIB"
NSP("SysGlobals")="IRISSYS"
NSP("SysRoutines")="IRISSYS"
NSP("TempGlobals")="IRISTEMP"
    sc=##Class(Config.Namespaces).Create(NS,.NSP)
    d:'sc $system.Status.DisplayError(sc)
    q:sc'=1 $$$OK
    sc = ##class(%Library.EnsembleMgr).EnableNamespace(NS,1)
    d:'sc $system.Status.DisplayError(sc)
    q:sc'=1 $$$OK
    "命名空间 "_NS_" 创建成功!",!
    $$$OK
} ClassMethod CDB(path, DBN, NS, Output sc)
{
sc=1
DBN1=NS_"-"_DBN
pathroot=path_"/"_NS_"/"_DBN
    "开始创建数据库 ...",!
    (##class(%Library.File).DirectoryExists(pathroot)=0) d
.sc=##class(%Library.File).CreateDirectoryChain(pathroot)
d:'sc $system.Status.DisplayError(sc)
    q:'sc $$$OK
    Directory=pathroot_"/"
    dbProperties("Directory") = pathroot
    ..DbExists(Directory)=0 d
    .sc = ##class(SYS.Database).CreateDatabase(Directory,1,8192,0,"%DB_%DEFAULT",3,"","")
    d:'sc $system.Status.DisplayError(sc)
    q:'sc $$$OK
sc=##Class(Config.Databases).Create(DBN1,.dbProperties)
    d:'sc $system.Status.DisplayError(sc)
    q:'sc $$$OK
    "数据库 "_DBN1_" 创建成功!",!
    $$$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)) {
db=##class(SYS.Database).%OpenId(Value1,,.status)
if '$$$ISOK(status) Quit 3
Dir
}
Quit 0
}

需要注意的是,如果是linux系统,使用文件夹需要有读写权限,否则,创建过程会报错。代码在iris 以下版本的数据库,略有变化,大致过程都是一样。
 

讨论 (0)1
登录或注册以继续