Exemple #1
0
static ssize_t data_triplet_format_t_lookup(data_t *data, fastcall_crud *fargs) { // {{{
    ssize_t                ret;
    uintmax_t              offset;
    data_t                 converted;
    data_t                 d_key;
    data_t                *d_key_ptr         = &d_key;
    data_t                 storage_item;
    triplet_format_t      *fdata             = (triplet_format_t *)data->ptr;

    // fetch value from storage
    data_t          sl_key    = DATA_SLICET(fargs->key, 1, ~0);
    fastcall_lookup r_lookup = {
        { 4, ACTION_LOOKUP },
        &sl_key,
        &storage_item
    };
    if( (ret = data_query(&fdata->storage, &r_lookup)) < 0)
        return ret;

    // get offset for this data
    if(helper_key_current(fargs->key, &d_key) < 0) {
        d_key_ptr = fargs->key;
        data_get(ret, TYPE_UINTT, offset, d_key_ptr);
    } else {
        data_get(ret, TYPE_UINTT, offset, d_key_ptr);
        data_free(&d_key);
    }

    if(ret < 0)
        return ret;

    data_t                sl_value  = DATA_SLICET(&storage_item, offset, ~0);
    fastcall_unpack       r_unpack  = {
        { 4, ACTION_UNPACK },
        offset == 0 ?
        &storage_item :
        &sl_value,
        &converted,
        FORMAT(packed)
    };
    if( (ret = data_query(&fdata->slave, &r_unpack)) < 0)
        goto exit;

    *fargs->value = converted;
exit:
    data_free(&storage_item);
    return ret;
} // }}}
Exemple #2
0
static ssize_t data_list_t_lookup(data_t *data, fastcall_lookup *fargs){ // {{{
	ssize_t                ret;
	uintmax_t              key_uint;
	data_t                 d_key;
	data_t                *d_key_ptr         = &d_key;
	list_t                *fdata             = (list_t *)data->ptr;
	
	if(fargs->key == NULL || fargs->value == NULL)
		return -EINVAL;
	
	if(helper_key_current(fargs->key, &d_key) < 0)
		d_key_ptr = fargs->key;
	
	data_get(ret, TYPE_UINTT, key_uint, d_key_ptr);
	if(ret == 0){
		ctx_lookup ctx = { key_uint };
		if(list_t_enum(fdata, (list_t_callback)&iter_list_t_lookup, &ctx) != 0)
			return data_notconsumable_t(fargs->value, ctx.output);
	}
	return -EINVAL;
} // }}}
Exemple #3
0
ssize_t       data_default_control       (data_t *data, fastcall_control *fargs){ // {{{
	switch(fargs->function){
		case HK(datatype):;
			data_t                d_type    = DATA_PTR_DATATYPET(&data->type);
			fastcall_convert_from r_convert = { { 5, ACTION_CONVERT_FROM }, &d_type, FORMAT(native) };
			return data_query(fargs->value, &r_convert);
		
		case HK(data):;
			data_t                d_key     = DATA_VOID;
			
			if(fargs->key && helper_key_current(fargs->key, &d_key) == 0){ // expect only empty key
				data_free(&d_key);
				return -EINVAL;
			}
			
			fargs->value = data;
			return 0;
			
		default:
			break;
	};
	return -ENOSYS;
} // }}}