1 关注者 · 991 帖子

  

InterSystems Caché 是一个多模型 DBMS 和应用服务器。

查看此处提供的更多详细信息

文档

文章 姚 鑫 · 六月 25, 2022 2m read

第十章 设置结构化日志记录(二)

注:IRIS有,Cache无。

启用结构化日志记录

^LOGDMN 例程允许管理结构化日志记录;还有一个基于类的 API,将在下一节中介绍。

要使用 ^LOGDMN 启用结构化日志记录:

  1. 打开终端并输入以下命令:
set $namespace="%sys"
do ^LOGDMN

这将启动一个带有以下提示的例程:

 
1) Enable logging
2) Disable logging
3) Display configuration
4) Edit configuration
5) Set default configuration
6) Display logging status
7) Start logging
8) Stop logging
9) Restart logging
 
LOGDMN option?
  1. 4 以便可以指定配置详细信息。然后,该例程会提示输入以下项目:

a. 最低日志级别,以下之一:

  • -2 — 详细的调试消息(例如十六进制转储)。
  • -1 — 不太详细的调试消息。
  • — 信息性消息,包括所有审计事件。
  • 1(默认值)— 警告,表示可能需要注意但未中断操作的问题。
  • 2 — 严重错误,表明问题已中断操作。
  • — 致命错误,表示问题导致系统无法运行。

b. 管道命令,它指定系统将结构化日志发送到哪里。

0
0 168
文章 姚 鑫 · 六月 24, 2022 4m read

第九章 设置结构化日志记录(一)

IRIS 支持结构化日志记录。

创建多个日志,每个日志用于不同的目的。从以前的产品迁移过来的客户可以像过去一样利用这些日志,但现在还可以将所有日志信息导入一个单一的、中央的、机器可读的日志文件——结构化日志。然后可以将此文件与第三方分析工具一起使用。

本文概述了结构化日志中的信息,展示了日志示例,并描述了如何启用结构化日志记录。

结构化日志中可用的信息

当启用结构化日志记录时,系统会将相同的数据写入结构化日志,它也会写入其他日志(无论哪个)。例如,系统将相同的行写入messages.log 和结构化日志。

启用结构化日志记录后,结构化日志包含以下所有信息:

  • 写入messages.log 的信息。这包括需要注意的警报、有关系统启动和关闭的信息、有关日志文件和 WIJ 文件的高级信息、有关配置更改 (CPF) 的信息以及与许可相关的信息。
  • 写入审计数据库的信息。详细信息取决于正在审核的事件。

示例输出

本部分显示结构化日志记录实用程序的示例输出,用于名称/值对格式和 JSON 格式。

名称/值对

以下输出使用格式选项 (名称/值对)。此示例经过编辑以用于显示目的;在实际输出中,每个条目只占一行,条目之间没有空行。

when="2019-08-01 18:43:02.216" pid=8240 level=SEVERE event=Utility.Event 
text="Previous system shutdown was abnormal, system forced down or crashed"

when="2019-08-01 18:43:05.290" pid=8240 level=SEVERE event=Utility.Event 
text="LMF Error: No valid license key. Local key file not found and LicenseID not defined."

when="2019-08-01 18:43:05.493" pid=8240 level=WARNING event=Generic.Event 
text="Warning: Alternate and primary journal directories are the same"

when="2019-08-01 18:46:10.493" pid=11948 level=WARNING event=System.Monitor 
text="CPUusage Warning: CPUusage = 79 ( Warnvalue is 75)."
0
0 200
文章 姚 鑫 · 六月 23, 2022 3m read

第八章 操作位和位串(四)

操作以整数形式实现的位串

设置位

要创建一个存储为整数的新位串,请对每个位求和 2 的幂:

set bitint = (2**2) + (2**5) + (2**10)
 
write bitint
1060

要将现有位串中的位设置为 1,请使用 $zboolean 函数(逻辑 OR)的选项7

set bitint = $zboolean(bitint, 2**4, 7)

write bitint
1076

要将现有位串中的位设置为 ,请使用 函数的选项 :


set bitint = $zboolean(bitint, 2**4, 2)

write bitint
1060

要在现有位串中切换位,请使用 函数(逻辑 )的选项 :

测试位是否已设置

要将位字符串显示为整数,可以使用如下方法,该方法循环位并使用 函数:

查找设置位

此方法使用函数将位字符串中的哪些位设置为整数,该函数返回以10为底的对数值。该方法删除越来越小的位串块,直到没有剩余:

执行按位算术

使用 函数对存储为整数的位串执行按位逻辑运算。

对于此示例,假设有两个位串 和 ,存储为整数,以及一个 方法,如 中定义的,用于显示这些位。

使用 函数的选项 对位执行逻辑 :

