feat: add projection layer to eventstore
This commit is contained in:
@@ -4,7 +4,7 @@ import (
|
||||
"context"
|
||||
"fmt"
|
||||
|
||||
"github.com/sour-is/ev/internal/logz"
|
||||
"github.com/sour-is/ev/internal/lg"
|
||||
"github.com/sour-is/ev/pkg/es"
|
||||
"github.com/sour-is/ev/pkg/es/driver"
|
||||
"github.com/sour-is/ev/pkg/es/event"
|
||||
@@ -26,30 +26,30 @@ type memstore struct {
|
||||
const AppendOnly = es.AppendOnly
|
||||
const AllEvents = es.AllEvents
|
||||
|
||||
func Init(ctx context.Context) {
|
||||
ctx, span := logz.Span(ctx)
|
||||
func Init(ctx context.Context) error {
|
||||
ctx, span := lg.Span(ctx)
|
||||
defer span.End()
|
||||
|
||||
es.Register(ctx, "mem", &memstore{})
|
||||
return es.Register(ctx, "mem", &memstore{})
|
||||
}
|
||||
|
||||
var _ driver.Driver = (*memstore)(nil)
|
||||
|
||||
func (memstore) Open(ctx context.Context, name string) (driver.Driver, error) {
|
||||
_, span := logz.Span(ctx)
|
||||
_, span := lg.Span(ctx)
|
||||
defer span.End()
|
||||
|
||||
s := &state{streams: make(map[string]*locker.Locked[event.Events])}
|
||||
return &memstore{locker.New(s)}, nil
|
||||
}
|
||||
func (m *memstore) EventLog(ctx context.Context, streamID string) (driver.EventLog, error) {
|
||||
ctx, span := logz.Span(ctx)
|
||||
ctx, span := lg.Span(ctx)
|
||||
defer span.End()
|
||||
|
||||
el := &eventLog{streamID: streamID}
|
||||
|
||||
err := m.state.Modify(ctx, func(state *state) error {
|
||||
_, span := logz.Span(ctx)
|
||||
_, span := lg.Span(ctx)
|
||||
defer span.End()
|
||||
|
||||
l, ok := state.streams[streamID]
|
||||
@@ -70,16 +70,16 @@ var _ driver.EventLog = (*eventLog)(nil)
|
||||
|
||||
// Append implements driver.EventStore
|
||||
func (m *eventLog) Append(ctx context.Context, events event.Events, version uint64) (uint64, error) {
|
||||
ctx, span := logz.Span(ctx)
|
||||
ctx, span := lg.Span(ctx)
|
||||
defer span.End()
|
||||
|
||||
event.SetStreamID(m.streamID, events...)
|
||||
|
||||
return uint64(len(events)), m.events.Modify(ctx, func(stream *event.Events) error {
|
||||
_, span := logz.Span(ctx)
|
||||
_, span := lg.Span(ctx)
|
||||
defer span.End()
|
||||
|
||||
span.AddEvent(fmt.Sprintf(" %s %#v %d", m.streamID, stream, len(*stream)))
|
||||
span.AddEvent(fmt.Sprintf(" %s %d", m.streamID, len(*stream)))
|
||||
|
||||
last := uint64(len(*stream))
|
||||
if version != AppendOnly && version != last {
|
||||
@@ -100,16 +100,16 @@ func (m *eventLog) Append(ctx context.Context, events event.Events, version uint
|
||||
|
||||
// Read implements driver.EventStore
|
||||
func (m *eventLog) Read(ctx context.Context, pos int64, count int64) (event.Events, error) {
|
||||
ctx, span := logz.Span(ctx)
|
||||
ctx, span := lg.Span(ctx)
|
||||
defer span.End()
|
||||
|
||||
var events event.Events
|
||||
|
||||
err := m.events.Modify(ctx, func(stream *event.Events) error {
|
||||
_, span := logz.Span(ctx)
|
||||
_, span := lg.Span(ctx)
|
||||
defer span.End()
|
||||
|
||||
span.AddEvent(fmt.Sprintf(" %s %#v %d", m.streamID, stream, len(*stream)))
|
||||
span.AddEvent(fmt.Sprintf("%s %d", m.streamID, len(*stream)))
|
||||
|
||||
first := stream.First().EventMeta().Position
|
||||
last := stream.Last().EventMeta().Position
|
||||
@@ -154,7 +154,7 @@ func (m *eventLog) Read(ctx context.Context, pos int64, count int64) (event.Even
|
||||
|
||||
// FirstIndex for the streamID
|
||||
func (m *eventLog) FirstIndex(ctx context.Context) (uint64, error) {
|
||||
_, span := logz.Span(ctx)
|
||||
_, span := lg.Span(ctx)
|
||||
defer span.End()
|
||||
|
||||
events, err := m.events.Copy(ctx)
|
||||
@@ -163,7 +163,7 @@ func (m *eventLog) FirstIndex(ctx context.Context) (uint64, error) {
|
||||
|
||||
// LastIndex for the streamID
|
||||
func (m *eventLog) LastIndex(ctx context.Context) (uint64, error) {
|
||||
_, span := logz.Span(ctx)
|
||||
_, span := lg.Span(ctx)
|
||||
defer span.End()
|
||||
|
||||
events, err := m.events.Copy(ctx)
|
||||
|
||||
Reference in New Issue
Block a user