|
|
|
@ -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)
|
|
|
|
|