static ssize_t try_handler(machine_t *machine, request_t *request){ // {{{ ssize_t ret; data_t freeme; request_t *try_request; try_userdata *userdata = (try_userdata *)machine->userdata; try_threaddata *threaddata = thread_data_get(&userdata->thread_data); threaddata->machine = machine; threaddata->request = request; threaddata->ret = 0; data_set_void(&freeme); if(userdata->request == 0){ try_request = request; }else{ if( (ret = get_hash(hash_data_find(request, userdata->request), &freeme, &try_request)) < 0) return ret; } request_t r_next[] = { { userdata->return_to, DATA_MACHINET(userdata->try_end) }, hash_inline(try_request), hash_end }; fastcall_query r_query = { { 3, ACTION_QUERY }, r_next }; if( (ret = data_query(&userdata->machine, &r_query)) < 0){ if(userdata->request == 0){ request_t r_pass[] = { { HK(ret), DATA_PTR_SIZET(&ret) }, hash_inline(request), hash_end }; threaddata->ret = machine_pass(machine, r_pass); }else{ request_t r_pass[] = { { HK(ret), DATA_PTR_SIZET(&ret) }, hash_inline(try_request), hash_end }; request_t r_next[] = { { HK(ret), DATA_PTR_SIZET(&ret) }, { userdata->request_out, DATA_PTR_HASHT(r_pass) }, hash_inline(request), hash_end }; threaddata->ret = machine_pass(machine, r_next); } } data_free(&freeme); return threaddata->ret; } // }}}
static ssize_t struct_machine_pack(machine_t *machine, request_t *request){ ssize_t ret; size_t struct_size; data_t *buffer; request_t *values; struct_userdata *userdata = (struct_userdata *)machine->userdata; switch(userdata->values){ case STRUCT_VALUES_WHOLE: values = request; break; case STRUCT_VALUES_ONE: hash_data_get(ret, TYPE_HASHT, values, request, userdata->key_values); if(ret != 0) return error("hash with keys not supplied"); break; }; if(userdata->lazy == 1){ request_t r_next[] = { { userdata->buffer, DATA_STRUCTT(userdata->structure, values) }, hash_next(request) }; return machine_pass(machine, r_next); }else{ buffer = hash_data_find(request, userdata->buffer); if(buffer != NULL){ if( (struct_size = struct_pack(userdata->structure, values, buffer)) == 0) return error("struct_pack failed"); request_t new_request[] = { { userdata->size, DATA_PTR_SIZET(&struct_size) }, hash_next(request) }; return machine_pass(machine, new_request); } return machine_pass(machine, request); } }