Scert/backend/internal/database/sqlite_deadline_rows.go

47 lines
1.0 KiB
Go

package database
import (
"context"
"database/sql/driver"
"fmt"
)
type sqliteDriverRows interface {
driver.Rows
driver.RowsColumnTypeDatabaseTypeName
driver.RowsColumnTypeLength
driver.RowsColumnTypeNullable
driver.RowsColumnTypePrecisionScale
driver.RowsColumnTypeScanType
}
type sqliteDeadlineRows struct {
sqliteDriverRows
conn *sqliteDeadlineConn
ctx context.Context
}
func (c *sqliteDeadlineConn) wrapRows(ctx context.Context, rows driver.Rows, err error) (driver.Rows, error) {
if err != nil {
if rows != nil {
_ = rows.Close()
}
return nil, err
}
full, ok := rows.(sqliteDriverRows)
if !ok {
_ = rows.Close()
return nil, fmt.Errorf("SQLite 驱动查询结果接口不兼容")
}
return &sqliteDeadlineRows{sqliteDriverRows: full, conn: c, ctx: ctx}, nil
}
func (r *sqliteDeadlineRows) Next(values []driver.Value) error {
_, err := sqliteWithDeadline(r.conn, r.ctx, func() (struct{}, error) {
return struct{}{}, r.sqliteDriverRows.Next(values)
})
return err
}
var _ sqliteDriverRows = (*sqliteDeadlineRows)(nil)