97 lines
1.7 KiB
Go
97 lines
1.7 KiB
Go
package influxdb
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/InfluxCommunity/influxdb3-go/v2/influxdb3"
|
|
)
|
|
|
|
// Mapper 数据转换的接口
|
|
type Mapper[T any] interface {
|
|
// ToPoint 将数据转换为InfluxDB的Point格式
|
|
ToPoint(data *T) *influxdb3.Point
|
|
|
|
// ToData 将InfluxDB的Point转换为原始数据
|
|
ToData(point *influxdb3.Point) *T
|
|
}
|
|
|
|
// Insert 插入数据
|
|
func Insert[T any](ctx context.Context, c *Client, data *T, mapper Mapper[T]) error {
|
|
if c.cli == nil {
|
|
return ErrClientNotConnected
|
|
}
|
|
|
|
if data == nil {
|
|
return ErrEmptyData
|
|
}
|
|
|
|
point := mapper.ToPoint(data)
|
|
if point == nil {
|
|
return ErrInvalidPoint
|
|
}
|
|
|
|
err := c.Insert(ctx, point)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// BatchInsert 批量插入数据
|
|
func BatchInsert[T any](ctx context.Context, c *Client, data []*T, mapper Mapper[T]) error {
|
|
if c.cli == nil {
|
|
return ErrClientNotConnected
|
|
}
|
|
|
|
if len(data) == 0 {
|
|
return ErrEmptyData
|
|
}
|
|
|
|
points := make([]*influxdb3.Point, len(data))
|
|
for i, d := range data {
|
|
point := mapper.ToPoint(d)
|
|
if point == nil {
|
|
return ErrInvalidPoint
|
|
}
|
|
points[i] = point
|
|
}
|
|
|
|
err := c.BatchInsert(ctx, points)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// Query 查询数据
|
|
func Query[T any](ctx context.Context, c *Client, query string, mapper Mapper[T]) ([]*T, error) {
|
|
if c.cli == nil {
|
|
return nil, ErrClientNotConnected
|
|
}
|
|
|
|
iterator, err := c.Query(ctx, query)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
var dataset []*T
|
|
|
|
for iterator.Next() {
|
|
point, _ := iterator.AsPoints().AsPoint()
|
|
if point == nil {
|
|
return nil, ErrInvalidPoint
|
|
}
|
|
|
|
data := mapper.ToData(point)
|
|
dataset = append(dataset, data)
|
|
}
|
|
|
|
if iterator.Err() != nil {
|
|
return nil, iterator.Err()
|
|
}
|
|
|
|
return dataset, nil
|
|
}
|