Changeset 202 in code for trunk


Ignore:
Timestamp:
Apr 1, 2020, 1:40:20 PM (5 years ago)
Author:
contact
Message:

Add "network delete" service command

And add all the infrastructure required to stop and delete networks.

References: https://todo.sr.ht/~emersion/soju/17

Location:
trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/db.go

    r173 r202  
    216216}
    217217
     218func (db *DB) DeleteNetwork(id int64) error {
     219        db.lock.Lock()
     220        defer db.lock.Unlock()
     221
     222        tx, err := db.db.Begin()
     223        if err != nil {
     224                return err
     225        }
     226        defer tx.Rollback()
     227
     228        _, err = tx.Exec("DELETE FROM Network WHERE id = ?", id)
     229        if err != nil {
     230                return err
     231        }
     232
     233        _, err = tx.Exec("DELETE FROM Channel WHERE network = ?", id)
     234        if err != nil {
     235                return err
     236        }
     237
     238        return tx.Commit()
     239}
     240
    218241func (db *DB) ListChannels(networkID int64) ([]Channel, error) {
    219242        db.lock.RLock()
  • trunk/service.go

    r151 r202  
    9898                                        handle: handleServiceNetworkStatus,
    9999                                },
     100                                "delete": {
     101                                        usage:  "<name>",
     102                                        desc:   "delete a network",
     103                                        handle: handleServiceNetworkDelete,
     104                                },
    100105                        },
    101106                },
     
    144149}
    145150
    146 func handleServiceCreateNetwork(dc *downstreamConn, params []string) error {
     151func newFlagSet() *flag.FlagSet {
    147152        fs := flag.NewFlagSet("", flag.ContinueOnError)
    148153        fs.SetOutput(ioutil.Discard)
     154        return fs
     155}
     156
     157func handleServiceCreateNetwork(dc *downstreamConn, params []string) error {
     158        fs := newFlagSet()
    149159        addr := fs.String("addr", "", "")
    150160        name := fs.String("name", "", "")
     
    178188        }
    179189
    180         sendServicePRIVMSG(dc, fmt.Sprintf("created network %s successfully", network.GetName()))
     190        sendServicePRIVMSG(dc, fmt.Sprintf("created network %q", network.GetName()))
    181191        return nil
    182192}
     
    205215        return nil
    206216}
     217
     218func handleServiceNetworkDelete(dc *downstreamConn, params []string) error {
     219        if len(params) != 1 {
     220                return fmt.Errorf("expected exactly one argument")
     221        }
     222
     223        net := dc.user.getNetwork(params[0])
     224        if net == nil {
     225                return fmt.Errorf("unknown network %q", params[0])
     226        }
     227
     228        if err := dc.user.deleteNetwork(net.ID); err != nil {
     229                return err
     230        }
     231
     232        sendServicePRIVMSG(dc, fmt.Sprintf("deleted network %q", net.GetName()))
     233        return nil
     234}
  • trunk/user.go

    r201 r202  
    3838type network struct {
    3939        Network
    40         user *user
    41         ring *Ring
     40        user    *user
     41        ring    *Ring
     42        stopped chan struct{}
    4243
    4344        lock    sync.Mutex
     
    5152                user:    user,
    5253                ring:    NewRing(user.srv.RingCap),
     54                stopped: make(chan struct{}),
    5355                history: make(map[string]uint64),
    5456        }
     
    5860        var lastTry time.Time
    5961        for {
     62                select {
     63                case <-net.stopped:
     64                        return
     65                default:
     66                        // This space is intentionally left blank
     67                }
     68
    6069                if dur := time.Now().Sub(lastTry); dur < retryConnectMinDelay {
    6170                        delay := retryConnectMinDelay - dur
     
    91100        defer net.lock.Unlock()
    92101        return net.conn
     102}
     103
     104func (net *network) Stop() {
     105        select {
     106        case <-net.stopped:
     107                return
     108        default:
     109                close(net.stopped)
     110        }
     111
     112        if uc := net.upstream(); uc != nil {
     113                uc.Close()
     114        }
    93115}
    94116
     
    266288        return network, nil
    267289}
     290
     291func (u *user) deleteNetwork(id int64) error {
     292        for i, net := range u.networks {
     293                if net.ID != id {
     294                        continue
     295                }
     296
     297                if err := u.srv.db.DeleteNetwork(net.ID); err != nil {
     298                        return err
     299                }
     300
     301                u.forEachDownstream(func(dc *downstreamConn) {
     302                        if dc.network != nil && dc.network == net {
     303                                dc.Close()
     304                        }
     305                })
     306
     307                net.Stop()
     308                u.networks = append(u.networks[:i], u.networks[i+1:]...)
     309                return nil
     310        }
     311
     312        panic("tried deleting a non-existing network")
     313}
Note: See TracChangeset for help on using the changeset viewer.