Changeset 635 in code for trunk


Ignore:
Timestamp:
Oct 13, 2021, 8:12:14 AM (4 years ago)
Author:
contact
Message:

db_postgres: fix constraints errors

Stop using ON CONFLICT DO UPDATE.

Closes: https://todo.sr.ht/~emersion/soju/138

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/db_postgres.go

    r634 r635  
    201201        password := toNullString(user.Password)
    202202        realname := toNullString(user.Realname)
    203         err := db.db.QueryRow(`
    204                 INSERT INTO "User" (username, password, admin, realname)
    205                 VALUES ($1, $2, $3, $4)
    206                 ON CONFLICT (username)
    207                 DO UPDATE SET password = $2, admin = $3, realname = $4
    208                 RETURNING id`,
    209                 user.Username, password, user.Admin, realname).Scan(&user.ID)
     203
     204        var err error
     205        if user.ID == 0 {
     206                err = db.db.QueryRow(`
     207                        INSERT INTO "User" (username, password, admin, realname)
     208                        VALUES ($1, $2, $3, $4)
     209                        RETURNING id`,
     210                        user.Username, password, user.Admin, realname).Scan(&user.ID)
     211        } else {
     212                _, err = db.db.Exec(`
     213                        UPDATE "User"
     214                        SET password = $1, admin = $2, realname = $3
     215                        WHERE id = $4`,
     216                        password, user.Admin, realname, user.ID)
     217        }
    210218        return err
    211219}
     
    280288        }
    281289
    282         err := db.db.QueryRow(`
    283                 INSERT INTO "Network" ("user", name, addr, nick, username, realname, pass, connect_commands,
    284                         sasl_mechanism, sasl_plain_username, sasl_plain_password, sasl_external_cert,
    285                         sasl_external_key, enabled)
    286                 VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14)
    287                 ON CONFLICT
    288                 DO UPDATE SET name = $2, addr = $3, nick = $4, username = $5, realname = $6, pass = $7,
    289                         connect_commands = $8, sasl_mechanism = $9, sasl_plain_username = $10,
    290                         sasl_plain_password = $11, sasl_external_cert = $12, sasl_external_key = $13,
    291                         enabled = $14
    292                 RETURNING id`,
    293                 userID, netName, network.Addr, network.Nick, netUsername, realname, pass, connectCommands,
    294                 saslMechanism, saslPlainUsername, saslPlainPassword, network.SASL.External.CertBlob,
    295                 network.SASL.External.PrivKeyBlob, network.Enabled).Scan(&network.ID)
     290        var err error
     291        if network.ID == 0 {
     292                err = db.db.QueryRow(`
     293                        INSERT INTO "Network" ("user", name, addr, nick, username, realname, pass, connect_commands,
     294                                sasl_mechanism, sasl_plain_username, sasl_plain_password, sasl_external_cert,
     295                                sasl_external_key, enabled)
     296                        VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14)
     297                        RETURNING id`,
     298                        userID, netName, network.Addr, network.Nick, netUsername, realname, pass, connectCommands,
     299                        saslMechanism, saslPlainUsername, saslPlainPassword, network.SASL.External.CertBlob,
     300                        network.SASL.External.PrivKeyBlob, network.Enabled).Scan(&network.ID)
     301        } else {
     302                _, err = db.db.Exec(`
     303                        UPDATE "Network"
     304                        SET name = $2, addr = $3, nick = $4, username = $5, realname = $6, pass = $7,
     305                                connect_commands = $8, sasl_mechanism = $9, sasl_plain_username = $10,
     306                                sasl_plain_password = $11, sasl_external_cert = $12, sasl_external_key = $13,
     307                                enabled = $14
     308                        WHERE id = $1`,
     309                        network.ID, netName, network.Addr, network.Nick, netUsername, realname, pass, connectCommands,
     310                        saslMechanism, saslPlainUsername, saslPlainPassword, network.SASL.External.CertBlob,
     311                        network.SASL.External.PrivKeyBlob, network.Enabled)
     312        }
    296313        return err
    297314}
     
    336353        key := toNullString(ch.Key)
    337354        detachAfter := int64(math.Ceil(ch.DetachAfter.Seconds()))
    338         err := db.db.QueryRow(`
    339                 INSERT INTO "Channel" (network, name, key, detached, detached_internal_msgid, relay_detached, reattach_on,
    340                         detach_after, detach_on)
    341                 VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9)
    342                 ON CONFLICT (network, name)
    343                 DO UPDATE SET network = $1, name = $2, key = $3, detached = $4, detached_internal_msgid = $5,
    344                         relay_detached = $6, reattach_on = $7, detach_after = $8, detach_on = $9
    345                 RETURNING id`,
    346                 networkID, ch.Name, key, ch.Detached, toNullString(ch.DetachedInternalMsgID),
    347                 ch.RelayDetached, ch.ReattachOn, detachAfter, ch.DetachOn).Scan(&ch.ID)
     355
     356        var err error
     357        if ch.ID == 0 {
     358                err = db.db.QueryRow(`
     359                        INSERT INTO "Channel" (network, name, key, detached, detached_internal_msgid, relay_detached, reattach_on,
     360                                detach_after, detach_on)
     361                        VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9)
     362                        RETURNING id`,
     363                        networkID, ch.Name, key, ch.Detached, toNullString(ch.DetachedInternalMsgID),
     364                        ch.RelayDetached, ch.ReattachOn, detachAfter, ch.DetachOn).Scan(&ch.ID)
     365        } else {
     366                _, err = db.db.Exec(`
     367                        UPDATE "Channel"
     368                        SET name = $2, key = $3, detached = $4, detached_internal_msgid = $5,
     369                                relay_detached = $6, reattach_on = $7, detach_after = $8, detach_on = $9
     370                        WHERE id = $1`,
     371                        ch.ID, ch.Name, key, ch.Detached, toNullString(ch.DetachedInternalMsgID),
     372                        ch.RelayDetached, ch.ReattachOn, detachAfter, ch.DetachOn)
     373        }
    348374        return err
    349375}
     
    380406
    381407func (db *PostgresDB) StoreClientDeliveryReceipts(networkID int64, client string, receipts []DeliveryReceipt) error {
     408        tx, err := db.db.Begin()
     409        if err != nil {
     410                return err
     411        }
     412        defer tx.Rollback()
     413
     414        _, err = tx.Exec("DELETE FROM DeliveryReceipt WHERE network = $1 AND client = $2",
     415                networkID, client)
     416        if err != nil {
     417                return err
     418        }
     419
    382420        stmt, err := db.db.Prepare(`
    383421                INSERT INTO "DeliveryReceipt" (network, target, client, internal_msgid)
    384422                VALUES ($1, $2, $3, $4)
    385                 ON CONFLICT (network, target, client)
    386                 DO UPDATE SET internal_msgid = $4
    387423                RETURNING id`)
    388424        if err != nil {
     
    391427        defer stmt.Close()
    392428
    393         // No need for a transaction since all changes are atomic and don't break data coherence.
    394429        for i := range receipts {
    395430                rcpt := &receipts[i]
     
    399434                }
    400435        }
    401         return nil
    402 }
     436
     437        return tx.Commit()
     438}
Note: See TracChangeset for help on using the changeset viewer.