使用 函数的选项 对位执行逻辑与:

转换为常规位串

0
0 159
文章 Lilian Huang · 六月 23, 2022 2m read

InterSystems许可证是指InterSystems发放的电子或纸质版的产品许可证,内容包括许可证订购日期、产品描述等。

激活码/License KeyInterSystems随许可证发放的许可软件激活码。通常情况下,客户收到的是电子许可证。

以下是一些许可证,激活码/License key常见咨询问题参考:

  1. 收到电子许可证后,如何获取纸质版许可证?

纸质版许可证或是安装介质盘,可通过合作伙伴或是致电原厂核验许可证信息后获取。

  1. 如需申请WRC支持,需要

申请准备:

  • WRC账号,如无请通过WRC联络信息申请WRC账号
  • 故障问题描述
  • 许可证或激活码/License key
  • 最终客户名称 

WRC全球响应中心联络信息:

  1. 如何查询您的授权文件客户名和授权密钥?
0
0 633
文章 姚 鑫 · 六月 22, 2022 4m read

第七章 操作位和位串(三)

操作位串

要创建新的位串,请使用 $bit 函数将所需位设置为 1

kill bitstring
 
set $bit(bitstring, 3) = 1
 
set $bit(bitstring, 6) = 1
 
set $bit(bitstring, 11) = 1

使用 将现有位串中的位设置为 1

set $bit(bitstring, 5) = 1

使用 将现有位串中的位设置为 0

set $bit(bitstring, 5) = 0

由于位串中的第一位是位 ,因此尝试设置位 会返回错误:

测试位是否已设置

要测试是否在现有位串中设置了位,还可以使用 函数:

如果测试未明确设置的位,则 $bit 返回 0:

显示位

要显示位串中的位,请使用 $bitcount 函数获取位串中位的计数,然后遍历位:

还可以使用 来计算位串中 或 的数量:

查找设置位

要查找在位串中设置了哪些位,请使用 函数,该函数返回指定值的下一位的位置,从位串中的给定位置开始:

此方法搜索字符串并在 返回 时退出,表示没有找到更多匹配项。

在测试位串的比较时要非常小心。

例如,可以有两个位串 和 ,它们具有相同的位集:

然而,如果你比较它们,你会发现它们实际上并不相等:

如果你使用 ,你可以看到这两个比特环的内部表示是不同的:

在这种情况下, 将第 位设置为 :

0
0 136
公告 Michael Lei · 六月 22, 2022

Hi 社区,

这是海外工程师做的一个纯浏览器的代码编辑器CloudStudio. 欢迎大家下载试用:

GitHub 下载:

https://github.com/SeanConnelly/CloudStudio

InterSystems 应用市场下载:https://openexchange.intersystems.com/package/CloudStudio

到Discord 讨论区:https://discord.gg/ZnvdMywsjP
 

Docker 支持与在线Demo:

要求

已安装 git 和 Docker desktop .

安装

Clone/git 把 repo 导入任何本地目录

git https://github.com/rcemper/Dataset-OEX-reviews.git

启动IRIS容器:

docker-compose up -d --build

如何测试

http://localhost:42773/cloudstudio/CloudStudio.Index.cls

或使用在线Demo 

Demo 视频:https://www.youtube.com/watch?v=Am6QAvrPPPg

0
0 348
文章 姚 鑫 · 六月 21, 2022 3m read

第六章 操作位和位串(二)

将位序列存储为整数

如果要将一系列布尔参数传递给方法,一种常见的方法是将它们作为编码为单个整数的位序列传递。

例如,Security.System.ExportAll() 方法用于从 IRIS 实例中导出安全设置。如果查看此方法的类引用,将看到它的定义如下:

classmethod ExportAll(FileName As %String = "SecurityExport.xml", 
ByRef NumExported As %String, Flags As %Integer = -1) as %Status

第三个参数 Flags 是一个整数,其中每个位代表一种可以导出的安全记录。

0
0 156
文章 Michael Lei · 六月 21, 2022 3m read

如果您使用InterSystems技术开发了自己的网络应用,现在想在客户端进行验证码验证,以确定用户真实性使其更加安全。有一些现代框架可以解决验证码的问题,然而它们中的大多数需要互联网接入来生成代码,有时实施起来很复杂。考虑到图像识别已经非常成熟,您可以参考本文为基本例子。这就是为什么现在倾向于看到更多的模式识别验证码而不是单纯的阅读验证码。(例如,点击所有有店面的图片)。如果你需要更复杂的东西,请继续开发,改进这个代码并分享它。 继续阅读以了解如何使用这个基本的例子:

Demo.Captcha class

