)]}'
{
  "commit": "57717e6ebf2572c898c0890fc5d129c52a1398f5",
  "tree": "f4ff62d5c524f2293af32d618e411f73e6fa4d13",
  "parents": [
    "9fd7a9c7859b46b45176737e660e70cd2124f22a"
  ],
  "author": {
    "name": "CritasWang",
    "email": "critas@outlook.com",
    "time": "Tue Apr 28 15:17:38 2026 +0800"
  },
  "committer": {
    "name": "GitHub",
    "email": "noreply@github.com",
    "time": "Tue Apr 28 15:17:38 2026 +0800"
  },
  "message": "Fix SessionDataSet: row count, async dispose, and null measurement issues (#53, #54, #55) (#56)\n\n* Fix SessionDataSet: row count, async dispose, and null measurement issues (#53, #54, #55)\n修复 SessionDataSet 行数统计、异步释放及空值测点问题\n\n- Fix CurrentBatchRowCount() always returning 0 by eagerly constructing\n  the first TsBlock in RpcDataSet constructor when initial data is available\n  修复 CurrentBatchRowCount() 始终返回 0 的问题，在构造函数中预先反序列化首个 TsBlock\n\n- Add IAsyncDisposable to SessionDataSet and RpcDataSet, providing\n  DisposeAsync() that properly awaits Close() to avoid sync-over-async deadlocks\n  为 SessionDataSet 和 RpcDataSet 添加 IAsyncDisposable 接口，支持 await using 语法\n\n- Fix GetRow() including null-valued columns in RowRecord by using\n  IsNull() check before calling type-specific getters, instead of relying\n  on value type null checks which always pass for int/bool/float/etc.\n  修复 GetRow() 中值类型默认值绕过 null 检查导致空值列被错误包含的问题\n\n* Fix SessionDataSet.Close() idempotency and add regression tests\n修复 SessionDataSet.Close() 幂等性问题并添加回归测试\n\n- Set _isClosed \u003d true in Close() finally block to prevent\n  NullReferenceException on repeated Close/Dispose/DisposeAsync calls\n  在 Close() 的 finally 块中设置 _isClosed \u003d true，防止重复调用导致空引用异常\n\n- Add RpcDataSetTests covering:\n  - CurrentBatchRowCount returns correct size before first row read\n  - CurrentBatchRowCount returns 0 when no data\n  - GetRow excludes null-valued measurements for value types (BOOLEAN, INT32, DOUBLE)\n  - DataTypes/Measurements/Values lists stay consistent\n  添加 RpcDataSet 回归测试覆盖行数统计和空值测点排除",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "350c417eb55b453be86aed2aa90ae6312a72c318",
      "old_mode": 33188,
      "old_path": "src/Apache.IoTDB/DataStructure/RpcDataSet.cs",
      "new_id": "1cc7c793ca2957738166bd8e0b7de7dec987055c",
      "new_mode": 33188,
      "new_path": "src/Apache.IoTDB/DataStructure/RpcDataSet.cs"
    },
    {
      "type": "modify",
      "old_id": "dc21928db0e62676c2eff71365d79bd58c1ff63a",
      "old_mode": 33188,
      "old_path": "src/Apache.IoTDB/DataStructure/SessionDataSet.cs",
      "new_id": "bc276affd6b392a1eaae96e5e1cb04902ceb7def",
      "new_mode": 33188,
      "new_path": "src/Apache.IoTDB/DataStructure/SessionDataSet.cs"
    },
    {
      "type": "add",
      "old_id": "0000000000000000000000000000000000000000",
      "old_mode": 0,
      "old_path": "/dev/null",
      "new_id": "cce3bb4ff26dc29289f3c93e9c8351bf67166d28",
      "new_mode": 33188,
      "new_path": "tests/Apache.IoTDB.Tests/RpcDataSetTests.cs"
    }
  ]
}
