Fix or break some history related things
This commit is contained in:
parent
439d8371db
commit
772f30b2d6
@ -85,54 +85,58 @@ func (hm *HistoryManager) Close() error {
|
|||||||
return hm.db.Close()
|
return hm.db.Close()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var (
|
||||||
|
EventNotFoundError = errors.New("event not found")
|
||||||
|
RoomNotFoundError = errors.New("room not found")
|
||||||
|
)
|
||||||
|
|
||||||
|
func (hm *HistoryManager) getStreamIndex(tx *bolt.Tx, roomID []byte, eventID []byte) (*bolt.Bucket, []byte, error) {
|
||||||
|
eventIDs := tx.Bucket(bucketRoomEventIDs).Bucket(roomID)
|
||||||
|
if eventIDs == nil {
|
||||||
|
return nil, nil, RoomNotFoundError
|
||||||
|
}
|
||||||
|
index := eventIDs.Get(eventID)
|
||||||
|
if index == nil {
|
||||||
|
return nil, nil, EventNotFoundError
|
||||||
|
}
|
||||||
|
stream := tx.Bucket(bucketRoomStreams).Bucket(roomID)
|
||||||
|
return stream, index, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (hm *HistoryManager) getEvent(tx *bolt.Tx, stream *bolt.Bucket, index []byte) (*event.Event, error) {
|
||||||
|
eventData := stream.Get(index)
|
||||||
|
if eventData == nil || len(eventData) == 0 {
|
||||||
|
return nil, EventNotFoundError
|
||||||
|
}
|
||||||
|
return unmarshalEvent(eventData)
|
||||||
|
}
|
||||||
|
|
||||||
func (hm *HistoryManager) Get(room *rooms.Room, eventID string) (evt *event.Event, err error) {
|
func (hm *HistoryManager) Get(room *rooms.Room, eventID string) (evt *event.Event, err error) {
|
||||||
err = hm.db.View(func(tx *bolt.Tx) error {
|
err = hm.db.View(func(tx *bolt.Tx) error {
|
||||||
rid := []byte(room.ID)
|
if stream, index, err := hm.getStreamIndex(tx, []byte(room.ID), []byte(eventID)); err != nil {
|
||||||
eventIDs := tx.Bucket(bucketRoomEventIDs).Bucket(rid)
|
return err
|
||||||
if eventIDs == nil {
|
} else if evt, err = hm.getEvent(tx, stream, index); err != nil {
|
||||||
return nil
|
return err
|
||||||
}
|
}
|
||||||
streamIndex := eventIDs.Get([]byte(eventID))
|
|
||||||
if streamIndex == nil {
|
|
||||||
return nil
|
return nil
|
||||||
}
|
|
||||||
stream := tx.Bucket(bucketRoomStreams).Bucket(rid)
|
|
||||||
eventData := stream.Get(streamIndex)
|
|
||||||
var umErr error
|
|
||||||
evt, umErr = unmarshalEvent(eventData)
|
|
||||||
return umErr
|
|
||||||
})
|
})
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
var EventNotFoundError = errors.New("event not found")
|
|
||||||
|
|
||||||
func (hm *HistoryManager) Update(room *rooms.Room, eventID string, update func(evt *event.Event) error) error {
|
func (hm *HistoryManager) Update(room *rooms.Room, eventID string, update func(evt *event.Event) error) error {
|
||||||
return hm.db.Update(func(tx *bolt.Tx) error {
|
return hm.db.Update(func(tx *bolt.Tx) error {
|
||||||
rid := []byte(room.ID)
|
if stream, index, err := hm.getStreamIndex(tx, []byte(room.ID), []byte(eventID)); err != nil {
|
||||||
eventIDs := tx.Bucket(bucketRoomEventIDs).Bucket(rid)
|
return err
|
||||||
if eventIDs == nil {
|
} else if evt, err := hm.getEvent(tx, stream, index); err != nil {
|
||||||
return nil
|
|
||||||
}
|
|
||||||
streamIndex := eventIDs.Get([]byte(eventID))
|
|
||||||
if streamIndex == nil {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
stream := tx.Bucket(bucketRoomStreams).Bucket(rid)
|
|
||||||
eventData := stream.Get(streamIndex)
|
|
||||||
if eventData == nil || len(eventData) == 0 {
|
|
||||||
return EventNotFoundError
|
|
||||||
}
|
|
||||||
|
|
||||||
if evt, err := unmarshalEvent(eventData); err != nil {
|
|
||||||
return err
|
return err
|
||||||
} else if err = update(evt); err != nil {
|
} else if err = update(evt); err != nil {
|
||||||
return err
|
return err
|
||||||
} else if eventData, err = marshalEvent(evt); err != nil {
|
} else if eventData, err := marshalEvent(evt); err != nil {
|
||||||
|
return err
|
||||||
|
} else if err := stream.Put(index, eventData); err != nil {
|
||||||
return err
|
return err
|
||||||
} else {
|
|
||||||
return stream.Put(streamIndex, eventData)
|
|
||||||
}
|
}
|
||||||
|
return nil
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -30,8 +30,8 @@ import (
|
|||||||
"path/filepath"
|
"path/filepath"
|
||||||
"regexp"
|
"regexp"
|
||||||
"runtime"
|
"runtime"
|
||||||
"time"
|
|
||||||
dbg "runtime/debug"
|
dbg "runtime/debug"
|
||||||
|
"time"
|
||||||
|
|
||||||
"maunium.net/go/gomuks/matrix/event"
|
"maunium.net/go/gomuks/matrix/event"
|
||||||
"maunium.net/go/mautrix"
|
"maunium.net/go/mautrix"
|
||||||
@ -320,15 +320,12 @@ func (c *Container) HandleRedaction(source EventSource, evt *mautrix.Event) {
|
|||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
debug.Print("Failed to mark", evt.Redacts, "as redacted:", err)
|
debug.Print("Failed to mark", evt.Redacts, "as redacted:", err)
|
||||||
}
|
return
|
||||||
|
} else if !c.config.AuthCache.InitialSyncDone || !room.Loaded() {
|
||||||
if !room.Loaded() || redactedEvt == nil {
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
mainView := c.ui.MainView()
|
roomView := c.ui.MainView().GetRoom(evt.RoomID)
|
||||||
|
|
||||||
roomView := mainView.GetRoom(evt.RoomID)
|
|
||||||
if roomView == nil {
|
if roomView == nil {
|
||||||
debug.Printf("Failed to handle event %v: No room view found.", evt)
|
debug.Printf("Failed to handle event %v: No room view found.", evt)
|
||||||
return
|
return
|
||||||
@ -349,8 +346,8 @@ func (c *Container) HandleEdit(room *rooms.Room, editsID string, editEvent *even
|
|||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
debug.Print("Failed to store edit in history db:", err)
|
debug.Print("Failed to store edit in history db:", err)
|
||||||
}
|
return
|
||||||
if !c.config.AuthCache.InitialSyncDone {
|
} else if !c.config.AuthCache.InitialSyncDone || !room.Loaded() {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -360,10 +357,6 @@ func (c *Container) HandleEdit(room *rooms.Room, editsID string, editEvent *even
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if !room.Loaded() {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
roomView.AddEdit(origEvt)
|
roomView.AddEdit(origEvt)
|
||||||
if c.syncer.FirstSyncDone {
|
if c.syncer.FirstSyncDone {
|
||||||
c.ui.Render()
|
c.ui.Render()
|
||||||
@ -729,7 +722,9 @@ func (c *Container) GetHistory(room *rooms.Room, limit int) ([]*event.Event, err
|
|||||||
|
|
||||||
func (c *Container) GetEvent(room *rooms.Room, eventID string) (*event.Event, error) {
|
func (c *Container) GetEvent(room *rooms.Room, eventID string) (*event.Event, error) {
|
||||||
evt, err := c.history.Get(room, eventID)
|
evt, err := c.history.Get(room, eventID)
|
||||||
if evt != nil || err != nil {
|
if err != nil && err != EventNotFoundError {
|
||||||
|
debug.Printf("Failed to get event %s from local cache: %v", eventID, err)
|
||||||
|
} else if evt != nil {
|
||||||
debug.Printf("Found event %s in local cache", eventID)
|
debug.Printf("Found event %s in local cache", eventID)
|
||||||
return evt, err
|
return evt, err
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user