fix(platform): return empty raw frames for missing tdengine tables

This commit is contained in:
lingniu
2026-07-04 08:36:37 +08:00
parent 6ce46f3011
commit 7c1ad16018
2 changed files with 78 additions and 0 deletions

View File

@@ -685,11 +685,17 @@ func (s *ProductionStore) RawFrames(ctx context.Context, query RawFrameQuery) (P
total := 0 total := 0
if built.CountText != "" { if built.CountText != "" {
if err := s.tdengine.QueryRowContext(ctx, built.CountText, built.CountArgs...).Scan(&total); err != nil { if err := s.tdengine.QueryRowContext(ctx, built.CountText, built.CountArgs...).Scan(&total); err != nil {
if isTDengineTableNotExist(err) {
return Page[RawFrameRow]{Items: []RawFrameRow{}, Total: 0, Limit: query.Limit, Offset: query.Offset}, nil
}
return Page[RawFrameRow]{}, err return Page[RawFrameRow]{}, err
} }
} }
rows, err := s.tdengine.QueryContext(ctx, built.Text, built.Args...) rows, err := s.tdengine.QueryContext(ctx, built.Text, built.Args...)
if err != nil { if err != nil {
if isTDengineTableNotExist(err) {
return Page[RawFrameRow]{Items: []RawFrameRow{}, Total: 0, Limit: query.Limit, Offset: query.Offset}, nil
}
return Page[RawFrameRow]{}, err return Page[RawFrameRow]{}, err
} }
defer rows.Close() defer rows.Close()

View File

@@ -1,11 +1,57 @@
package platform package platform
import ( import (
"context"
"database/sql"
"database/sql/driver"
"errors" "errors"
"io"
"strings" "strings"
"testing" "testing"
) )
func init() {
sql.Register("tdengine_missing_table_test", missingTableDriver{})
}
type missingTableDriver struct{}
func (missingTableDriver) Open(_ string) (driver.Conn, error) {
return missingTableConn{}, nil
}
type missingTableConn struct{}
func (missingTableConn) Prepare(_ string) (driver.Stmt, error) {
return nil, errors.New("not implemented")
}
func (missingTableConn) Close() error {
return nil
}
func (missingTableConn) Begin() (driver.Tx, error) {
return nil, errors.New("not implemented")
}
func (missingTableConn) QueryContext(_ context.Context, _ string, _ []driver.NamedValue) (driver.Rows, error) {
return nil, errors.New("[0x2603] Fail to get table info, error: Table does not exist")
}
type emptyRows struct{}
func (emptyRows) Columns() []string {
return []string{}
}
func (emptyRows) Close() error {
return nil
}
func (emptyRows) Next(_ []driver.Value) error {
return io.EOF
}
func TestBuildVehicleServiceOverviewBatchSQLUsesFuzzyKeywordMatching(t *testing.T) { func TestBuildVehicleServiceOverviewBatchSQLUsesFuzzyKeywordMatching(t *testing.T) {
built := buildVehicleServiceOverviewBatchSQL(VehicleOverviewBatchQuery{ built := buildVehicleServiceOverviewBatchSQL(VehicleOverviewBatchQuery{
Keywords: []string{"AG183", "R0LS1426"}, Keywords: []string{"AG183", "R0LS1426"},
@@ -35,6 +81,32 @@ func TestTDengineTableNotExistErrorIsRecognized(t *testing.T) {
} }
} }
func TestRawFramesReturnsEmptyPageWhenTDengineTableIsMissing(t *testing.T) {
tdengine, err := sql.Open("tdengine_missing_table_test", "")
if err != nil {
t.Fatalf("open test tdengine: %v", err)
}
defer tdengine.Close()
store := &ProductionStore{tdengine: tdengine, tdDatabase: "vehicle_test"}
page, err := store.RawFrames(context.Background(), RawFrameQuery{
Protocol: "GB32960",
VIN: "VIN_WITHOUT_SUBTABLE",
Limit: 20,
Offset: 40,
IncludeFields: true,
})
if err != nil {
t.Fatalf("missing raw frame table should return an empty page, got error: %v", err)
}
if page.Total != 0 || len(page.Items) != 0 || page.Limit != 20 || page.Offset != 40 {
t.Fatalf("missing raw frame table should preserve pagination with empty items, got %+v", page)
}
if page.Items == nil {
t.Fatalf("missing raw frame table should return a non-nil empty item list")
}
}
func TestVehicleServiceOverviewMatchesPartialKeyword(t *testing.T) { func TestVehicleServiceOverviewMatchesPartialKeyword(t *testing.T) {
overview := VehicleServiceOverview{ overview := VehicleServiceOverview{
VIN: "LB9A32A24R0LS1426", VIN: "LB9A32A24R0LS1426",