使用这个类,你可以在一个物理目录上创建验证码图像文件,以便在你的应用程序上显示。请注意,创建图像的目录必须是可用的,以便你的Web应用程序访问这些图像。要创建验证码图像,请调用以下方法,将完整的文件名作为一个参数:

创建 image 文件

Set tCount = $Increment(^CacheTemp("CAPTCHA",0))
        
Set tPath  = "C:\InterSystems\Ensemble201710\CSP\user\images\captcha\"
If '##class(%File).DirectoryExists(tPath) {
    Set tSC = ##class(%File).
0
0 200
文章 姚 鑫 · 六月 20, 2022 4m read

第五章 操作位和位串

有时可能希望在基于数据平台的应用程序中存储一系列相关的布尔值。可以创建许多布尔变量,也可以将它们存储在数组或列表中。或者可以使用称为“位串”的概念,它可以定义为位序列,首先呈现最低有效位。位串允许您以非常有效的方式存储此类数据,无论是在存储空间还是处理速度方面。

位串可以以两种方式之一存储,作为压缩字符串或整数。如果在没有上下文的情况下听到术语“位串”,则表示位序列存储为压缩字符串。本文向介绍了这两种类型的位串,然后介绍了一些可用于操作它们的技术。

将位序列存储为位串

存储位序列的最常见方式是在位串中,这是一种特殊的压缩字符串。除了节省存储空间外,还可以使用 ObjectScript 系统函数有效地操作位串。

这样的系统函数是 $factor,它将整数转换为位串。我们可以通过执行以下语句将整数 11744 转换为位串:

set bitstring = $factor(11744)

要查看位串内容的表示,可以使用 命令:

zwrite bitstring
bitstring=$zwc(128,4)_$c(224,45,0,0)/*$bit(6..9,11,12,14)*/

起初它看起来很神秘,但在输出的末尾,会看到一条注释,其中显示了已设置的实际位的列表:67、、、、 和 。位串中的位 表示 ,位 表示 ,依此类推。将所有位加在一起,我们得到 。

0
0 171
文章 Jingwei Wang · 六月 20, 2022 8m read

安装Arbiter

为了将自动故障转移扩展到尽可能广泛的故障情况,InterSystems建议你为每个镜像配置一个仲裁机。

要充当仲裁者,系统必须有一个正在运行的ISCAgent进程。由于ISCAgent是与InterSystems IRIS一起安装的,任何承载一个或多个InterSystems IRIS实例的系统都符合这一要求,可以被配置为仲裁者而无需进一步准备;但是,承载一个或多个故障转移或DR异步镜像成员的系统不应该被配置为该镜像的仲裁者。

没有托管InterSystems IRIS实例的系统可以通过安装Arbiter方式的作为仲裁者。请从InterSystems公司下载适合你的仲裁者系统平台的ISCAgent安装包,然后,安装ISCAgent。

注意:Arbiter的版本要和InterSystems IRIS安装版本保持一致。

在Windows上安装Arbiter

在Windows系统上,只需执行安装文件,例如ISCAgent-2020.1.0.540.0-win_x64.exe。

在Linux上安装Arbiter

[root@arbiterhost home]# gunzip ISCAgent-2020.1.0.540.0-lnxrhx64.tar.gz
[root@arbiterhost home]# tar -xf ISCAgent-2020.1.0.540.0-lnxrhx64.tar
[root@arbiterhost home]# ./ISCAgent/agentinstall
0
1 716
文章 姚 鑫 · 六月 19, 2022 3m read

第四章 锁定和并发控制(四)

避免死锁

增量锁定具有潜在危险,因为它可能导致称为死锁的情况。当两个进程各自对已被另一个进程锁定的变量断言增量锁定时,就会出现这种情况。因为尝试的锁是增量的,所以现有的锁不会被释放。结果,每个进程在等待另一个进程释放现有锁的同时挂起。

举个例子:

  1. 进程 A 发出此命令:lock + ^MyGlobal(15)
  2. 进程 B 发出此命令:
  3. 进程 A 发出此命令:

LOCK 命令不返回;进程被阻塞,直到进程 释放这个锁。

  1. 进程 B 发出此命令:lock + ^MyGlobal(15)

LOCK 命令不返回;进程被阻塞,直到进程 释放这个锁。但是,进程 A 被阻塞,无法释放锁。现在这些进程都在等待对方。

有几种方法可以防止死锁:

  • 始终包含 timeout 参数。
  • 对于发出增量 命令的顺序,请遵循严格的协议。只要所有进程都遵循相同的锁名称顺序,就不会发生死锁。一个简单的协议是按排序顺序添加锁。
  • 使用简单锁定而不是增量锁定;也就是说,不要使用 运算符。如前所述,对于简单锁定, 命令首先释放进程持有的所有先前锁定。 (然而,在实践中,简单的锁定并不经常使用。)

