void oci8_do_raise_init_error(const char *file, int line) { VALUE msg = rb_usascii_str_new_cstr("OCI Library Initialization Error"); VALUE exc = rb_funcall(eOCIError, oci8_id_new, 2, msg, INT2FIX(-1)); rb_exc_raise(set_backtrace(exc, file, line)); }
static VALUE printf_test_call(int argc, VALUE *argv, VALUE self) { VALUE opt, type, num, result; char format[sizeof(int) * 6 + 8], *p = format, cnv; int n; const char *s; rb_scan_args(argc, argv, "2:", &type, &num, &opt); Check_Type(type, T_STRING); if (RSTRING_LEN(type) != 1) rb_raise(rb_eArgError, "wrong length(%ld)", RSTRING_LEN(type)); switch (cnv = RSTRING_PTR(type)[0]) { case 'd': case 'x': case 'o': case 'X': n = NUM2INT(num); break; case 's': s = StringValueCStr(num); break; default: rb_raise(rb_eArgError, "wrong conversion(%c)", cnv); } *p++ = '%'; if (!NIL_P(opt)) { VALUE v; Check_Type(opt, T_HASH); if (RTEST(rb_hash_aref(opt, ID2SYM(rb_intern("space"))))) { *p++ = ' '; } if (RTEST(rb_hash_aref(opt, ID2SYM(rb_intern("hash"))))) { *p++ = '#'; } if (RTEST(rb_hash_aref(opt, ID2SYM(rb_intern("plus"))))) { *p++ = '+'; } if (RTEST(rb_hash_aref(opt, ID2SYM(rb_intern("minus"))))) { *p++ = '-'; } if (RTEST(rb_hash_aref(opt, ID2SYM(rb_intern("zero"))))) { *p++ = '0'; } if (!NIL_P(v = rb_hash_aref(opt, ID2SYM(rb_intern("width"))))) { p = utoa(p, format + sizeof(format), NUM2UINT(v)); } if (!NIL_P(v = rb_hash_aref(opt, ID2SYM(rb_intern("prec"))))) { *p++ = '.'; if (FIXNUM_P(v)) p = utoa(p, format + sizeof(format), NUM2UINT(v)); } } *p++ = cnv; *p++ = '\0'; if (cnv == 's') { result = rb_enc_sprintf(rb_usascii_encoding(), format, s); } else { result = rb_enc_sprintf(rb_usascii_encoding(), format, n); } return rb_assoc_new(result, rb_usascii_str_new_cstr(format)); }
VALUE Init_oci8(void) { #if 0 oci8_cOCIHandle = rb_define_class("OCIHandle", rb_cObject); cOCI8 = rb_define_class("OCI8", oci8_cOCIHandle); #endif cOCI8 = oci8_define_class("OCI8", &oci8_svcctx_class); cSession = oci8_define_class_under(cOCI8, "Session", &oci8_svcctx_associate_class); cServer = oci8_define_class_under(cOCI8, "Server", &oci8_svcctx_associate_class); id_at_session_handle = rb_intern("@session_handle"); id_at_server_handle = rb_intern("@server_handle"); oracle_client_vernum = INT2FIX(oracle_client_version); if (have_OCIClientVersion) { sword major, minor, update, patch, port_update; OCIClientVersion(&major, &minor, &update, &patch, &port_update); oracle_client_vernum = INT2FIX(ORAVERNUM(major, minor, update, patch, port_update)); } sym_SYSDBA = ID2SYM(rb_intern("SYSDBA")); sym_SYSOPER = ID2SYM(rb_intern("SYSOPER")); id_at_prefetch_rows = rb_intern("@prefetch_rows"); id_set_prefetch_rows = rb_intern("prefetch_rows="); rb_define_const(cOCI8, "VERSION", rb_obj_freeze(rb_usascii_str_new_cstr(OCI8LIB_VERSION))); rb_define_singleton_method_nodoc(cOCI8, "oracle_client_vernum", oci8_s_oracle_client_vernum, 0); rb_define_singleton_method_nodoc(cOCI8, "__set_property", oci8_s_set_property, 2); if (have_OCIMessageOpen && have_OCIMessageGet) { rb_define_singleton_method(cOCI8, "error_message", oci8_s_error_message, 1); } rb_define_private_method(cOCI8, "parse_connect_string", oci8_parse_connect_string, 1); rb_define_private_method(cOCI8, "logon", oci8_logon, 3); rb_define_private_method(cOCI8, "allocate_handles", oci8_allocate_handles, 0); rb_define_private_method(cOCI8, "session_handle", oci8_get_session_handle, 0); rb_define_private_method(cOCI8, "server_handle", oci8_get_server_handle, 0); rb_define_private_method(cOCI8, "server_attach", oci8_server_attach, 2); rb_define_private_method(cOCI8, "session_begin", oci8_session_begin, 2); rb_define_method(cOCI8, "logoff", oci8_svcctx_logoff, 0); rb_define_method(cOCI8, "parse", oci8_svcctx_parse, 1); rb_define_method(cOCI8, "commit", oci8_commit, 0); rb_define_method(cOCI8, "rollback", oci8_rollback, 0); rb_define_method(cOCI8, "non_blocking?", oci8_non_blocking_p, 0); rb_define_method(cOCI8, "non_blocking=", oci8_set_non_blocking, 1); rb_define_method(cOCI8, "autocommit?", oci8_autocommit_p, 0); rb_define_method(cOCI8, "autocommit=", oci8_set_autocommit, 1); rb_define_method(cOCI8, "long_read_len", oci8_long_read_len, 0); rb_define_method(cOCI8, "long_read_len=", oci8_set_long_read_len, 1); rb_define_method(cOCI8, "break", oci8_break, 0); rb_define_method(cOCI8, "prefetch_rows=", oci8_set_prefetch_rows, 1); rb_define_private_method(cOCI8, "oracle_server_vernum", oci8_oracle_server_vernum, 0); rb_define_method(cOCI8, "ping", oci8_ping, 0); rb_define_method(cOCI8, "client_identifier=", oci8_set_client_identifier, 1); rb_define_method(cOCI8, "module=", oci8_set_module, 1); rb_define_method(cOCI8, "action=", oci8_set_action, 1); rb_define_method(cOCI8, "client_info=", oci8_set_client_info, 1); return cOCI8; }
/* * call-seq: * oradate.to_s -> string * * Returns a string representing <i>oradate</i>. * The string format is 'yyyy/mm/dd hh:mi:ss'. */ static VALUE ora_date_to_s(VALUE self) { ora_date_t *od; char buf[30]; Data_Get_Struct(self, ora_date_t, od); sprintf(buf, "%04d/%02d/%02d %02d:%02d:%02d", Get_year(od), Get_month(od), Get_day(od), Get_hour(od), Get_minute(od), Get_second(od)); return rb_usascii_str_new_cstr(buf); }
static VALUE onum_inspect(VALUE self) { const char *name = rb_class2name(CLASS_OF(self)); volatile VALUE s = onum_to_s(self); size_t len = strlen(name) + RSTRING_LEN(s) + 5; char *str = ALLOCA_N(char, len); snprintf(str, len, "#<%s:%s>", name, RSTRING_PTR(s)); str[len - 1] = '\0'; return rb_usascii_str_new_cstr(str); }
void oci8_do_raise_init_error(const char *file, int line) { VALUE msg = rb_usascii_str_new_cstr("OCI Library Initialization Error"); VALUE exc; const char *dll_path = oci8_dll_path(); if (dll_path != NULL) { msg = rb_str_buf_cat_ascii(msg, " - "); msg = rb_enc_str_buf_cat(msg, dll_path, strlen(dll_path), rb_filesystem_encoding()); } exc = rb_class_new_instance(1, &msg, eOCIError); rb_exc_raise(set_backtrace(exc, file, line)); }
/* * call-seq: * onum.to_char(fmt = nil, nls_params = nil) -> string * * Returns a string containing a representation of self. * <i>fmt</i> and <i>nls_params</i> are same meanings with * <code>TO_CHAR</code> of Oracle function. */ static VALUE onum_to_char(int argc, VALUE *argv, VALUE self) { OCIError *errhp = oci8_errhp; VALUE fmt; VALUE nls_params; char buf[512]; ub4 buf_size = sizeof(buf); oratext *fmt_ptr; oratext *nls_params_ptr; ub4 fmt_len; ub4 nls_params_len; sword rv; rb_scan_args(argc, argv, "02", &fmt /* nil */, &nls_params /* nil */); if (NIL_P(fmt)) { rv = oranumber_to_str(_NUMBER(self), buf, sizeof(buf)); if (rv > 0) { return rb_usascii_str_new(buf, rv); } oranumber_dump(_NUMBER(self), buf); rb_raise(eOCIException, "Invalid internal number format: %s", buf); } StringValue(fmt); fmt_ptr = RSTRING_ORATEXT(fmt); fmt_len = RSTRING_LEN(fmt); if (NIL_P(nls_params)) { nls_params_ptr = NULL; nls_params_len = 0; } else { StringValue(nls_params); nls_params_ptr = RSTRING_ORATEXT(nls_params); nls_params_len = RSTRING_LEN(nls_params); } rv = OCINumberToText(errhp, _NUMBER(self), fmt_ptr, fmt_len, nls_params_ptr, nls_params_len, &buf_size, TO_ORATEXT(buf)); if (rv == OCI_ERROR) { sb4 errcode; OCIErrorGet(errhp, 1, NULL, &errcode, NULL, 0, OCI_HTYPE_ERROR); if (errcode == 22065) { /* OCI-22065: number to text translation for the given format causes overflow */ if (NIL_P(fmt)) /* implicit conversion */ return rb_usascii_str_new_cstr("overflow"); } chkerr(rv); } return rb_usascii_str_new(buf, buf_size); }
static VALUE set_backtrace(VALUE exc, const char *file, int line) { char errmsg[64]; VALUE backtrace; #ifdef _WIN32 char *p = strrchr(file, '\\'); if (p != NULL) file = p + 1; #endif backtrace = rb_funcall(rb_cObject, oci8_id_caller, 0); if (TYPE(backtrace) == T_ARRAY) { snprintf(errmsg, sizeof(errmsg), "%s:%d:in " STRINGIZE(oci8lib) DLEXT, file, line); errmsg[sizeof(errmsg) - 1] = '\0'; rb_ary_unshift(backtrace, rb_usascii_str_new_cstr(errmsg)); rb_funcall(exc, oci8_id_set_backtrace, 1, backtrace); } return exc; }
static VALUE get_error_msg(dvoid *errhp, ub4 type, const char *default_msg, sb4 *errcode_p) { sword rv; size_t len; retry: errbuf[0] = '\0'; rv = OCIErrorGet(errhp, 1, NULL, errcode_p, TO_ORATEXT(errbuf), errbufsiz, type); /* OCI manual says: * If type is set to OCI_HTYPE_ERROR, then the return * code during truncation for OCIErrorGet() is * OCI_ERROR. The client can then specify a bigger * buffer and call OCIErrorGet() again. * * But as far as I tested on Oracle XE 10.2.0.1, the return * code is OCI_SUCCESS when the message is truncated. */ len = strlen(errbuf); if (errbufsiz - len <= 7) { /* The error message may be truncated. * The magic number 7 means the maximum length of one utf-8 * character plus the length of a nul terminator. */ errbufsiz += ERRBUF_EXPAND_LEN; errbuf = xrealloc(errbuf, errbufsiz); goto retry; } if (rv != OCI_SUCCESS) { /* No message is found. Use the default message. */ return rb_usascii_str_new_cstr(default_msg); } /* truncate trailing CR and LF */ while (len > 0 && (errbuf[len - 1] == '\n' || errbuf[len - 1] == '\r')) { len--; } return rb_external_str_new_with_enc(errbuf, len, oci8_encoding); }
static VALUE oci8_make_exc(dvoid *errhp, sword status, ub4 type, OCIStmt *stmthp, const char *file, int line) { VALUE exc; char errmsg[128]; sb4 errcode = -1; VALUE msg; VALUE parse_error_offset = Qnil; VALUE sql = Qnil; int rv; int numarg = 1; switch (status) { case OCI_ERROR: exc = eOCIError; msg = get_error_msg(errhp, type, "Error", &errcode); numarg = 4; break; case OCI_SUCCESS_WITH_INFO: exc = eOCISuccessWithInfo; msg = get_error_msg(errhp, type, "Error", &errcode); numarg = 4; break; case OCI_NO_DATA: exc = eOCINoData; msg = get_error_msg(errhp, type, "No Data", &errcode); numarg = 4; break; case OCI_INVALID_HANDLE: exc = eOCIInvalidHandle; msg = rb_usascii_str_new_cstr("Invalid Handle"); break; case OCI_NEED_DATA: exc = eOCINeedData; msg = rb_usascii_str_new_cstr("Need Data"); break; case OCI_STILL_EXECUTING: exc = eOCIStillExecuting; msg = rb_usascii_str_new_cstr("Still Executing"); break; case OCI_CONTINUE: exc = eOCIContinue; msg = rb_usascii_str_new_cstr("Continue"); break; default: sprintf(errmsg, "Unknown error (%d)", status); exc = eOCIException; msg = rb_usascii_str_new_cstr(errmsg); } if (stmthp != NULL) { ub2 offset; text *text; ub4 size; rv = OCIAttrGet(stmthp, OCI_HTYPE_STMT, &offset, 0, OCI_ATTR_PARSE_ERROR_OFFSET, errhp); if (rv == OCI_SUCCESS) { parse_error_offset = INT2FIX(offset); } rv = OCIAttrGet(stmthp, OCI_HTYPE_STMT, &text, &size, OCI_ATTR_STATEMENT, errhp); if (rv == OCI_SUCCESS) { sql = rb_external_str_new_with_enc(TO_CHARPTR(text), size, oci8_encoding); } } exc = rb_funcall(exc, oci8_id_new, numarg, msg, INT2FIX(errcode), sql, parse_error_offset); return set_backtrace(exc, file, line); }
static VALUE string_spec_rb_usascii_str_new_cstr(VALUE self, VALUE str) { return rb_usascii_str_new_cstr(RSTRING_PTR(str)); }