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; }
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; }
void rdb_save_triggles(rio *rdb) { //save event //db_num int int int int //db //scripts_num //key event lua_scripts //key event lua_scripts //....... dictIterator *di = NULL; dictEntry *de; int i=0; for(i=0;i<server.dbnum;i++){ int eventid=server.bridge_db.bridge_event[i]; rioWrite(rdb,&eventid,4); } for(i=0;i<server.dbnum;i++) { dict *d = server.bridge_db.triggle_scipts[i]; int mysize=dictSize(d); rioWrite(rdb,&mysize,4); if (dictSize(d) == 0) continue; di = dictGetSafeIterator(d); if (!di) { return ; } /* Iterate this DB writing every entry */ while((de = dictNext(di)) != NULL) { sds keystr = dictGetKey(de); robj key; initStaticStringObject(key,keystr); if (rdbSaveStringObject(rdb,&key) == -1) return; struct bridge_db_triggle_t * tmptrg=dictGetVal(de); int event_id=tmptrg->event; rioWrite(rdb,&event_id,4); int db_id=tmptrg->dbid; rioWrite(rdb,&db_id,4); if (rdbSaveObjectType(rdb,tmptrg->lua_scripts) == -1) return ; if (rdbSaveObject(rdb,tmptrg->lua_scripts) == -1) return ; } } if (di) dictReleaseIterator(di); }