如果发生死锁,可以使用管理门户或

锁的实际用途

本节介绍在实践中使用锁的基本方法。

控制对应用程序数据的访问

0
0 220
文章 姚 鑫 · 六月 17, 2022 7m read

第三章 锁定和并发控制(三)

升级锁

使用升级锁来管理大量锁。当锁定数组的节点时,它们是相关的,特别是当将多个节点锁定在同一下标级别时。

当给定进程在同一数组中的给定下标级别创建了超过特定数量(默认为 1000)的升级锁时, 将删除所有单独的锁名称并用新锁替换它们。新锁位于父级,这意味着数组的整个分支被隐式锁定。示例(如下所示)演示了这一点。

应用程序应在合适的情况下尽快释放特定子节点的锁(与非升级锁完全相同)。当释放锁时, 会减少相应的锁计数。当的应用程序移除足够多的锁时,会移除父节点上的锁。第二小节显示了一个示例。

锁升级示例

假设有 1000^MyGlobal("sales","EU",salesdate) 形式的锁,其中 salesdate 表示日期。锁表可能如下所示:

image

注意 Owner 19776 的条目(这是拥有锁的进程)。 ModeCount 列指示这些是共享的、升级的锁。

当同一进程试图创建另一个相同形式的锁时, 会升级它们。它会移除这些锁并用名称为 ^MyGlobal("sales","EU") 的单个锁替换它们。现在锁表可能如下所示:

列表明这是一个共享的升级锁,它的计数是 1001

请注意以下关键点:

  • ^MyGlobal("sales","EU") 的所有子节点现在都被隐式锁定,遵循数组锁定的基本规则。
0
0 164
文章 姚 鑫 · 六月 16, 2022 4m read

第二章 锁定和并发控制(二)

关于零超时的说明

如上所述,如果您将 timeout 指定为 0, 会添加锁。但是,如果使用零超时锁定父节点,并且已经在子节点上锁定,则忽略零超时并使用内部 1 秒超时。

删除锁

要删除默认类型的锁,请使用 命令,如下所示:

LOCK -lockname

如果执行此命令的进程拥有具有给定名称的锁(默认类型),则此命令将删除该锁。或者,如果进程拥有多个锁(默认类型),此命令将删除其中一个。

或者删除另一种类型的锁:

LOCK -lockname#locktype

其中 是一串锁类型代码。

LOCK 命令的其他基本变体

为了完整起见,本节讨论 LOCK 命令的其他基本变体:使用它来创建简单的锁并使用它来删除所有锁。这些变化在实践中并不常见。

创建简单的锁

对于 命令,如果省略 + 运算符, 命令首先会删除该进程持有的所有现有锁,然后尝试添加新锁。在这种情况下,锁称为简单锁而不是增量锁。一个进程可以拥有多个简单的锁,如果该进程使用如下语法同时创建它们:

 LOCK (^MyVar1,^MyVar2,^MyVar3)

简单的锁在实践中并不常见,因为通常需要持有多个锁并在代码的不同步骤中获取它们。因此使用增量锁更实用。

但是,如果简单锁适合,请注意,可以在创建简单锁时指定 和 参数。此外,要删除一个简单的锁,可以使用带有减号 () 的 LOCK 命令。

0
0 90
文章 姚 鑫 · 六月 15, 2022 5m read

第一章 锁定和并发控制(一)

任何多进程系统的一个重要特征是并发控制,即防止不同进程同时更改特定数据元素的能力,从而导致损坏。 提供了一个锁管理系统。本文提供了一个概述。

此外,%Persistent 类提供了一种控制对象并发访问的方法,即 %OpenId() 的并发参数和该类的其他方法。这些方法最终使用本文讨论的 ObjectScript LOCK 命令。所有持久对象都继承这些方法。同样,系统会自动对 、 和 操作执行锁定(除非指定 关键字)。

类还提供方法 、%ReleaseLock()、、、 和 。

介绍

基本的锁定机制是 命令。此命令的目的是延迟一个进程中的活动,直到另一个进程发出可以继续进行的信号。

锁本身并不能阻止活动行为。锁定仅按约定起作用:它要求相互竞争的进程都使用相同的锁定名称实现锁定。例如,下面描述了一个常见的场景:

  1. 进程 A 发出 LOCK 命令, 创建一个锁(默认情况下,一个独占锁)。通常,进程 然后对中的节点进行更改。详细信息是特定于应用程序的。
  2. 进程 发出具有相同锁名称的 命令。因为存在一个现有的排他锁,所以进程 B 暂停。具体来说, 命令不返回,并且不能执行连续的代码行。
  3. 当进程释放锁时,进程中的命令最终返回,进程B继续。通常,进程 然后对同一中的节点进行更改。

