示例#1
0
文件: redis_ops.c 项目: adarqui/dfs
int redis_readdir_namespace(char * path, void *buf, fuse_fill_dir_t filler) {
	TCMAP *map;
	TCLISTDATUM *tcld;
	TCLIST * tcl;
	int ret = -ENOENT, i;
	struct stat st;
	char pathbuf[1024];

	xlog("redis_readdir_namespace", "path=%s\n", path);

	if(!buf || !filler) return ret;

	memset(pathbuf,0,sizeof(pathbuf));
	snprintf(pathbuf,sizeof(pathbuf)-1,"%s",path);
	map = redis_keys_to_tcmap(redis_dir_to_namespace(pathbuf,'/','*'));
	if(!map) return ret;

	tcl = tcmapvals(map);
	if(!tcl) return ret;

	xlog("redis_readdir_namespace", "anum=%i start=%i num=%i\n", tcl->anum, tcl->start, tcl->num);

	for(i=tcl->start;i<tcl->num;i++) {
		memset(&st,0,sizeof(st));
		tcld = &tcl->array[i];
		filler(buf, redis_dir_to_namespace((char *)tcld->ptr,'*','/'), &st, 0);
	}

	tclistclear(tcl);
	tcmapclear(map);
	
	return 0;
}
示例#2
0
/* RTDBIterValuesValsType.tp_iternext */
static PyObject *
RTDBIterValuesVals_tp_iternext(DBIter *self)
{
    RDBBase *rdbbase = (RDBBase *)self->db;
    void *key;
    int key_size;
    TCMAP *value;
    TCLIST *valuevals;
    PyObject *pyvaluevals;

    if (rdbbase->changed) {
        return set_error(Error, "DB changed during iteration");
    }
    Py_BEGIN_ALLOW_THREADS
    key = tcrdbiternext(rdbbase->rdb, &key_size);
    if (key) {
        value = tcrdbtblget(rdbbase->rdb, key, key_size);
    }
    Py_END_ALLOW_THREADS
    if (!key) {
        if (tcrdbecode(rdbbase->rdb) == TTENOREC) {
            return set_stopiteration_error();
        }
        return set_rdb_error(rdbbase->rdb, NULL);
    }
    valuevals = tcmapvals(value);
    pyvaluevals = tclist_to_tuple(valuevals);
    tcmapdel(value);
    tclistdel(valuevals);
    return pyvaluevals;
}