Annotation of 43BSDReno/contrib/isode-beta/quipu/turbo_disk.c, revision 1.1

1.1     ! root        1: #include <stdio.h>
        !             2: #include <sys/fcntl.h>
        !             3: #include "quipu/config.h"
        !             4: #include "quipu/entry.h"
        !             5: #include "psap.h"
        !             6: #include "quipu/malloc.h"
        !             7: #include "logger.h"
        !             8: 
        !             9: #ifdef TURBO_DISK
        !            10: #include <gdbm.h>
        !            11: extern RDN     parse_rdn;
        !            12: extern LLog    *log_dsap;
        !            13: extern int     gdbm_errno;
        !            14: extern datum   turbo_header_key;
        !            15: 
        !            16: static turbo_write_entry(db, e)
        !            17: GDBM_FILE      db;
        !            18: Entry  e;
        !            19: {
        !            20:        static char     kbuf[512];
        !            21:        static char     buf[10000];
        !            22:        int             rc;
        !            23:        PS              ps;
        !            24:        datum           rdn;
        !            25:        datum           ent;
        !            26: 
        !            27:        LLOG (log_dsap, LLOG_TRACE,("turbo: write_entry"));
        !            28: 
        !            29:        /* allocate the string presentation stream to print to */
        !            30:        if ( (ps = ps_alloc(str_open)) == NULLPS )
        !            31:                return(NOTOK);
        !            32:        if ( str_setup(ps, buf, sizeof(buf), 0) == NOTOK ) {
        !            33:                ps_free(ps);
        !            34:                return(NOTOK);
        !            35:        }
        !            36:        *ps->ps_ptr = 0;
        !            37: 
        !            38:        rdn_print(ps, e->e_name, EDBOUT);
        !            39:        *ps->ps_ptr = '\0';
        !            40:        strcpy(kbuf, ps->ps_base);
        !            41: 
        !            42:        rdn.dptr = kbuf;
        !            43:        rdn.dsize = strlen(rdn.dptr) + 1;
        !            44: 
        !            45:        ps_print(ps, "\n");
        !            46:        as_print(ps, e->e_attributes, EDBOUT);
        !            47:        ps_print(ps, "\n");
        !            48:        *ps->ps_ptr = '\0';
        !            49: 
        !            50:        ent.dptr = ps->ps_base;
        !            51:        ent.dsize = strlen(ent.dptr) + 1;
        !            52: 
        !            53:        if ( (rc = gdbm_store(db, rdn, ent, GDBM_REPLACE)) != 0 ) {
        !            54:                LLOG (log_dsap, LLOG_EXCEPTIONS,("turbo: gdbm_store %d, gdbm_errno %d", rc, gdbm_errno));
        !            55:                ps_free(ps);
        !            56:                return(NOTOK);
        !            57:        }
        !            58: 
        !            59:        ps_free(ps);
        !            60:        return(OK);
        !            61: }
        !            62: 
        !            63: /*
        !            64:  * turbo_writeall -- write the entries in list p to the proper edb
        !            65:  * dbm file the file is opened by turbo_open, then the list is traversed,
        !            66:  * calling turbo_write_entry to write each entry
        !            67:  */
        !            68: 
        !            69: turbo_writeall(e)
        !            70: Entry  e;
        !            71: {
        !            72:        GDBM_FILE       db, turbo_open();
        !            73:        DN              dn;
        !            74:        char            *filename;
        !            75:        int             save_heap;
        !            76: 
        !            77:        LLOG (log_dsap, LLOG_TRACE,("turbo: write_all"));
        !            78: 
        !            79:        save_heap = mem_heap;
        !            80:        GENERAL_HEAP;
        !            81: 
        !            82:        if ( (db = turbo_open(e, 1)) == NULL ) {
        !            83:                mem_heap = save_heap;
        !            84:                return(NOTOK);
        !            85:        }
        !            86: 
        !            87:        if ( turbo_write_header(db, e) != OK ) {
        !            88:                (void) gdbm_close(db);
        !            89:                mem_heap = save_heap;
        !            90:                return(NOTOK);
        !            91:        }
        !            92: 
        !            93:        while (e) {
        !            94:                if ( turbo_write_entry(db, e) != OK ) {
        !            95:                        (void) gdbm_close(db);
        !            96:                        mem_heap = save_heap;
        !            97:                        return(NOTOK);
        !            98:                }
        !            99:                e = e->e_sibling;
        !           100:        }
        !           101: 
        !           102:        (void) gdbm_close(db);
        !           103:        mem_heap = save_heap;
        !           104:        return(OK);
        !           105: }
        !           106: 
        !           107: /*
        !           108:  * turbo_write -- write the single entry pointed to by e to the proper
        !           109:  * edb dbm file.  The edb dbm file is opened by turbo_open, then a new
        !           110:  * header is written by turbo_write_header, and finally the entry is 
        !           111:  * written with a call to turbo_write_entry.
        !           112:  */
        !           113: 
        !           114: turbo_write(e)
        !           115: Entry  e;
        !           116: {
        !           117:        GDBM_FILE       db, turbo_open();
        !           118:        int             save_heap;
        !           119: 
        !           120:        LLOG (log_dsap, LLOG_TRACE, ("turbo: write"));
        !           121: 
        !           122:        save_heap = mem_heap;
        !           123:        GENERAL_HEAP;
        !           124: 
        !           125:        if ( (db = turbo_open(e, 0)) == NULL ) {
        !           126:                mem_heap = save_heap;
        !           127:                return(NOTOK);
        !           128:        }
        !           129: 
        !           130:        if ( turbo_write_header(db, e) != OK ) {
        !           131:                (void) gdbm_close(db);
        !           132:                mem_heap = save_heap;
        !           133:                return(NOTOK);
        !           134:        }
        !           135: 
        !           136:        if ( turbo_write_entry(db, e) != OK ) {
        !           137:                (void) gdbm_close(db);
        !           138:                mem_heap = save_heap;
        !           139:                return(NOTOK);
        !           140:        }
        !           141: 
        !           142:        (void) gdbm_close(db);
        !           143:        mem_heap = save_heap;
        !           144:        return(OK);
        !           145: }
        !           146: 
        !           147: /*
        !           148:  * turbo_delete -- delete the entry pointed to by p from the proper
        !           149:  * edb dbm file.
        !           150:  */
        !           151: 
        !           152: turbo_delete(e)
        !           153: Entry  e;
        !           154: {
        !           155:        static char     deletekey[256];
        !           156:        int             rc;
        !           157:        GDBM_FILE       db, turbo_open();
        !           158:        PS              ps;
        !           159:        datum           key;
        !           160:        int             save_heap;
        !           161: 
        !           162:        LLOG (log_dsap, LLOG_TRACE,("turbo: delete"));
        !           163: 
        !           164:        save_heap = mem_heap;
        !           165:        GENERAL_HEAP;
        !           166: 
        !           167:        if ( (db = turbo_open(e, 0)) == NULL ) {
        !           168:                mem_heap = save_heap;
        !           169:                return(NOTOK);
        !           170:        }
        !           171: 
        !           172:        if ( turbo_write_header(db, e) != OK ) {
        !           173:                (void) gdbm_close(db);
        !           174:                mem_heap = save_heap;
        !           175:                return(NOTOK);
        !           176:        }
        !           177: 
        !           178:        /* allocate the string presentation stream to print the key to */
        !           179:        if ( (ps = ps_alloc(str_open)) == NULLPS ) {
        !           180:                mem_heap = save_heap;
        !           181:                return(NOTOK);
        !           182:        }
        !           183:        if ( str_setup(ps, deletekey, sizeof(deletekey), 0) == NOTOK ) {
        !           184:                ps_free(ps);
        !           185:                mem_heap = save_heap;
        !           186:                return(NOTOK);
        !           187:        }
        !           188:        *ps->ps_ptr = 0;
        !           189: 
        !           190:        rdn_print(ps, e->e_name, EDBOUT);
        !           191:        *ps->ps_ptr = '\0';
        !           192:        key.dptr = ps->ps_base;
        !           193:        key.dsize = strlen(key.dptr) + 1;
        !           194: 
        !           195: printf("deleting (%s)\n", key.dptr);
        !           196:        if ( (rc = gdbm_delete(db, key)) != 0 ) {
        !           197:                LLOG (log_dsap, LLOG_EXCEPTIONS,("turbo: gdbm_delete %d gdbm_errno %d", rc, gdbm_errno));
        !           198:                ps_free(ps);
        !           199:                (void) gdbm_close(db);
        !           200:                mem_heap = save_heap;
        !           201:                return(NOTOK);
        !           202:        }
        !           203: 
        !           204:        ps_free(ps);
        !           205:        (void) gdbm_close(db);
        !           206:        mem_heap = save_heap;
        !           207:        return(OK);
        !           208: }
        !           209: 
        !           210: /*
        !           211:  * turbo_open -- open a dbm edb file for writing.  e is a pointer to the
        !           212:  * entry to be written.  It's parent is used to construct the name of
        !           213:  * the file to write.  If create is 0 a new database will not be created,
        !           214:  * otherwise it will and a backup of the old one will be made.
        !           215:  */
        !           216: 
        !           217: static GDBM_FILE turbo_open(e, create)
        !           218: Entry  e;
        !           219: char   create;
        !           220: {
        !           221:        GDBM_FILE       db;
        !           222:        DN              dn, get_copy_dn();
        !           223:        char            *filename, *dn2edbfile();
        !           224:        char            bakname[1024], turbo_gfname[1024];
        !           225: 
        !           226:        LLOG (log_dsap, LLOG_TRACE,("turbo: open"));
        !           227: 
        !           228:        /* get the name of the edb file to write to */
        !           229:        dn = get_copy_dn (e->e_parent);
        !           230:        if ((filename = dn2edbfile (dn)) == NULLCP) {
        !           231:                dn_free (dn);
        !           232:                LLOG (log_dsap, LLOG_EXCEPTIONS,("turbo: dn2edbfile failed"));
        !           233:                return (NULL);
        !           234:        }
        !           235:        dn_free(dn);
        !           236:        strcpy(turbo_gfname, filename);
        !           237:        strcat(turbo_gfname, ".gdbm");
        !           238:        strcpy(bakname, turbo_gfname);
        !           239:        strcat(bakname, ".bak");
        !           240: 
        !           241:        /* try to open it */
        !           242:        if ( create ) {
        !           243:                /* first make a backup of the old one */
        !           244:                (void) unlink(bakname);
        !           245:                if ( link(turbo_gfname, bakname) != 0 ) {
        !           246:                        LLOG (log_dsap, LLOG_EXCEPTIONS, ("turbo: could not make backup"));
        !           247:                        return(NULL);
        !           248:                }
        !           249:                (void) unlink(turbo_gfname);
        !           250: 
        !           251:                /* then open the new one */
        !           252:                db = gdbm_open(turbo_gfname, 0, GDBM_WRCREAT, 0600, 0);
        !           253:        } else
        !           254:                db = gdbm_open(turbo_gfname, 0, GDBM_WRITER, 0, 0);
        !           255: 
        !           256:        if ( db == NULL ) {
        !           257:                LLOG (log_dsap, LLOG_EXCEPTIONS, ("turbo: gdbm_open failed gdbm_errno %d", gdbm_errno));
        !           258:                return (NULL);
        !           259:        }
        !           260: 
        !           261:        return(db);
        !           262: }
        !           263: 
        !           264: /*
        !           265:  * turbo_write_header -- write a new header for the edb dbm file db.
        !           266:  * The version is taken from e's parent version
        !           267:  */
        !           268: 
        !           269: turbo_write_header(db, e)
        !           270: GDBM_FILE      db;
        !           271: Entry          e;
        !           272: {
        !           273:        static char     hbuf[256];
        !           274:        PS              ps;
        !           275:        int             rc;
        !           276:        char            *type;
        !           277:        datum           newheader;
        !           278:        int             save_heap;
        !           279: 
        !           280:        LLOG (log_dsap, LLOG_TRACE,("turbo: write_header"));
        !           281: 
        !           282:        save_heap = mem_heap;
        !           283:        GENERAL_HEAP;
        !           284: 
        !           285:        switch (e->e_data) {
        !           286:        case E_DATA_MASTER:
        !           287:                type = "MASTER";
        !           288:                break;
        !           289:        case E_TYPE_SLAVE :
        !           290:                type = "SLAVE";
        !           291:                break;
        !           292:        default:
        !           293:                type = "CACHE";
        !           294:                break;
        !           295:        }
        !           296: 
        !           297:        /* allocate the string presentation stream to print to */
        !           298:        if ( (ps = ps_alloc(str_open)) == NULLPS ) {
        !           299:                mem_heap = save_heap;
        !           300:                return(NOTOK);
        !           301:        }
        !           302:        if ( str_setup(ps, hbuf, sizeof(hbuf), 0) == NOTOK ) {
        !           303:                ps_free(ps);
        !           304:                mem_heap = save_heap;
        !           305:                return(NOTOK);
        !           306:        }
        !           307: 
        !           308:        ps_print(ps, type);
        !           309:        ps_print(ps, "\n");
        !           310:        if (e->e_parent != NULLENTRY)
        !           311:                ps_print(ps, e->e_parent->e_edbversion);
        !           312:        else
        !           313:                ps_print(ps, new_version());
        !           314:        ps_print(ps, "\n");
        !           315:        *ps->ps_ptr = '\0';
        !           316: 
        !           317:        newheader.dptr = ps->ps_base;
        !           318:        newheader.dsize = strlen(newheader.dptr) + 1;
        !           319: 
        !           320:        if ( (rc = gdbm_store(db, turbo_header_key, newheader, GDBM_REPLACE)) != 0 ) {
        !           321:                LLOG (log_dsap, LLOG_EXCEPTIONS,("turbo: gdbm_store %d gdbm_errno %d", rc, gdbm_errno));
        !           322:                mem_heap = save_heap;
        !           323:                return(NOTOK);
        !           324:        }
        !           325:        mem_heap = save_heap;
        !           326:        return(OK);
        !           327: }
        !           328: #else
        !           329: /* ARGSUSED */
        !           330: turbo_writeall(e)
        !           331: Entry e;
        !           332: {}
        !           333: #endif

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.