//go:build mysql // +build mysql package mysql import ( "encoding/json" "strconv" "strings" "time" "github.com/jmoiron/sqlx" t "github.com/tinode/chat/server/store/types" ) func (a *adapter) infrastructureAdapter(id t.TenantID) (*adapter, error) { if !a.tenantScopedDB { return a.routedTenantAdapter(id) } if err := validTenant(id); err != nil { return nil, err } return a, nil } func (a *adapter) TenantKafkaConsumeDead(id t.TenantID, dead *t.KafkaDeadLetter, now time.Time) error { tenantAdp, err := a.infrastructureAdapter(id) if err != nil { return err } if dead == nil || dead.DeadID == "" || dead.EventID == "" || dead.ConsumerGroup == "" || dead.SourceTopic == "" || len(dead.Envelope) == 0 { return t.ErrMalformed } if tenantAdp != a { return tenantAdp.TenantKafkaConsumeDead(id, dead, now) } if _, err = a.db.Exec(`INSERT INTO im_kafka_dead_letters (dead_id,event_id,parent_event_id,source_topic,consumer_group,event_type,biz_type,biz_id,envelope, retry_count,last_reason,last_error,status,replay_count,created_at,updated_at) VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?) ON DUPLICATE KEY UPDATE last_reason=VALUES(last_reason),last_error=VALUES(last_error),updated_at=VALUES(updated_at)`, dead.DeadID, dead.EventID, dead.ParentEventID, dead.SourceTopic, dead.ConsumerGroup, dead.EventType, dead.BizType, dead.BizID, dead.Envelope, dead.RetryCount, truncateKafkaString(dead.LastReason, 64), truncateKafkaString(dead.LastError, 1000), t.KafkaDeadStatusDead, dead.ReplayCount, now, now); err != nil { return err } return nil } func (a *adapter) TenantKafkaDeadLetterList(id t.TenantID, opts t.KafkaDeadLetterListOptions) (*t.KafkaDeadLetterPage, error) { tenantAdp, err := a.infrastructureAdapter(id) if err != nil { return nil, err } if tenantAdp != a { return tenantAdp.TenantKafkaDeadLetterList(id, opts) } limit := opts.Limit if limit <= 0 || limit > 200 { limit = 50 } where := []string{"1=1"} args := []any{} if opts.Status != "" { where = append(where, "status=?") args = append(args, opts.Status) } if opts.BizType != "" { where = append(where, "biz_type=?") args = append(args, opts.BizType) } if opts.BizID != "" { where = append(where, "biz_id=?") args = append(args, opts.BizID) } if opts.EventType != "" { where = append(where, "event_type=?") args = append(args, opts.EventType) } if opts.Cursor != "" { where = append(where, "id