立即处理可能影响正在运行的系统原始 payload 不含 superseded_by 标记。按要求,merge commit 不计入 entries。数值修复分支创建时 commit 文件仍为 16812,随后在 build 16828 之后合并,因此最终 repository head 仍标为 2.4.16828。
数值解析得到强化,DHCP setup 消除了悬空指针
数值转换现在会拒绝格式错误的小数、指数溢出以及超出 signed 或 Currency 边界的值,不再发生回绕或接受无效 JSON。TDhcpProcess.Setup 不再跨 scope array 变更保留指针,从而避免可能的 GPF 或 deadlock。日期时间转换新增多项基于整数的 API,同时加入原始 Keccak-256 与 Microsoft TimeSpan 支持;ToNcsaShort 的一次签名变更需要检查源码。
要点
- 应采用 build 2.4.16828 的最终 head:数值正确性修复在其上合并,但 build number 没有再次递增。
- GetInteger、GetExtended 和 GetNumericVariantFromJson 现在会拒绝溢出以及无效的小数或指数语法,不再返回回绕或含糊的值。
- TDhcpProcess.Setup 会在 PrepareScope 可能改变底层 array 前复制每个 scope,消除了已确认的 GPF 或 deadlock 路径。
- 向 TSynSystemTime.ToNcsaShort 传递普通 ShortString 的调用方必须把该 var 参数改为 TShort23,或使用 TShort23 局部变量。
- 日期时间层新增整数 Gregorian、Unix millisecond、Julian day、HTTP date 与 Microsoft TimeSpan helper,LDAP 也能解码 atsTimeSpan。
- mormot.crypt.core 现在支持 Ethereum 等协议使用的原始 Keccak-256 padding,它与 SHA3-256 不同。
升级建议
解析不可信数值 JSON 或重新配置 DHCP scope 的生产系统应采用最终修订 692bbbf21960be5fdf89921673a34f928fadddfc;它仍显示 build 2.4.16828。请搜索 ToNcsaShort 调用:声明为普通 ShortString 的 var 输出必须改成 TShort23,或通过 TShort23 局部变量转接。superseded_by 数据没有标记需要避开的中间 build。
21 条中的 21 条 · 上游 23 次提交
1
高
ToNcsaShort 现在要求精确的 TShort23 输出变量
mormot.core.datetime 新增 TSynSystemTime.AppendTime 与 AppendInterval,用于紧凑格式化时间和 duration。公开 ToNcsaShort 的 var 参数由 ShortString 改为 TShort23,以匹配固定最大输出长度。
破坏性变更
mormot.core.base+1
5b281032+32-5
core: new TSynSystemTime.AppendTime/AppendInterval methods
影响
由于 Pascal var 参数要求精确类型,传入声明为普通 ShortString 变量的 Delphi 或 FPC 调用可能编译失败。已使用 TShort23 的调用保持兼容。
需要迁移
搜索 ToNcsaShort。将每个输出变量声明为 TShort23,或先传入 TShort23 局部变量,再复制到更宽的 ShortString。
公开 API
TSynSystemTime.AppendTimeadded — 追加 hh:mm:ss,可选毫秒。TSynSystemTime.AppendIntervaladded — 格式化天数与 TSynSystemTime 时间字段。TSynSystemTime.ToNcsaShortsignature-changed — var 输出类型由 ShortString 改为 TShort23。
2
高
格式错误或溢出的数值不再通过 JSON 解析
mormot.core.base 限制 GetInteger 的数字累积和 signed PtrInt 边界。mormot.core.text 的 GetExtended 拒绝重复小数点与指数溢出。mormot.core.variants 强制执行 JSON 数值语法和 Int64/Currency 边界,仅在 AllowVarDouble 允许时将越界值提升为 varDouble。
修复
mormot.core.base+2
d48f4634+222-25
core: fix numeric conversion overflow and malformed decimal input
影响
解析不可信数值文本的 backend 不再得到回绕整数、被接受的错误小数或错误 Currency variant。带前导零的 JSON 数、空指数及超出 signed 边界的值现在会失败,不再被静默转换。
建议升级
升级到最终 head,并针对外部客户端可能提供的边界整数、Currency 限制以及错误小数或指数输入运行 parser 测试。
公开 API
GetIntegerbehaviour-changed — 溢出现在设置 err,不再回绕。GetExtendedbehaviour-changed — 错误小数与指数溢出现在设置 err。GetNumericVariantFromJsonbehaviour-changed — 现在强制执行 JSON 语法及 signed/Currency 边界。
3
高
DHCP scope 更新不再解引用已重新分配的存储
TDhcpProcess.Setup 现在先把每个旧 scope 复制到新 array,再调用 PrepareScope。PrepareScope 可能改变底层 array,旧顺序会在复制前让源 pointer 悬空。
修复
mormot.net.dhcp
1cd2f994+5-5
net: fixed GPF or deadlock in TDhcpProcess.Setup()
影响
运行中的 DHCP 服务重新应用或修改 scope 配置时,可避开已确认的 GPF 或 deadlock 路径。这影响使用 mormot.net.dhcp 的 Delphi 与 FPC backend。
建议升级
升级启动后会调用 Setup 的 DHCP 服务,并在负载下测试在线 scope reload 与 shutdown。
4
中
Gregorian 编码公开,TryEncode 改用 var 语义
mormot.core.datetime 公开 EncodeGregorian,用于转换经验证的年、月、日。TryEncodeDate 与 TryEncodeTime 以整数检查重写,其目标参数由 out 改为 var。
破坏性变更
mormot.core.datetime
20876cb4+83-65
core: new EncodeGregorian() low-level computation function
影响
普通直接调用仍源码兼容,但要求精确 out 签名的 procedure variable、wrapper 或 override 可能在 Delphi 或 FPC 下无法编译。无效字段仍返回 false。
值得一看
公开 API
EncodeGregorianadded — 验证 1..9999 年、月和日,并返回内部 Gregorian day number。TryEncodeDatesignature-changed — 目标参数从 out 改为 var。TryEncodeTimesignature-changed — 目标参数从 out 改为 var。
5
中
负 Unix timestamp 获得安全的整数转换
TSynSystemTime.FromUnixTime 与 FromUnixMsTime 现在把 epoch 拆成天数和余数,将负余数调整到前一天,再调用 FromJulianDay 以及 FromSec 或 FromMS。
修复
mormot.core.datetime
91739dd8+32-12
core: rewritten TSynSystemTime.FromUnixTime/FromUnixMsTime
影响
1970 年前的值和毫秒 timestamp 在 Delphi 与 FPC 上避免 TDateTime 舍入,并明确处理负余数。普通正 timestamp 的公开结果不变。
6
中
原始 Keccak-256 加入 SHA-3 系列
mormot.crypt.core 在 TSha3Algo 末尾追加 KECCAK_256,不改变现有 ordinal,并新增 Keccak256Full 与 Keccak256。实现使用原始 Keccak padding,并测试空输入、abc 及 rate 边界向量。
新功能
mormot.crypt.core
c2bc1bf0+70-5
crypt: support original Keccak-256
影响
Delphi 与 FPC backend 可计算协议兼容的 Keccak-256,不会与标准 SHA3-256 混淆。现有 TSha3Algo 值保持其数值表示。
值得一看
公开 API
TSha3Algo.KECCAK_256added — 原始 Keccak-256 padding 与 256-bit 输出。Keccak256Fulladded — 将 buffer hash 到 THash256。Keccak256added — 返回 RawByteString 的小写十六进制 Keccak-256。
7
中
TSynSystemTime 可直接解码 Julian day
mormot.core.datetime 新增 TSynSystemTime.FromJulianDay,并让 FromDate 使用新的整数 Gregorian 分解,而不是 TDateTime 转换。
新功能
mormot.core.datetime
f8fe89b2+46-21
core: new TSynSystemTime.FromJulianDay method
影响
已有 Julian day 的 Delphi 与 FPC 代码可在不做浮点转换的情况下填充 TSynSystemTime。现有 FromDate 调用接口不变。
值得一看
公开 API
TSynSystemTime.FromJulianDayadded — 从 Julian day number 填充日期字段。
8
中
Microsoft TimeSpan tick 可转换为结构化及文本 interval
mormot.core.datetime 新增 TimeSpanAppendShort、TimeSpanToTextVar、TimeSpanToText 与 TSynSystemTime.FromTimeSpan。signed Microsoft 100 ns tick 被拆分为天数和时间字段,并以毫秒精度输出。
新功能
mormot.core.datetime
1219fff2+48-2
core: Microsoft TimeSpan 100 ns ticks decoding support
影响
Delphi 与 FPC backend 可无需自定义运算便解码目录或 .NET duration。输出结果按设计不保留亚毫秒 tick 精度。
值得一看
公开 API
TimeSpanAppendShortadded — 追加格式化的 Microsoft TimeSpan。TimeSpanToTextVaradded — 将 interval 写入文本 variant。TimeSpanToTextadded — 以 RawUtf8 返回格式化 interval。TSynSystemTime.FromTimeSpanadded — 将 signed 100 ns tick 解码为天数及时间字段。
9
中
TSynSystemTime 可直接输出 Unix 毫秒
mormot.core.datetime 新增 TSynSystemTime.ToUnixMsTime,并基于 EncodeGregorian 重写 ToUnixTime,使用整数日期时间运算而非 TDateTime 转换。
新功能
mormot.core.datetime
c5731496+15-7
core: new TSynSystemTime.ToUnixTime/ToUnixMSTime methods
影响
Backend 可在不经过浮点中间值的情况下获得毫秒 epoch。现有 ToUnixTime 调用保持相同签名,但使用新的整数实现。
值得一看
公开 API
TSynSystemTime.ToUnixMsTimeadded — 返回 Unix epoch 起的毫秒数。TSynSystemTime.ToUnixTimebehaviour-changed — 现使用整数 Gregorian 运算。
10
中
LDAP 可输出 Microsoft TimeSpan 属性
mormot.net.ldap 在 TLdapAttributeTypeStorage 中新增 atsTimeSpan。属性解码读取 signed 100 ns tick 值,并传给 TimeSpanToTextVar 输出可读 interval。
新功能
mormot.net.ldap
22e8328a+9-2
net: introducing atsTimeSpan LDP attribute decoding
影响
LDAP backend 可将 Microsoft duration 属性映射为文本,不再保留不透明的 64-bit tick 表示。新成员追加在末尾,因此现有属性存储模式的 ordinal 不变。
值得一看
公开 API
TLdapAttributeTypeStorage.atsTimeSpanadded — 将 signed Microsoft TimeSpan tick 解码为文本。
11
中
TTimeLogBits 的 Unix 转换避开 TDateTime 运算
mormot.core.datetime 将 TTimeLogBits.FromUnixTime 经由 TSynSystemTime 处理,以秒精度实现 FromUnixMsTime,并用 EncodeGregorian 整数运算计算 ToUnixTime。
性能
mormot.core.datetime
f5669b62+20-19
core: enhanced TTimeLogBits conversion methods
影响
Delphi 和 FPC backend 获得确定性的整数转换并避免浮点舍入。TTimeLogBits 仍只保存整秒,因此毫秒输入会按设计截断。
12
中
数据库日期适配器统一使用无效时返回零的 encoder
mormot.core.datetime、mormot.db.raw.odbc 与 mormot.db.raw.oracle 在 ISO、SQL_TIMESTAMP_STRUCT 和 TOracleDate 转换路径中,用 EncodeDateOrZero 与 EncodeTimeOrZero 替换重复的 TryEncodeDate/TryEncodeTime 分支。
内部重构
mormot.core.datetime+2
d7a78957+36-73
core/db: use EncodeDateOrZero/EncodeTimeOrZero when possible
影响
无效输入按设计仍返回零,但 Delphi/FPC 数据库 backend 现在共用同一验证实现。现有 ODBC 与 Oracle 应用调用无需变化。
13
低
日期时间 encoder 新增返回零的 wrapper
mormot.core.datetime 公开 EncodeDateOrZero 与 EncodeTimeOrZero。两者分别调用对应的 TryEncode,并在字段无效时返回零。
新功能
mormot.core.datetime
1d5e8861+35-2
core: introducing EncodeDateOrZero/EncodeTimeOrZero wrappers
影响
当零可作为无效 sentinel 时,Delphi 和 FPC 调用方可省去布尔分支。现有 API 与行为不变。
值得一看
公开 API
EncodeDateOrZeroadded — 日期字段无效时返回零。EncodeTimeOrZeroadded — 时间字段无效时返回零。
14
低
ISO 时间片段新增可复用 buffer parser
mormot.core.datetime 新增 TSynSystemTime.FromTimeBuffer,从 pointer 与 length 解析小时、分钟和可选秒字段。FromHttpDateBuffer 复用它处理时间部分。
新功能
mormot.core.datetime
e570e19e+23-10
core: new TSynSystemTime.FromTimeBuffer method
影响
面向 buffer 的 parser 可在不分配字符串的情况下填充 TSynSystemTime。现有 HTTP date 解析保留原接受格式并复用该 helper。
值得一看
公开 API
TSynSystemTime.FromTimeBufferadded — 从 pointer 与 byte length 解析时间。
15
低
POSIX epoch 转换改用优化后的 Gregorian splitter
mormot.core.os.posix 中 POSIX EpochToSystemTime 的实现改用共享整数例程 DaysToGregorian,替代原先的日历分解。
性能
mormot.core.os.posix
5313e545+34-29
core: rewritten EpochToSystemTime() on POSIX
影响
POSIX Delphi/FPC backend 减少日历转换开销。没有公开签名变化,也不需要应用迁移。
16
低
闰年判断改用无除法整数运算
mormot.core.datetime 用 inline 整数比较与 reciprocal 运算替代取模除法来重写 IsLeapYear,并保持 Gregorian 闰年规则。
性能
mormot.core.datetime
8d552e6b+26-30
17
低
HTTP date 现改用整数 system-time 转换路径
mormot.core.datetime 让 TSynSystemTime.FromHttpDateBuffer 复用 FromTimeBuffer,并通过 TSynSystemTime.ToUnixTime 转换解析后的 HTTP date,不再经过 TDateTime。tolocaltime 参数现默认 false。
性能
mormot.core.datetime
e498b9ef+12-14
core: enhanced HTTP date support
影响
显式传参的现有调用行为不变。省略 tolocaltime 的调用现在使用明确的 UTC 默认值,Delphi 和 FPC 的 HTTP 解析也避免了浮点日期转换。
公开 API
TSynSystemTime.FromHttpDateBuffersignature-changed — tolocaltime 现默认 false。
18
低
Delphi Win64 年份格式化以乘法替代除法
mormot.core.base 新增 DIV100_INV,并在 Delphi Win64 的 YearToPChar 汇编路径中使用 reciprocal multiplication。现有 x86 与 x64 汇编字面值统一为同一常量。
性能
mormot.core.base+2
906a9037+16-10
core: optimized YearToPChar() for Delphi Win64
影响
只有 Delphi Win64 格式化成本会降低;FPC 与其他目标保持等效代码。应用调用与输出不变。
公开 API
DIV100_INVadded — 用于除以 100 的公开 reciprocal constant。
19
低
正负 TimeSpan 值新增回归测试
test.core.base 新增 Microsoft TimeSpan 双向转换断言,包括 signed interval。生产 unit 的改动明确了 100 ns tick scale。
测试
mormot.core.os
d3dfb00c+27-3
tests: validate TimeSpan conversion
影响
应用代码无需改动。Delphi 与 FPC build 增加对符号处理及前一 commit 引入文本格式的覆盖。
20
低
日期、Unix 与 hash 边界情况新增回归测试
test.core.base 新增闰年、Unix 秒与 Unix 毫秒往返及 HTTP date 断言。test.core.crypt 补充 SHA-3 和 Keccak 边界覆盖。
测试
6356fbaa+17-6
tests: cover latest date/time conversion functions
影响
应用代码无需改动。Delphi 和 FPC build 为本批次引入的转换路径增加了回归覆盖。
21
低
内部命名与声明清理,不改变行为
多个 core、search、thread 与 DHCP 声明被重命名、重排或补充说明。内嵌 diff 和 commit message 均未显示功能变化或公开 API 移除。
杂项
mormot.core.datetime+3
bebea2f9+12-12
all: some code cleaning with no functional change
影响
对应用代码、Delphi/FPC 行为或存储数据均无影响;这只是源码清理。