Changeset 421 in code


Ignore:
Timestamp:
Oct 24, 2020, 1:14:23 PM (5 years ago)
Author:
contact
Message:

Switch DB API to user IDs

This commit changes the Network schema to use user IDs instead of
usernames. While at it, a new UNIQUE(user, name) constraint ensures
there is no conflict with custom network names.

Closes: https://todo.sr.ht/~emersion/soju/86
References: https://todo.sr.ht/~emersion/soju/29

Location:
trunk
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/contrib/znc-import.go

    r357 r421  
    115115                        log.Fatalf("failed to store user %q: %v", username, err)
    116116                }
    117 
    118                 l, err := db.ListNetworks(username)
     117                userID := u.ID
     118
     119                l, err := db.ListNetworks(userID)
    119120                if err != nil {
    120121                        log.Fatalf("failed to list networks for user %q: %v", username, err)
     
    182183                        n.Pass = pass
    183184
    184                         if err := db.StoreNetwork(username, n); err != nil {
     185                        if err := db.StoreNetwork(userID, n); err != nil {
    185186                                logger.Fatalf("failed to store network: %v", err)
    186187                        }
  • trunk/db.go

    r420 r421  
    7171        id INTEGER PRIMARY KEY,
    7272        name VARCHAR(255),
    73         user VARCHAR(255) NOT NULL,
     73        user INTEGER NOT NULL,
    7474        addr VARCHAR(255) NOT NULL,
    7575        nick VARCHAR(255) NOT NULL,
     
    8383        sasl_external_cert BLOB DEFAULT NULL,
    8484        sasl_external_key BLOB DEFAULT NULL,
    85         FOREIGN KEY(user) REFERENCES User(username),
    86         UNIQUE(user, addr, nick)
     85        FOREIGN KEY(user) REFERENCES User(id),
     86        UNIQUE(user, addr, nick),
     87        UNIQUE(user, name)
    8788);
    8889
     
    116117                ALTER TABLE UserNew RENAME TO User;
    117118        `,
     119        `
     120                CREATE TABLE NetworkNew (
     121                        id INTEGER PRIMARY KEY,
     122                        name VARCHAR(255),
     123                        user INTEGER NOT NULL,
     124                        addr VARCHAR(255) NOT NULL,
     125                        nick VARCHAR(255) NOT NULL,
     126                        username VARCHAR(255),
     127                        realname VARCHAR(255),
     128                        pass VARCHAR(255),
     129                        connect_commands VARCHAR(1023),
     130                        sasl_mechanism VARCHAR(255),
     131                        sasl_plain_username VARCHAR(255),
     132                        sasl_plain_password VARCHAR(255),
     133                        sasl_external_cert BLOB DEFAULT NULL,
     134                        sasl_external_key BLOB DEFAULT NULL,
     135                        FOREIGN KEY(user) REFERENCES User(id),
     136                        UNIQUE(user, addr, nick),
     137                        UNIQUE(user, name)
     138                );
     139                INSERT INTO NetworkNew
     140                        SELECT Network.id, name, User.id as user, addr, nick,
     141                                Network.username, realname, pass, connect_commands,
     142                                sasl_mechanism, sasl_plain_username, sasl_plain_password,
     143                                sasl_external_cert, sasl_external_key
     144                        FROM Network
     145                        JOIN User ON Network.user = User.username;
     146                DROP TABLE Network;
     147                ALTER TABLE NetworkNew RENAME TO Network;
     148        `,
    118149}
    119150
     
    264295}
    265296
    266 func (db *DB) DeleteUser(username string) error {
     297func (db *DB) DeleteUser(id int64) error {
    267298        db.lock.Lock()
    268299        defer db.lock.Unlock()
     
    280311                        JOIN Network ON Channel.network = Network.id
    281312                        WHERE Network.user = ?
    282                 )`, username)
    283         if err != nil {
    284                 return err
    285         }
    286 
    287         _, err = tx.Exec("DELETE FROM Network WHERE user = ?", username)
    288         if err != nil {
    289                 return err
    290         }
    291 
    292         _, err = tx.Exec("DELETE FROM User WHERE username = ?", username)
     313                )`, id)
     314        if err != nil {
     315                return err
     316        }
     317
     318        _, err = tx.Exec("DELETE FROM Network WHERE user = ?", id)
     319        if err != nil {
     320                return err
     321        }
     322
     323        _, err = tx.Exec("DELETE FROM User WHERE id = ?", id)
    293324        if err != nil {
    294325                return err
     
    298329}
    299330
    300 func (db *DB) ListNetworks(username string) ([]Network, error) {
     331func (db *DB) ListNetworks(userID int64) ([]Network, error) {
    301332        db.lock.RLock()
    302333        defer db.lock.RUnlock()
     
    307338                FROM Network
    308339                WHERE user = ?`,
    309                 username)
     340                userID)
    310341        if err != nil {
    311342                return nil, err
     
    343374}
    344375
    345 func (db *DB) StoreNetwork(username string, network *Network) error {
     376func (db *DB) StoreNetwork(userID int64, network *Network) error {
    346377        db.lock.Lock()
    347378        defer db.lock.Unlock()
     
    386417                                sasl_plain_password, sasl_external_cert, sasl_external_key)
    387418                        VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
    388                         username, netName, network.Addr, network.Nick, netUsername, realname, pass, connectCommands,
     419                        userID, netName, network.Addr, network.Nick, netUsername, realname, pass, connectCommands,
    389420                        saslMechanism, saslPlainUsername, saslPlainPassword, network.SASL.External.CertBlob,
    390421                        network.SASL.External.PrivKeyBlob)
  • trunk/downstream.go

    r419 r421  
    10171017                        }
    10181018                        n.Nick = nick
    1019                         err = dc.srv.db.StoreNetwork(dc.user.Username, &n.Network)
     1019                        err = dc.srv.db.StoreNetwork(dc.user.ID, &n.Network)
    10201020                })
    10211021                if err != nil {
     
    16981698        n.SASL.Plain.Username = username
    16991699        n.SASL.Plain.Password = password
    1700         if err := dc.srv.db.StoreNetwork(dc.user.Username, &n.Network); err != nil {
     1700        if err := dc.srv.db.StoreNetwork(dc.user.ID, &n.Network); err != nil {
    17011701                dc.logger.Printf("failed to save NickServ credentials: %v", err)
    17021702        }
  • trunk/service.go

    r379 r421  
    549549        net.SASL.Mechanism = "EXTERNAL"
    550550
    551         if err := dc.srv.db.StoreNetwork(net.Username, &net.Network); err != nil {
     551        if err := dc.srv.db.StoreNetwork(dc.user.ID, &net.Network); err != nil {
    552552                return err
    553553        }
     
    594594        net.SASL.Mechanism = "PLAIN"
    595595
    596         if err := dc.srv.db.StoreNetwork(net.Username, &net.Network); err != nil {
     596        if err := dc.srv.db.StoreNetwork(dc.user.ID, &net.Network); err != nil {
    597597                return err
    598598        }
     
    618618        net.SASL.Mechanism = ""
    619619
    620         if err := dc.srv.db.StoreNetwork(dc.user.Username, &net.Network); err != nil {
     620        if err := dc.srv.db.StoreNetwork(dc.user.ID, &net.Network); err != nil {
    621621                return err
    622622        }
     
    690690        u.stop()
    691691
    692         if err := dc.srv.db.DeleteUser(username); err != nil {
     692        if err := dc.srv.db.DeleteUser(dc.user.ID); err != nil {
    693693                return fmt.Errorf("failed to delete user: %v", err)
    694694        }
  • trunk/user.go

    r416 r421  
    315315        defer close(u.done)
    316316
    317         networks, err := u.srv.db.ListNetworks(u.Username)
     317        networks, err := u.srv.db.ListNetworks(u.ID)
    318318        if err != nil {
    319319                u.srv.Logger.Printf("failed to list networks for user %q: %v", u.Username, err)
     
    509509
    510510        network := newNetwork(u, record, nil)
    511         err := u.srv.db.StoreNetwork(u.Username, &network.Network)
     511        err := u.srv.db.StoreNetwork(u.ID, &network.Network)
    512512        if err != nil {
    513513                return nil, err
     
    529529        }
    530530
    531         if err := u.srv.db.StoreNetwork(u.Username, record); err != nil {
     531        if err := u.srv.db.StoreNetwork(u.ID, record); err != nil {
    532532                return nil, err
    533533        }
Note: See TracChangeset for help on using the changeset viewer.