锁名称

命令的参数之一是锁名称。

0
0 145
文章 姚 鑫 · 六月 14, 2022 5m read

第九章 其他参考资料(二)

特殊变量 (SQL)

系统提供的变量。

$HOROLOG
$JOB
$NAMESPACE
$TLEVEL
$USERNAME
$ZHOROLOG
$ZJOB
$ZPI
$ZTIMESTAMP
$ZTIMEZONE
$ZVERSION

SQL直接支持许多对象脚本特殊变量。这些变量包含系统提供的值。只要可以在SQL中指定文字值,就可以使用它们。

SQL特殊变量名不区分大小写。大多数可以使用缩写来指定。

0
0 146
文章 Lilian Huang · 六月 14, 2022 3m read

这篇文章是上一篇文章的延续https://cn.community.intersystems.com/post/首次使用intersystems-iris-互操作性-一个production是什么?

在上一篇文章:https://cn.community.intersystems.com/post/首次使用intersystems-iris-互操作性-一个production是什么?  我们查验了什么是Production. 我们运行了示例代码,并在Visual Trace 页面查验了如何将流动消息的内容引入进Production中。

本文将回顾消息messages的概念和定义,和消息如何在系统集成所需的开发内容中用于组件之间发送和接收数据。

在创建 一个Message消息之前,让我们回顾一个案例研究。

0
0 303
文章 姚 鑫 · 六月 13, 2022 5m read

第八章 其他参考资料(一)

默认用户名和密码(SQL)

IRIS® 数据平台提供了用于登录数据库和开始使用的默认用户名和密码。默认用户名为“_SYSTEM”(大写),密码为“sys”。

SQLCODE错误代码(SQL)

执行大多数 SQL操作都会发出SQLCODE值。发出的值为0、和负整数值。

  • SQLCODE=0表示SQL操作成功完成。对于SELECT语句,这通常意味着从表中成功检索数据。但是,如果SELECT执行聚合操作(例如:),则聚合操作成功,即使中没有数据,也会发出;在这种情况下,返回,。
  • 表示SQL操作成功,但没有找到可操作的数据。发生这种情况的原因有很多。对于,这些包括:指定表不包含数据;表不包含满足查询条件的数据;或者行检索已到达表的最后一行。对于或,它们包括:指定的表不包含数据;或者表不包含满足子句条件的数据行。在这些情况下,。
  • 表示错误。负整数值指定发生的错误类型。是通用的致命错误代码。

字段约束(SQL)

字段约束指定管理字段允许的数据值的规则。一个字段可能有以下约束:

  • 非空:必须在每条记录中为该字段指定值(可接受空字符串)。
  • 唯一:如果在记录中为该字段指定值,则该值必须是唯一值(可接受的空字符串)。但是,可以为该字段创建多个没有值(NULL)的记录。
  • DEFAULT
0
0 274
文章 姚 鑫 · 五月 12, 2021 4m read

第五章 管理全局变量(一)

管理门户提供管理全局变量的工具,系统类提供执行某些相同任务的方法。本章介绍如何使用这些工具。

一般建议

与ObjectScript命令SETMERGEKILL和其他命令一样,这里描述的工具提供了直接访问操作全局变量的权限。如果通过全局访问删除或修改,则会绕过所有对象和SQL完整性检查,并且没有撤消选项。因此,在执行这些任务时要非常小心,这一点很重要。(查看和导出不会影响数据库,并且是安全活动。)

使用本章中介绍的工具时,请确保以下事项:

  • IRIS使用哪些全局变量。并不是所有这些都被视为“系统”全局变量-也就是说,即使没有选中“系统”复选框,它们中的一些也是可见的。其中一些全局变量存储代码,包括的代码。
  • 确保知道应用程序使用哪些全局变量。

即使应用程序从不执行任何直接全局访问,应用程序也会使用全局变量。请记住,如果创建持久类,则它们的数据和任何索引都存储在全局变量中,全局变量的名称基于类名(默认情况下)。

“全局变量”页简介

管理门户包括全局页面,该页面允许管理全局。在此页上,可以执行以下操作:

  • 在该全局的行中选择View以检查它。
  • 在该全局的行中选择编辑以对其进行修改。
  • 选择导出以导出全局变量。
  • 选择导入以导入全局变量。
  • 选择删除以删除全局变量。
  • 选择查找以查找全局变量中的值。

此页还包括用于查看例程和类的选项;此处不讨论这些选项。

1
0 196
文章 姚 鑫 · 六月 12, 2022 5m read

第七章 日期和时间构造

验证和转换 ODBC 日期、时间或时间戳。

大纲

{d 'yyyy-mm-dd'}
{d nnnnnn}

