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; }
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; }
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; }
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; }