InfluxDB: 规范批量写入 Line Protocol,并声明批量能力#87
Conversation
|
比如 `using System.Data; namespace XCode.DataAccessLayer; class InfluxDB : RemoteDb public override DatabaseType Type => DatabaseType.InfluxDB; } /// internal class InfluxDBSession : RemoteDbSession { #region 构造函数 public InfluxDBSession(IDatabase db) : base(db) { } #endregion } /// class InfluxDBMetaData : RemoteDbMetaData { public InfluxDBMetaData() => Types = _DataTypes; import ""influxdata/influxdb/schema"" import ""influxdata/influxdb/schema"" } |
There was a problem hiding this comment.
Pull request overview
本 PR 聚焦修正 InfluxDB 批量写入的 Line Protocol 构造细节,并补齐 InfluxDB 的批量能力声明,以便 XCode 批量接口在 Insert/Upsert 分流时能正确命中 InfluxDB 路径,同时提升跨平台协议一致性。
Changes:
- 在 InfluxDB 实现中声明
BatchCapability.Insert | BatchCapability.Upsert,使批量分流可识别 InfluxDB 的能力边界。 - 收敛批量写入 Line Protocol 构造逻辑:字段类型格式化(整数后缀、布尔小写、浮点 InvariantCulture)、时间列作为行尾 timestamp 且避免冗余写入、换行符强制使用
\n。 - 新增纯单元测试覆盖 Line Protocol 格式化与时间列去重写入行为。
Reviewed changes
Copilot reviewed 3 out of 3 changed files in this pull request and generated 2 comments.
| File | Description |
|---|---|
| XUnitTest.XCode/DataAccessLayer/InfluxDBLineProtocolTests.cs | 新增 Line Protocol 纯单元测试,验证字段格式、时间列不重复写入与换行符一致性 |
| XUnitTest.XCode/DataAccessLayer/BatchCapabilityTests.cs | 增加 InfluxDB 的 BatchCapability 断言用例 |
| XCode/DataAccessLayer/Database/InfluxDB.cs | 实现 BatchCapability 声明,并调整批量写入 Line Protocol 构造与字段值格式化 |
| public override String FormatValue(IDataColumn field, Object? value) | ||
| { | ||
| if (value == null) | ||
| return field.Nullable ? "null" : ""; | ||
|
|
||
| var code = System.Type.GetTypeCode(field.DataType); | ||
| if (code == TypeCode.String) | ||
| { | ||
| if (value == null) | ||
| return field.Nullable ? "null" : "\"\""; | ||
|
|
||
| return "\"" + value.ToString()?.Replace("\"", "\\\"") + "\""; | ||
| } | ||
| else if (code == TypeCode.Boolean) | ||
| { | ||
| return value.ToBoolean() ? "true" : "false"; | ||
| } | ||
| else if (code is TypeCode.SByte or TypeCode.Byte or TypeCode.Int16 or TypeCode.UInt16 or TypeCode.Int32 or TypeCode.UInt32 or TypeCode.Int64) | ||
| { | ||
| return $"{value}i"; | ||
| } | ||
| else if (code == TypeCode.UInt64) | ||
| { | ||
| return $"{value}u"; | ||
| } | ||
| else if (code is TypeCode.Single or TypeCode.Double or TypeCode.Decimal) | ||
| { | ||
| return Convert.ToString(value, CultureInfo.InvariantCulture) ?? "0"; | ||
| } |
| var timeCol = columns.FirstOrDefault(c => | ||
| { | ||
| var name = c.Name ?? c.ColumnName; | ||
| return !name.IsNullOrEmpty() && name.EqualIgnoreCase("Time", "CreateTime", "UpdateTime") && entity[name] != null; | ||
| }); |
InfluxDB 批量写入路径存在协议细节偏差:数值类型格式不规范、时间字段会重复写入、以及换行符在 Windows 下可能使用
\r\n。本 PR 对批量写入构造逻辑做了收敛,并补齐 InfluxDB 的BatchCapability声明以对齐批量接口分流。Line Protocol 值格式标准化
7i,UInt64为u)true/false时间列去重写入
Time/CreateTime/UpdateTime仅作为行尾 timestamp 参与写入换行符协议一致性
\n,保证 Line Protocol 兼容性批量能力声明对齐
BatchCapability.Insert | BatchCapability.UpsertEntity.Insert/Upsert的批量分流可识别并命中 InfluxDBSession 对应路径示例(构造结果形态)