github.com/omnigres/cli@v0.1.4/cmd/cloudevents.go (about) 1 package cmd 2 3 import ( 4 "context" 5 "database/sql" 6 "database/sql/driver" 7 "encoding/json" 8 "github.com/lib/pq" 9 ) 10 11 import cloudevents "github.com/cloudevents/sdk-go/v2" 12 13 type cloudeventHandler struct { 14 Callback func(event *cloudevents.Event) 15 } 16 17 var cloudeventHandlers []cloudeventHandler = []cloudeventHandler{} 18 19 func setupCloudevents(ctx context.Context, conn *sql.Conn) (err error) { 20 21 cloudEventConsumer := func(notice *pq.Error) { 22 event := cloudevents.NewEvent() 23 err := json.Unmarshal([]byte(notice.Message), &event) 24 if err == nil { 25 for _, handler := range cloudeventHandlers { 26 handler.Callback(&event) 27 } 28 } 29 } 30 err = conn.Raw(func(driverConn any) error { 31 pq.SetNoticeHandler(driverConn.(driver.Conn), cloudEventConsumer) 32 return nil 33 }) 34 if err != nil { 35 return err 36 } 37 38 var rows *sql.Rows 39 rows, err = conn.QueryContext(ctx, `select omni_cloudevents.create_notice_publisher(publish_uncommitted => true)`) 40 if err == nil { 41 for rows.Next() { 42 } 43 } 44 45 return 46 }