VALUE rpm_db_transaction(int argc, VALUE* argv, VALUE db) { VALUE trans; rpm_trans_t* ts; const char* root = "/"; #if 0 if (OBJ_FROZEN(db)) { rb_error_frozen("RPM::DB"); } #endif switch (argc) { case 0: break; case 1: if (TYPE(argv[0]) != T_STRING) { rb_raise(rb_eTypeError, "illegal argument type"); } root = RSTRING_PTR(argv[0]); break; default: rb_raise(rb_eArgError, "argument too many(0..1)"); } ts = ALLOC(rpm_trans_t); #if RPM_VERSION_CODE < RPM_VERSION(4,1,0) ts->ts = rpmtransCreateSet(RPM_DB(db), root); #else ts->ts = rpmtsCreate(); rpmtsSetRootDir(ts->ts, root); #endif ts->script_fd = 0; ts->db = DATA_PTR(db); trans = Data_Wrap_Struct(rpm_cTransaction, NULL, transaction_free, ts); db_ref(ts->db); rb_ivar_set(trans, id_db, db); rb_catch("abort", transaction_yield, trans); if (rb_ivar_get(trans, id_aborted) == Qtrue) { return Qfalse; } else if (rb_ivar_get(trans, id_commited) != Qtrue && !OBJ_FROZEN(db)) { rb_catch("abort", transaction_commit, trans); } return rb_ivar_get(trans, id_pl); }
static int reduce(struct cparse_params *v, long act) { VALUE code; v->ruleno = -act * 3; code = rb_catch("racc_jump", reduce0, v->value_v); v->errstatus = num_to_long(rb_ivar_get(v->parser, id_errstatus)); return NUM2INT(code); }
void aspirin_response_start(struct evhttp_request* request, VALUE app, VALUE env) { Aspirin_Response *response; volatile VALUE arg = Qnil, ret = Qnil, obj = Data_Make_Struct(rb_cAspirin_Response, Aspirin_Response, aspirin_response_mark, -1, response); RB_GC_GUARD(obj); response->request = request; response->app = app; response->env = aspirin_response_create_env(obj, env); arg = rb_ary_new3(2, response->app, response->env); ret = rb_catch("async", aspirin_response_call_with_catch_async, arg); aspirin_response_call(obj, ret); }
VALUE kernel_spec_rb_catch(VALUE self, VALUE sym, VALUE main_proc) { return rb_catch(StringValuePtr(sym), kernel_spec_call_proc_with_catch, main_proc); }