{t 'hh:mm:ss[.fff]'}
{t nnnnn.nnn}

{ts 'yyyy-mm-dd [hh:mm:ss.fff]'}
{ts 'mm/dd/yyyy [hh:mm:ss.fff]'}
{ts nnnnnn}

描述

这些构造采用 ODBC 日期、时间或时间戳格式的整数或字符串,并将其转换为相应的 IRIS 日期、时间或时间戳格式。他们执行数据输入以及值和范围检查。

{d 'string'}

{d 'string'}日期构造验证 ODBC 格式的日期。如果日期有效,它将以 IRIS 日期格式存储(逻辑模式)作为 的整数计数值。 IRIS 不附加默认时间值。要支持早于 的日期,必须在表中定义数据类型为 的日期字段,其中 是从 倒数的负天数(第 0 天)最大为 。

  • 小于 -672045 (0001-01-01) 或大于 2980013 (9999-12-31) 的整数会生成 错误。
  • 无效日期(例如非 ODBC 格式的日期或非闰年的日期 02-29): IRIS 生成 错误:是无效的 ODBC/JDBC 日期值”。
  • ODBC 时间戳值: IRIS 验证时间戳的日期和时间部分。
0
0 323
文章 姚 鑫 · 六月 11, 2022 4m read

第六章 数据类型(五)

数据类型的整数代码

在查询元数据和其他上下文中,为列定义的数据类型可以作为整数代码返回。 CType(客户端数据类型)整数代码列在 %SQL.StatementColumn clientType 属性中。

ODBC 和 JDBC 使用 xDBC 数据类型代码 (SQLType)。 ODBC 数据类型代码由 方法返回,如上例所示。 SQL Shell 元数据还返回 ODBC 数据类型代码。 JDBC 代码与 ODBC 代码相同,除了时间和日期数据类型的表示。下面列出了这些 ODBC 和 JDBC 值:

ODBC JDBC
0
0 154
文章 Michael Lei · 六月 11, 2022 2m read

在检查我们的^pButtons(在IRIS中改名为^SystemPerformance)性能监控工具的文档时,一位客户告诉我。"我理解所有内容,但我希望它能更简单......更容易定义配置文件,管理它们等等"。

在这次会议之后,我认为尝试为其提供一些更简单的人机界面是一个不错的试验。

这方面的第一步是在现有的pButtons例程上包裹一个基于类的API。

我还能够添加一些更多的 "功能",比如显示当前正在运行的配置文件,它们剩余的运行时间,以前运行的进程等等。

下一步是在这个API的基础上添加一个REST API类。

有了这个工件(pButtons REST API),人们就可以在上面建立一个比较时髦的用户界面。

举个🌰: -

0
0 288
文章 姚 鑫 · 六月 10, 2022 8m read

第五章 数据类型(四)

Strings

%Library.String 数据类型支持的最大字符串长度为 3,641,144 个字符。通常,极长的字符串应分配为 %Stream.GlobalCharacter 数据类型之一。

因为 IRIS 支持 xDBC 协议 50 和更高版本,所以没有强制执行 ODBC 或 JDBC 字符串长度限制。如果 IRIS 实例和 ODBC 驱动程序支持不同的协议,则使用两个协议中较低的一个。实际使用的协议记录在 ODBC 日志中。

请注意,默认情况下 IRIS 建立系统范围的 ODBC 最大长度为 ;此 ODBC 最大长度是可配置的。

列表结构

IRIS 支持列表结构数据类型 %List(数据类型类 )。这是一种压缩的二进制格式,不会映射到 SQL 的相应本机数据类型。在其内部表示中,它对应于数据类型 ,默认 为 。 IRIS 支持列表结构数据类型 (数据类型类 )对应于数据类型 ,默认 为 。

因此,动态 SQL 不能在 子句比较中使用 数据。也不能使用 INSERT 或 来设置 类型的属性值。

动态 SQL 将列表结构化数据的数据类型返回为 。要确定查询中的字段是数据类型 还是 ,可以使用 布尔标志。这些数据类型的 (客户端数据类型)整数代码是 。

如果使用 ODBC 或 JDBC 客户端,则使用 转换将 数据投影到 VARCHAR

0
0 251
文章 姚 鑫 · 六月 9, 2022 6m read

第四章 数据类型(三)

日期、时间、PosixTime 和时间戳数据类型

可以定义日期、时间和时间戳数据类型,并通过标准 SQL 日期和时间函数相互转换日期和时间戳。例如,可以使用 CURRENT_DATECURRENT_TIMESTAMP 作为使用该数据类型定义的字段的输入,或者使用 DATEADD、、 或 来操作使用该数据类型存储的日期值。

