Changeset 645 in code for trunk/db_sqlite.go


Ignore:
Timestamp:
Oct 15, 2021, 8:39:14 PM (4 years ago)
Author:
hubert
Message:

Set hard timeouts on DB transactions

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/db_sqlite.go

    r620 r645  
    22
    33import (
     4        "context"
    45        "database/sql"
    56        "fmt"
     
    1112        _ "github.com/mattn/go-sqlite3"
    1213)
     14
     15const sqliteQueryTimeout = 5 * time.Second
    1316
    1417const sqliteSchema = `
     
    210213        defer db.lock.RUnlock()
    211214
     215        ctx, cancel := context.WithTimeout(context.TODO(), sqliteQueryTimeout)
     216        defer cancel()
     217
    212218        var stats DatabaseStats
    213         row := db.db.QueryRow(`SELECT
     219        row := db.db.QueryRowContext(ctx, `SELECT
    214220                (SELECT COUNT(*) FROM User) AS users,
    215221                (SELECT COUNT(*) FROM Network) AS networks,
     
    233239        defer db.lock.RUnlock()
    234240
    235         rows, err := db.db.Query("SELECT id, username, password, admin, realname FROM User")
     241        ctx, cancel := context.WithTimeout(context.TODO(), sqliteQueryTimeout)
     242        defer cancel()
     243
     244        rows, err := db.db.QueryContext(ctx,
     245                "SELECT id, username, password, admin, realname FROM User")
    236246        if err != nil {
    237247                return nil, err
     
    261271        defer db.lock.RUnlock()
    262272
     273        ctx, cancel := context.WithTimeout(context.TODO(), sqliteQueryTimeout)
     274        defer cancel()
     275
    263276        user := &User{Username: username}
    264277
    265278        var password, realname sql.NullString
    266         row := db.db.QueryRow("SELECT id, password, admin, realname FROM User WHERE username = ?", username)
     279        row := db.db.QueryRowContext(ctx,
     280                "SELECT id, password, admin, realname FROM User WHERE username = ?",
     281                username)
    267282        if err := row.Scan(&user.ID, &password, &user.Admin, &realname); err != nil {
    268283                return nil, err
     
    276291        db.lock.Lock()
    277292        defer db.lock.Unlock()
     293
     294        ctx, cancel := context.WithTimeout(context.TODO(), sqliteQueryTimeout)
     295        defer cancel()
    278296
    279297        args := []interface{}{
     
    286304        var err error
    287305        if user.ID != 0 {
    288                 _, err = db.db.Exec("UPDATE User SET password = :password, admin = :admin, realname = :realname WHERE username = :username", args...)
     306                _, err = db.db.ExecContext(ctx, `
     307                        UPDATE User SET password = :password, admin = :admin,
     308                                realname = :realname WHERE username = :username`,
     309                        args...)
    289310        } else {
    290311                var res sql.Result
    291                 res, err = db.db.Exec("INSERT INTO User(username, password, admin, realname) VALUES (:username, :password, :admin, :realname)", args...)
     312                res, err = db.db.ExecContext(ctx, `
     313                        INSERT INTO
     314                        User(username, password, admin, realname)
     315                        VALUES (:username, :password, :admin, :realname)`,
     316                        args...)
    292317                if err != nil {
    293318                        return err
     
    303328        defer db.lock.Unlock()
    304329
     330        ctx, cancel := context.WithTimeout(context.TODO(), sqliteQueryTimeout)
     331        defer cancel()
     332
    305333        tx, err := db.db.Begin()
    306334        if err != nil {
     
    309337        defer tx.Rollback()
    310338
    311         _, err = tx.Exec(`DELETE FROM DeliveryReceipt
     339        _, err = tx.ExecContext(ctx, `DELETE FROM DeliveryReceipt
    312340                WHERE id IN (
    313341                        SELECT DeliveryReceipt.id
     
    320348        }
    321349
    322         _, err = tx.Exec(`DELETE FROM Channel
     350        _, err = tx.ExecContext(ctx, `DELETE FROM Channel
    323351                WHERE id IN (
    324352                        SELECT Channel.id
     
    331359        }
    332360
    333         _, err = tx.Exec("DELETE FROM Network WHERE user = ?", id)
    334         if err != nil {
    335                 return err
    336         }
    337 
    338         _, err = tx.Exec("DELETE FROM User WHERE id = ?", id)
     361        _, err = tx.ExecContext(ctx, "DELETE FROM Network WHERE user = ?", id)
     362        if err != nil {
     363                return err
     364        }
     365
     366        _, err = tx.ExecContext(ctx, "DELETE FROM User WHERE id = ?", id)
    339367        if err != nil {
    340368                return err
     
    348376        defer db.lock.RUnlock()
    349377
    350         rows, err := db.db.Query(`SELECT id, name, addr, nick, username, realname, pass,
     378        ctx, cancel := context.WithTimeout(context.TODO(), sqliteQueryTimeout)
     379        defer cancel()
     380
     381        rows, err := db.db.QueryContext(ctx, `
     382                SELECT id, name, addr, nick, username, realname, pass,
    351383                        connect_commands, sasl_mechanism, sasl_plain_username, sasl_plain_password,
    352384                        sasl_external_cert, sasl_external_key, enabled
     
    392424        db.lock.Lock()
    393425        defer db.lock.Unlock()
     426
     427        ctx, cancel := context.WithTimeout(context.TODO(), sqliteQueryTimeout)
     428        defer cancel()
    394429
    395430        var saslMechanism, saslPlainUsername, saslPlainPassword sql.NullString
     
    430465        var err error
    431466        if network.ID != 0 {
    432                 _, err = db.db.Exec(`
     467                _, err = db.db.ExecContext(ctx, `
    433468                        UPDATE Network
    434469                        SET name = :name, addr = :addr, nick = :nick, username = :username,
     
    440475        } else {
    441476                var res sql.Result
    442                 res, err = db.db.Exec(`
     477                res, err = db.db.ExecContext(ctx, `
    443478                        INSERT INTO Network(user, name, addr, nick, username, realname, pass,
    444479                                connect_commands, sasl_mechanism, sasl_plain_username,
     
    460495        defer db.lock.Unlock()
    461496
     497        ctx, cancel := context.WithTimeout(context.TODO(), sqliteQueryTimeout)
     498        defer cancel()
     499
    462500        tx, err := db.db.Begin()
    463501        if err != nil {
     
    466504        defer tx.Rollback()
    467505
    468         _, err = tx.Exec("DELETE FROM DeliveryReceipt WHERE network = ?", id)
    469         if err != nil {
    470                 return err
    471         }
    472 
    473         _, err = tx.Exec("DELETE FROM Channel WHERE network = ?", id)
    474         if err != nil {
    475                 return err
    476         }
    477 
    478         _, err = tx.Exec("DELETE FROM Network WHERE id = ?", id)
     506        _, err = tx.ExecContext(ctx, "DELETE FROM DeliveryReceipt WHERE network = ?", id)
     507        if err != nil {
     508                return err
     509        }
     510
     511        _, err = tx.ExecContext(ctx, "DELETE FROM Channel WHERE network = ?", id)
     512        if err != nil {
     513                return err
     514        }
     515
     516        _, err = tx.ExecContext(ctx, "DELETE FROM Network WHERE id = ?", id)
    479517        if err != nil {
    480518                return err
     
    488526        defer db.lock.RUnlock()
    489527
    490         rows, err := db.db.Query(`SELECT
     528        ctx, cancel := context.WithTimeout(context.TODO(), sqliteQueryTimeout)
     529        defer cancel()
     530
     531        rows, err := db.db.QueryContext(ctx, `SELECT
    491532                        id, name, key, detached, detached_internal_msgid,
    492533                        relay_detached, reattach_on, detach_after, detach_on
     
    521562        db.lock.Lock()
    522563        defer db.lock.Unlock()
     564
     565        ctx, cancel := context.WithTimeout(context.TODO(), sqliteQueryTimeout)
     566        defer cancel()
    523567
    524568        args := []interface{}{
     
    538582        var err error
    539583        if ch.ID != 0 {
    540                 _, err = db.db.Exec(`UPDATE Channel
     584                _, err = db.db.ExecContext(ctx, `UPDATE Channel
    541585                        SET network = :network, name = :name, key = :key, detached = :detached,
    542586                                detached_internal_msgid = :detached_internal_msgid, relay_detached = :relay_detached,
     
    545589        } else {
    546590                var res sql.Result
    547                 res, err = db.db.Exec(`INSERT INTO Channel(network, name, key, detached, detached_internal_msgid, relay_detached, reattach_on, detach_after, detach_on)
     591                res, err = db.db.ExecContext(ctx, `INSERT INTO Channel(network, name, key, detached, detached_internal_msgid, relay_detached, reattach_on, detach_after, detach_on)
    548592                        VALUES (:network, :name, :key, :detached, :detached_internal_msgid, :relay_detached, :reattach_on, :detach_after, :detach_on)`, args...)
    549593                if err != nil {
     
    559603        defer db.lock.Unlock()
    560604
    561         _, err := db.db.Exec("DELETE FROM Channel WHERE id = ?", id)
     605        ctx, cancel := context.WithTimeout(context.TODO(), sqliteQueryTimeout)
     606        defer cancel()
     607
     608        _, err := db.db.ExecContext(ctx, "DELETE FROM Channel WHERE id = ?", id)
    562609        return err
    563610}
     
    567614        defer db.lock.RUnlock()
    568615
    569         rows, err := db.db.Query(`SELECT id, target, client, internal_msgid
     616        ctx, cancel := context.WithTimeout(context.TODO(), sqliteQueryTimeout)
     617        defer cancel()
     618
     619        rows, err := db.db.QueryContext(ctx, `
     620                SELECT id, target, client, internal_msgid
    570621                FROM DeliveryReceipt
    571622                WHERE network = ?`, networkID)
     
    596647        defer db.lock.Unlock()
    597648
     649        ctx, cancel := context.WithTimeout(context.TODO(), sqliteQueryTimeout)
     650        defer cancel()
     651
    598652        tx, err := db.db.Begin()
    599653        if err != nil {
     
    602656        defer tx.Rollback()
    603657
    604         _, err = tx.Exec("DELETE FROM DeliveryReceipt WHERE network = ? AND client IS ?",
     658        _, err = tx.ExecContext(ctx, "DELETE FROM DeliveryReceipt WHERE network = ? AND client IS ?",
    605659                networkID, toNullString(client))
    606660        if err != nil {
     
    611665                rcpt := &receipts[i]
    612666
    613                 res, err := tx.Exec(`INSERT INTO DeliveryReceipt(network, target, client, internal_msgid)
     667                res, err := tx.ExecContext(ctx, `
     668                        INSERT INTO DeliveryReceipt(network, target, client, internal_msgid)
    614669                        VALUES (:network, :target, :client, :internal_msgid)`,
    615670                        sql.Named("network", networkID),
Note: See TracChangeset for help on using the changeset viewer.