Changeset 421 in code for trunk/db.go


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

File:
1 edited

Legend:

Unmodified
Added
Removed
  • 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)
Note: See TracChangeset for help on using the changeset viewer.