数据类型类 、、%Library.PosixTime、 和 对于 的处理方式如下:

  1. %Library.Date 类以及逻辑值为 +$HOROLOG$HOROLOG 的日期部分)的任何用户定义数据类型类都应使用 作为 。默认情况下, 和对应的 数据类型只接受正整数, 代表 。要支持早于 的日期,必须在表中定义数据类型为 的日期字段,其中 是从 倒数的负天数最大为。 可以将日期值存储为 到 范围内的无符号或负整数。日期值可以按如下方式输入:
  • 逻辑模式接受 整数值,例如 (2020 年 8 月 28 日)。
  • 显示模式使用 转换方法。它接受当前语言环境的显示格式的日期,例如。它还接受逻辑日期值(+HOROLOG 整数值)。
  • ODBC 模式使用 转换方法。它接受 ODBC 标准格式的日期,例如。它还接受逻辑日期值(+HOROLOG 整数值)。
  1. %Library.Time
0
0 241
文章 姚 鑫 · 六月 8, 2022 4m read

第三章 数据类型(二)

SQL 系统数据类型映射

上表中为 DDL 和 IRIS 数据类型表达式显示的语法是为 SQL.SystemDataTypes 配置的默认映射。对于提供的系统数据类型和用户数据类型,有单独的映射表可用。

要查看和修改当前数据类型映射,请转到管理门户,选择系统管理、配置、SQL 和对象设置、系统 DDL 映射。

了解 DDL 数据类型映射

将数据类型从 DDL 映射到 IRIS 时,常规参数和函数参数遵循以下规则:

  • 常规参数 - 这些在 DDL 数据类型和 IRIS 数据类型中以 %# 格式标识。例如:
     VARCHAR(%1)

映射到:

     %String(MAXLEN=%1)

因此,DDL 数据类型为:

     VARCHAR(10)

映射到:

  • 函数参数 — 当 DDL 数据类型中的参数必须经过一些转换才能放入 IRIS 数据类型中时,使用这些参数。这方面的一个例子是将 DDL 数据类型的数值精度和比例参数转换为 IRIS 数据类型的 MAXVALMINVALSCALE 参数。例如:

映射到:

数据类型 采用参数 和

0
0 140
文章 姚 鑫 · 六月 7, 2022 9m read

第二章 数据类型(一)

指定 SQL 实体(如列)可以包含的数据类型。

描述

此处描述了以下主题:

  • 支持的 DDL 数据类型及其类属性映射表

  • 数据类型优先级用于从具有不同数据类型的数据值中选择最具包容性的数据类型

  • 日期、时间、PosixTime 和时间戳数据类型

    • 使用SqlCategory和用户定义的标准
    • 对 1840 年 12 月 31 日之前的日期的可配置支持
  • 支持字符串数据类型、列表数据类型和流数据类型

  • 支持 ROWVERSION 数据类型

  • IRIS® 数据平台 ODBC / JDBC 公开的数据类型

  • 使用查询元数据方法和数据类型整数代码确定列的数据类型

  • 创建用户定义的数据类型

  • 处理未定义的数据类型

  • 数据类型转换函数

数据类型指定列可以保存的值的种类。在使用 CREATE TABLEALTER TABLE 定义字段时指定数据类型。定义 SQL 字段时,可以指定下表(左列)中列出的 数据类型。当指定其中一种 数据类型时,它会映射到右侧列中列出的IRIS 数据类型类。在IRIS 中定义字段时,可以指定 数据类型或数据类型类。 数据类型名称不区分大小写。数据类型类名称区分大小写。 数据类型类可以通过全名(例如,)或短名()来指定。

它们映射到的 数据类型和数据类型类通常提供不同的参数和参数默认值。

0
0 213
文章 Michael Lei · 六月 7, 2022 3m read

我今天遇到了一个有趣的ObjectScript用例,有一个通用的解决方案,我想与大家分享。

用例:

我有一个JSON数组(在本例中具体而言是一个来自Jira的问题数组),我想在几个字段上进行聚合--例如,类别、优先级和问题类型。然后,我想把聚合的数据编平化到一个简单的列表中,其中包含每个组的总数。当然,对于聚合来说,使用一个本地数组的形式是有意义的,即:

agg(category, priority, type) = total

这样,对于输入数组中的每一条记录,我可以只用:

Do $increment(agg(category, priority, type))

但是一旦我做了聚合,我想把它变成一种更容易迭代的形式,比如一个整数下标的数组:

基础解决方案:

简单的方法是,用$Order嵌套三个For循环--比如说:

