aboutsummaryrefslogtreecommitdiff
path: root/badger
diff options
context:
space:
mode:
authorBohdan Horbeshko <bodqhrohro@gmail.com>2023-06-05 11:22:13 +0300
committerBohdan Horbeshko <bodqhrohro@gmail.com>2023-06-05 11:22:13 +0300
commit7215d11d7973b9896c6223938649c75165fa3ae7 (patch)
tree0aa0bf028cc899a283eb55654ee7618eba167681 /badger
parenta5c90340ad2da16a68ddcbfa3d9573f0664067ca (diff)
XEP-0308 message editing
Diffstat (limited to 'badger')
-rw-r--r--badger/ids.go98
1 files changed, 98 insertions, 0 deletions
diff --git a/badger/ids.go b/badger/ids.go
index 80fb9ad..079887a 100644
--- a/badger/ids.go
+++ b/badger/ids.go
@@ -121,6 +121,104 @@ func splitTgByteString(val []byte) (int64, int64, error) {
return tgChatId, tgMsgId, err
}
+// ReplaceIdPair replaces an old entry by XMPP ID with both new XMPP and Tg ID
+func (db *IdsDB) ReplaceIdPair(tgAccount, xmppAccount, oldXmppId, newXmppId string, newMsgId int64) error {
+ // read old pair
+ chatId, oldMsgId, err := db.GetByXmppId(tgAccount, xmppAccount, oldXmppId)
+ if err != nil {
+ return err
+ }
+
+ bPrefix := toKeyPrefix(tgAccount, xmppAccount)
+
+ bOldTgId := toTgByteString(chatId, oldMsgId)
+ bOldXmppId := toXmppByteString(oldXmppId)
+ bOldTgKey := toByteKey(bPrefix, bOldTgId, "tg")
+ bOldXmppKey := toByteKey(bPrefix, bOldXmppId, "xmpp")
+
+ bTgId := toTgByteString(chatId, newMsgId)
+ bXmppId := toXmppByteString(newXmppId)
+ bTgKey := toByteKey(bPrefix, bTgId, "tg")
+ bXmppKey := toByteKey(bPrefix, bXmppId, "xmpp")
+
+ return db.db.Update(func(txn *badger.Txn) error {
+ // save new pair
+ if err := txn.Set(bTgKey, bXmppId); err != nil {
+ return err
+ }
+ if err := txn.Set(bXmppKey, bTgId); err != nil {
+ return err
+ }
+ // delete old pair
+ if err := txn.Delete(bOldTgKey); err != nil {
+ return err
+ }
+ return txn.Delete(bOldXmppKey)
+ })
+}
+
+// ReplaceXmppId replaces an old XMPP ID with new XMPP ID and keeps Tg ID intact
+func (db *IdsDB) ReplaceXmppId(tgAccount, xmppAccount, oldXmppId, newXmppId string) error {
+ // read old Tg IDs
+ chatId, msgId, err := db.GetByXmppId(tgAccount, xmppAccount, oldXmppId)
+ if err != nil {
+ return err
+ }
+
+ bPrefix := toKeyPrefix(tgAccount, xmppAccount)
+
+ bOldXmppId := toXmppByteString(oldXmppId)
+ bOldXmppKey := toByteKey(bPrefix, bOldXmppId, "xmpp")
+
+ bTgId := toTgByteString(chatId, msgId)
+ bXmppId := toXmppByteString(newXmppId)
+ bTgKey := toByteKey(bPrefix, bTgId, "tg")
+ bXmppKey := toByteKey(bPrefix, bXmppId, "xmpp")
+
+ return db.db.Update(func(txn *badger.Txn) error {
+ // save new pair
+ if err := txn.Set(bTgKey, bXmppId); err != nil {
+ return err
+ }
+ if err := txn.Set(bXmppKey, bTgId); err != nil {
+ return err
+ }
+ // delete old xmpp->tg entry
+ return txn.Delete(bOldXmppKey)
+ })
+}
+
+// ReplaceTgId replaces an old Tg ID with new Tg ID and keeps Tg chat ID and XMPP ID intact
+func (db *IdsDB) ReplaceTgId(tgAccount, xmppAccount string, chatId, oldMsgId, newMsgId int64) error {
+ // read old XMPP ID
+ xmppId, err := db.GetByTgIds(tgAccount, xmppAccount, chatId, oldMsgId)
+ if err != nil {
+ return err
+ }
+
+ bPrefix := toKeyPrefix(tgAccount, xmppAccount)
+
+ bOldTgId := toTgByteString(chatId, oldMsgId)
+ bOldTgKey := toByteKey(bPrefix, bOldTgId, "tg")
+
+ bTgId := toTgByteString(chatId, newMsgId)
+ bXmppId := toXmppByteString(xmppId)
+ bTgKey := toByteKey(bPrefix, bTgId, "tg")
+ bXmppKey := toByteKey(bPrefix, bXmppId, "xmpp")
+
+ return db.db.Update(func(txn *badger.Txn) error {
+ // save new pair
+ if err := txn.Set(bTgKey, bXmppId); err != nil {
+ return err
+ }
+ if err := txn.Set(bXmppKey, bTgId); err != nil {
+ return err
+ }
+ // delete old tg->xmpp entry
+ return txn.Delete(bOldTgKey)
+ })
+}
+
// Gc compacts the value log
func (db *IdsDB) Gc() {
db.db.RunValueLogGC(0.7)