Exemplo n.º 1
0
int DXDB_rdbSave(FILE *fp) { //printf("DXDB_rdbSave\n");
    if (rdbSaveLen(fp, Num_tbls)                               == -1) return -1;
    if (rdbSaveLen(fp, Num_indx)                               == -1) return -1;
    for (int tmatch = 0; tmatch < Num_tbls; tmatch++) {
        r_tbl_t *rt = &Tbl[tmatch];
        if (!rt->name) continue; // respect deletion
        if (rdbSaveType        (fp, REDIS_BTREE)               == -1) return -1;
        if (rdbSaveBT          (fp, rt->btr)                   == -1) return -1;
        MATCH_PARTIAL_INDICES(tmatch)
        if (matches) {
            for (int i = 0; i < matches; i++) {
                r_ind_t *ri = &Index[inds[i]];
                if (ri->luat) {
                    if (rdbSaveType    (fp, REDIS_LUA_TRIGGER) == -1) return -1;
                    if (rdbSaveLuaTrigger(fp, ri)              == -1) return -1;
                } else {
                    if (rdbSaveType        (fp, REDIS_BTREE)   == -1) return -1;
                    if (rdbSaveBT          (fp, ri->btr)       == -1) return -1;
                }
            }
        }
    }
    if (rdbSaveType(fp, REDIS_EOF) == -1) return -1; /* SQL delim REDIS_EOF */
    int ret = 0;
    CLEAR_LUA_STACK lua_getglobal(server.lua, "save_lua_universe");
    int r = DXDB_lua_pcall(server.lua, 0, 0, 0);
    if (r) { ret = -1;
        redisLog(REDIS_WARNING, "ERROR SAVING LUA UNIVERSE: %s",
                                 lua_tostring(server.lua, -1));
    }
    CLEAR_LUA_STACK
    return ret;
}
Exemplo n.º 2
0
int rdbSaveNRL(FILE *fp, robj *o) {
    listNode *ln;
    d_l_t    *nrlind  = o->ptr;
    list     *nrltoks = nrlind->l1;

    int imatch = nrlind->num;
    if (rdbSaveLen(fp, imatch) == -1) return -1;
    robj *iname  = Index[server.dbid][imatch].obj;
    if (rdbSaveStringObject(fp, iname) == -1) return -1;
    int   tmatch = Index[server.dbid][imatch].table;
    if (rdbSaveLen(fp, tmatch) == -1) return -1;

    if (rdbSaveLen(fp, listLength(nrltoks)) == -1) return -1;
    listIter    *li = listGetIterator(nrltoks, AL_START_HEAD);
    while((ln = listNext(li)) != NULL) {
        sds   s = ln->value;
        robj *r = createStringObject(s, sdslen(s));
        if (rdbSaveStringObject(fp, r) == -1) return -1;
        decrRefCount(r);
    }
    listReleaseIterator(li);

    list  *nrlcols = nrlind->l2;
    if (rdbSaveLen(fp, listLength(nrlcols)) == -1) return -1;
    li = listGetIterator(nrlcols, AL_START_HEAD);
    while((ln = listNext(li)) != NULL) {
        uint32 i = (uint32)(long)ln->value;
        if (rdbSaveLen(fp, i) == -1) return -1;
    }
    listReleaseIterator(li);

    return 0;
}
Exemplo n.º 3
0
static int rdbSaveAllRows(FILE *fp, bt *btr, bt_n *x) {
    for (int i = 0; i < x->n; i++) {
        uchar *stream  = (uchar *)KEYS(btr, x, i);
        int    ssize   = getStreamMallocSize(stream, btr);
        uchar *wstream = UU(btr) ? &stream : stream;
        if (rdbSaveLen(fp, ssize)        == -1) return -1;
        if (fwrite(wstream, ssize, 1, fp) == 0) return -1;
    }

    if (!x->leaf) {
        for (int i = 0; i <= x->n; i++) {
            if (rdbSaveAllRows(fp, btr, NODES(btr, x)[i]) == -1) return -1;
        }
    }
    return 0;
}
Exemplo n.º 4
0
int rdbSaveBT(FILE *fp, robj *o) {
    struct btree *btr  = (struct btree *)(o->ptr);
    if (!btr) {
        if (fwrite(&VIRTUAL_INDEX_TYPE, 1, 1, fp) == 0) return -1;
        return 0;
    }

    if (fwrite(&(btr->btype), 1, 1, fp) == 0) return -1;
    int tmatch = btr->num;
    if (rdbSaveLen(fp, tmatch) == -1) return -1;

    int dbid   = server.dbid;
    if (btr->btype == BTREE_TABLE) { /* BTree w/ DATA */
        //RL4 "%d: saving table: %s virt_index: %d",
            //tmatch, Tbl[dbid][tmatch].name->ptr, Tbl[dbid][tmatch].virt_indx);
        if (rdbSaveLen(fp, Tbl[dbid][tmatch].virt_indx) == -1) return -1;
        if (rdbSaveStringObject(fp, Tbl[dbid][tmatch].name) == -1) return -1;
        if (rdbSaveLen(fp, Tbl[dbid][tmatch].col_count) == -1) return -1;
        for (int i = 0; i < Tbl[dbid][tmatch].col_count; i++) {
            if (rdbSaveStringObject(fp, Tbl[dbid][tmatch].col_name[i]) == -1)
                return -1;
            if (rdbSaveLen(fp, (int)Tbl[dbid][tmatch].col_type[i]) == -1)
                return -1;
        }
        if (fwrite(&(btr->ktype),    1, 1, fp) == 0) return -1;
        if (rdbSaveLen(fp, btr->numkeys)       == -1) return -1;
        if (btr->root && btr->numkeys > 0) {
            if (rdbSaveAllRows(fp, btr, btr->root) == -1) return -1;
        }
    } else {                           /* INDEX */
        int imatch = tmatch;
        //RL4 "%d: save index: %s tbl: %d col: %d type: %d",
            //imatch, Index[dbid][imatch].obj->ptr, Index[dbid][imatch].table,
            //Index[dbid][imatch].column, Index[dbid][imatch].type);
        if (rdbSaveStringObject(fp, Index[dbid][imatch].obj) == -1) return -1;
        if (rdbSaveLen(fp, Index[dbid][imatch].table) == -1) return -1;
        if (rdbSaveLen(fp, Index[dbid][imatch].column) == -1) return -1;
        if (rdbSaveLen(fp, (int)Index[dbid][imatch].type) == -1) return -1;
        if (fwrite(&(btr->ktype),    1, 1, fp) == 0) return -1;
    }
    return 0;
}