Changeset b73ac9c for storage.c


Ignore:
Timestamp:
2005-12-13T23:05:27Z (18 years ago)
Author:
Jelmer Vernooij <jelmer@…>
Branches:
master
Children:
d3307e2
Parents:
a301379c
Message:

Add support for 'primary' and 'migrate' account storages.
Fix two bugs in the text storage backend that were introduced by my previous
changes.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • storage.c

    ra301379c rb73ac9c  
    3838}
    3939
    40 storage_t *storage_init(const char *name)
     40static storage_t *storage_init_single(const char *name)
    4141{
    4242        GList *gl;
     
    5858}
    5959
     60GList *storage_init(const char *primary, char **migrate)
     61{
     62        GList *ret = NULL;
     63        int i;
     64        storage_t *storage;
     65
     66        storage = storage_init_single(primary);
     67        if (storage == NULL)
     68                return NULL;
     69
     70        ret = g_list_append(ret, storage);
     71
     72        for (i = 0; migrate && migrate[i]; i++) {
     73                storage = storage_init_single(migrate[i]);
     74       
     75                if (storage)
     76                        ret = g_list_append(ret, storage);
     77        }
     78
     79        return ret;
     80}
     81
    6082storage_status_t storage_check_pass (const char *nick, const char *password)
    6183{
    62         return global.storage->check_pass(nick, password);
     84        GList *gl;
     85       
     86        /* Loop until we don't get NO_SUCH_USER */
     87
     88        for (gl = global.storage; gl; gl = gl->next) {
     89                storage_t *st = gl->data;
     90                storage_status_t status;
     91
     92                status = st->check_pass(nick, password);
     93                if (status != STORAGE_NO_SUCH_USER)
     94                        return status;
     95        }
     96       
     97        return STORAGE_NO_SUCH_USER;
    6398}
    6499
    65100storage_status_t storage_load (const char *nick, const char *password, irc_t * irc)
    66101{
    67         return global.storage->load(nick, password, irc);
     102        GList *gl;
     103       
     104        /* Loop until we don't get NO_SUCH_USER */
     105        for (gl = global.storage; gl; gl = gl->next) {
     106                storage_t *st = gl->data;
     107                storage_status_t status;
     108
     109                status = st->load(nick, password, irc);
     110                if (status == STORAGE_OK) {
     111                        irc_setpass(irc, password);
     112                        return status;
     113                }
     114               
     115                if (status != STORAGE_NO_SUCH_USER)
     116                        return status;
     117        }
     118       
     119        return STORAGE_NO_SUCH_USER;
    68120}
    69121
    70122storage_status_t storage_save (irc_t *irc, int overwrite)
    71123{
    72         return global.storage->save(irc, overwrite);
     124        return ((storage_t *)global.storage->data)->save(irc, overwrite);
    73125}
    74126
    75127storage_status_t storage_remove (const char *nick, const char *password)
    76128{
    77         return global.storage->remove(nick, password);
     129        GList *gl;
     130        storage_status_t ret = STORAGE_OK;
     131       
     132        /* Remove this account from all storage backends. If this isn't
     133         * done, the account will still be usable, it'd just be
     134         * loaded from a different backend. */
     135        for (gl = global.storage; gl; gl = gl->next) {
     136                storage_t *st = gl->data;
     137                storage_status_t status;
     138
     139                status = st->remove(nick, password);
     140                if (status != STORAGE_NO_SUCH_USER &&
     141                        status != STORAGE_OK)
     142                        ret = status;
     143        }
     144       
     145        return ret;
    78146}
    79147
    80148storage_status_t storage_rename (const char *onick, const char *nnick, const char *password)
    81149{
    82         return global.storage->rename(onick, nnick, password);
     150        storage_status_t status;
     151        GList *gl = global.storage;
     152        storage_t *primary_storage = gl->data;
     153        irc_t *irc;
     154
     155        /* First, try to rename in the current write backend, assuming onick
     156         * is stored there */
     157        status = primary_storage->rename(onick, nnick, password);
     158        if (status != STORAGE_NO_SUCH_USER)
     159                return status;
     160
     161        /* Try to load from a migration backend and save to the current backend.
     162         * Explicitly remove the account from the migration backend as otherwise
     163         * it'd still be usable under the old name */
     164       
     165        irc = g_new0(irc_t, 1);
     166        status = storage_load(onick, password, irc);
     167        if (status != STORAGE_OK) {
     168                irc_free(irc);
     169                return status;
     170        }
     171
     172        g_free(irc->nick);
     173        irc->nick = g_strdup(nnick);
     174
     175        status = storage_save(irc, FALSE);
     176        if (status != STORAGE_OK) {
     177                irc_free(irc);
     178                return status;
     179        }
     180        irc_free(irc);
     181
     182        storage_remove(onick, password);
     183
     184        return STORAGE_OK;
    83185}
Note: See TracChangeset for help on using the changeset viewer.