Set category = ""
For {
    Set category = $Order(agg(category))
    Quit:category=""
    
    Set priority = ""
    For {
        Set priority = $Order(agg(category,priority))
        Quit:priority=""
        
        Set type = ""
        For {
            Set type = $Order(agg(category,priority,type),1,total)
            Quit:type=""
            
            Set summary($i(summary)) = $listbuild(total,category,priority,type)
        }
    }
0
0 302
文章 Michael Lei · 六月 7, 2022 3m read

绕过ODBC使用ObjectScript访问远程系统

这是一个在 IRIS 2020.1 和 Caché 2018.1.3 上工作的代码示例
不会与新版本保持同步
也不会获得 InterSystems 提供的支持服务!   

我们经常会遇到这样的情况,由于各种原因ODBC是访问一个远程系统的唯一选择。如果你只需要检查或改变表,这就足够了。但你不能直接执行一些命令或改变一些Global。

特别感谢@Anna Golitsyna 启发我发表此文。

这个例子提供了3种 SQLprocedure 方法来实现访问远程系统这个目的,如果其他的访问方式被阻止,通常是被一些防火墙阻止。

  • SQLprocedure Ping() 返回 Server::Namespace::$ZV 并允许检查连接
  • SQLprocedure Xcmd(<commandline>,<resultvar>)  执行你提交的命令行,并返回一个存放在你命名的变量中的结果。
  • SQLprocedure Gset(<global>,<subscript>,<value>,<$data>)  允许你设置或删除一个Global节点 。参数<global> 是远程命名空间中的GlobalName,包括前导符;例如'^MyGlobal'  (注意:sql 用单引号!)
0
0 207
文章 Jingwei Wang · 六月 6, 2022 2m read

Object Script(六)

ObjectScript中的变量是没有类型的,也就是说,它们没有一个指定的数据类型,可以接受任何数据值。

ObjectScript支持以下几种类型的变量:

1. 本地变量 :只有创建它的进程可以访问的变量,当该进程终止时,改变量将自动删除。一个本地变量可以从任何命名空间访问。

示例:

     SET str = "A string"

2. 进程私有的全局变量 : 只有创建它的进程可以访问的变量,并且在进程结束时不再存在。一个进程专用的全局变量可以从任何命名空间访问,因为它与命名空间无关。进程私有的全局变量对于临时存储大数据值特别有用。在许多情况下,它们可以替代Mgr/Temp目录的使用,在进程终止时提供自动清理。

示例:

       SET ^||flintstones(1)="Fred"

       SET ^||flintstones(2)="Wilma"

3. 全局变量 : 一个存储在InterSystems IRIS数据库中的持久性变量。一个全局变量可以从任何进程中访问,并且在创建它的进程终止后仍然存在。全局变量是针对个别命名空间的。

示例:

SET ^myglobal = "This is a global stored in the current namespace"

4.

0
0 200
文章 Jingwei Wang · 六月 6, 2022 1m read

Object Script(五)

  • 在类中定义属性

Property PropName as Classname(PARAM1=value,PARAM2=value) [ Keywords ] ;
Property SSN As %String(PATTERN = "3N1""-""2N1""-""4N") [ Required ];
  • 创建函数示例

Studio创建:

将下段代码填写入建好的类中:

ClassMethod FindPatient(id As %String) As HIS.Patient


Terminal 调用:

  • 参数

传入参数的类型分为普通参数,输出型参数和返回参数:

普通参数 (传值参数):

输出型参数(引用) :

返回参数

  • 类的重命名

包名、类名不能修改,可以用

0
0 274
文章 姚 鑫 · 六月 3, 2022 2m read

第161章 SQL函数 YEAR

返回日期表达式的年份的日期函数。

大纲

YEAR(date-expression)

{fn YEAR(date-expression)}

参数

  • date-expression - 计算结果为 日期整数、ODBC 日期字符串或时间戳的表达式。此表达式可以是列名、另一个标量函数的结果或日期或时间戳字面量。

描述

YEAR 将日期整数($HOROLOG 日期)、 格式日期字符串或时间戳作为输入。 以整数形式返回相应的年份。

日期表达式时间戳可以是数据类型 (编码的 位有符号整数),也可以是数据类型 %Library.TimeStamp ()。

年份 () 部分应该是 到 范围内的四位整数。输入时前导零是可选的。前导零在输出上被抑制。两位数的年份不会扩展到四位数。

的日期部分经过验证,并且必须包含 到 12 范围内的月份以及指定月份和年份的有效日期值。否则,将生成 错误 。

如果日期表达式的时间部分存在,则对其进行验证,但可以省略。

注意:为了与 内部日期表示兼容,强烈建议将所有年份值表示为 到 范围内的四位整数。

和 SQL 函数支持“儒略日期”,可用于表示 0001 之前的年份。 提供了支持此类儒略日期的方法调用。

年份格式默认为四位数年份。要更改今年显示默认值,请使用带有 选项的 命令。

0
0 134