github.com/keybase/client/go@v0.0.0-20240309051027-028f7c731f8b/chat/storage/storage_msgid_tracker.go (about) 1 package storage 2 3 import ( 4 "fmt" 5 6 "github.com/keybase/client/go/chat/globals" 7 "github.com/keybase/client/go/chat/utils" 8 "github.com/keybase/client/go/libkb" 9 "github.com/keybase/client/go/protocol/chat1" 10 "github.com/keybase/client/go/protocol/gregor1" 11 "golang.org/x/net/context" 12 ) 13 14 type msgIDTracker struct { 15 globals.Contextified 16 utils.DebugLabeler 17 } 18 19 func newMsgIDTracker(g *globals.Context) *msgIDTracker { 20 return &msgIDTracker{ 21 Contextified: globals.NewContextified(g), 22 DebugLabeler: utils.NewDebugLabeler(g.ExternalG(), "MsgIDTracker", false), 23 } 24 } 25 26 func (t *msgIDTracker) makeDbKey(convID chat1.ConversationID, uid gregor1.UID) libkb.DbKey { 27 return libkb.DbKey{ 28 Typ: libkb.DBChatBlocks, 29 Key: fmt.Sprintf("maxMsgID:%s:%s", uid, convID), 30 } 31 } 32 33 func (t *msgIDTracker) bumpMaxMessageID( 34 ctx context.Context, convID chat1.ConversationID, uid gregor1.UID, msgID chat1.MessageID) Error { 35 36 // No need to use transaction here since the Storage class takes lock. 37 38 maxMsgIDKey := t.makeDbKey(convID, uid) 39 40 raw, found, err := t.G().LocalChatDb.GetRaw(maxMsgIDKey) 41 if err != nil { 42 return NewInternalError(ctx, t.DebugLabeler, "GetRaw error: %s", err.Error()) 43 } 44 if found { 45 var maxMsgID chat1.MessageID 46 if err = decode(raw, &maxMsgID); err != nil { 47 return NewInternalError(ctx, t.DebugLabeler, "decode error: %s", err.Error()) 48 } 49 if maxMsgID >= msgID { 50 return nil 51 } 52 } 53 54 dat, err := encode(msgID) 55 if err != nil { 56 return NewInternalError(ctx, t.DebugLabeler, "encode error: %s", err.Error()) 57 } 58 if err = t.G().LocalChatDb.PutRaw(maxMsgIDKey, dat); err != nil { 59 return NewInternalError(ctx, t.DebugLabeler, "PutRaw error: %s", err.Error()) 60 } 61 62 return nil 63 } 64 65 func (t *msgIDTracker) getMaxMessageID( 66 ctx context.Context, convID chat1.ConversationID, uid gregor1.UID) (chat1.MessageID, Error) { 67 68 maxMsgIDKey := t.makeDbKey(convID, uid) 69 70 raw, found, err := t.G().LocalChatDb.GetRaw(maxMsgIDKey) 71 if err != nil { 72 return 0, NewInternalError(ctx, t.DebugLabeler, "GetRaw error: %s", err.Error()) 73 } 74 if !found { 75 return 0, MissError{} 76 } 77 78 var maxMsgID chat1.MessageID 79 if err = decode(raw, &maxMsgID); err != nil { 80 return 0, NewInternalError(ctx, t.DebugLabeler, "decode error: %s", err.Error()) 81 } 82 83 return maxMsgID, nil 84 } 85 86 func (t *msgIDTracker) clear(convID chat1.ConversationID, uid gregor1.UID) error { 87 return t.G().LocalChatDb.Delete(t.makeDbKey(convID, uid)) 88 }