···11+/*
22+Clickhouse storage interface
33+*/
44+55+package store
+5
cmd/butterfly/store/duckdb.go
···11+/*
22+DuckDB storage interface
33+*/
44+55+package store
+58
cmd/butterfly/store/stdout.go
···11+/*
22+Dump-to-stdout storage interface
33+*/
44+55+package store
66+77+import (
88+ "fmt"
99+1010+ "github.com/bluesky-social/indigo/cmd/butterfly/remote"
1111+)
1212+1313+const (
1414+ StdoutStoreModePassthrough = iota
1515+ StdoutStoreModeStats
1616+)
1717+1818+type StdoutStore struct {
1919+ Mode int
2020+2121+ // stats
2222+ // TODO: should support multiple repos
2323+ Did string
2424+ NumRecords uint
2525+}
2626+2727+func (self *StdoutStore) Setup() error {
2828+ return nil
2929+}
3030+3131+func (self *StdoutStore) Close() error {
3232+ return nil
3333+}
3434+3535+func (self *StdoutStore) Receive(s *remote.RemoteStream) error {
3636+ for event := range s.Ch {
3737+ if self.Did == "" {
3838+ self.Did = event.Did
3939+ }
4040+4141+ switch self.Mode {
4242+ case StdoutStoreModePassthrough:
4343+ fmt.Println(event)
4444+ case StdoutStoreModeStats:
4545+ if event.Kind == "commit" && event.Commit.Operation == "create" {
4646+ self.NumRecords++
4747+ }
4848+ }
4949+ }
5050+5151+ if self.Mode == StdoutStoreModeStats {
5252+ // TODO make this more interesting
5353+ fmt.Printf("Stats for repo %s\n", self.Did)
5454+ fmt.Printf("%d records", self.NumRecords)
5555+ }
5656+5757+ return nil
5858+}
+14
cmd/butterfly/store/store.go
···11+package store
22+33+import "github.com/bluesky-social/indigo/cmd/butterfly/remote"
44+55+type Store interface {
66+ // Initialize the store
77+ Setup() error
88+99+ // Teardown the store
1010+ Close() error
1111+1212+ // Subscribe to a record emitter
1313+ Receive(s *remote.RemoteStream) error
1414+}