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  }