|
@@ -0,0 +1,61 @@
|
|
|
+package upgrades
|
|
|
+
|
|
|
+import (
|
|
|
+ "database/sql"
|
|
|
+ "encoding/json"
|
|
|
+ "fmt"
|
|
|
+)
|
|
|
+
|
|
|
+func init() {
|
|
|
+ var keys = []string{"imageMessage", "contactMessage", "locationMessage", "extendedTextMessage", "documentMessage", "audioMessage", "videoMessage"}
|
|
|
+ upgrades[4] = upgrade{"Update message content to new protocol version", func(dialect Dialect, tx *sql.Tx, db *sql.DB) error {
|
|
|
+ rows, err := db.Query("SELECT mxid, content FROM message")
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ for rows.Next() {
|
|
|
+ var mxid string
|
|
|
+ var rawContent []byte
|
|
|
+ err = rows.Scan(&mxid, &rawContent)
|
|
|
+ if err != nil {
|
|
|
+ fmt.Println("Error scanning:", err)
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ var content map[string]interface{}
|
|
|
+ err = json.Unmarshal(rawContent, &content)
|
|
|
+ if err != nil {
|
|
|
+ fmt.Printf("Error unmarshaling content of %s: %v\n", mxid, err)
|
|
|
+ continue
|
|
|
+ }
|
|
|
+
|
|
|
+ for _, key := range keys {
|
|
|
+ val, ok := content[key].(map[string]interface{})
|
|
|
+ if !ok {
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ ci, ok := val["contextInfo"].(map[string]interface{})
|
|
|
+ if !ok {
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ qm, ok := ci["quotedMessage"].([]interface{})
|
|
|
+ if !ok {
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ ci["quotedMessage"] = qm[0]
|
|
|
+ goto save
|
|
|
+ }
|
|
|
+ continue
|
|
|
+
|
|
|
+ save:
|
|
|
+ rawContent, err = json.Marshal(&content)
|
|
|
+ if err != nil {
|
|
|
+ fmt.Printf("Error marshaling updated content of %s: %v\n", mxid, err)
|
|
|
+ }
|
|
|
+ _, err = tx.Exec("UPDATE message SET content=$1 WHERE mxid=$2", rawContent, mxid)
|
|
|
+ if err != nil {
|
|
|
+ fmt.Printf("Error updating row of %s: %v\n", mxid, err)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return nil
|
|
|
+ }}
|
|
|
+}
|