/* * call-seq: * client_info = string or nil * * <b>(new in 2.0.3)</b> * * Sets additional information about the client application. * This information is stored in the V$SESSION view. * * === Oracle 10g client or upper * * This doesn't perform network round trips. The change is reflected * to the server by the next round trip such as OCI8#exec, OCI8#ping, * etc. * * === Oracle 9i client or lower * * This executes the following PL/SQL block internally. * The change is reflected immediately by a network round trip. * * BEGIN * DBMS_APPLICATION_INFO.SET_CLIENT_INFO(:client_info); * END; * * See {Oracle Manual: Oracle Database PL/SQL Packages and Types Reference}[http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14258/d_appinf.htm#CHEJCFGG] */ static VALUE oci8_set_client_info(VALUE self, VALUE val) { char *ptr; ub4 size; if (!NIL_P(val)) { OCI8SafeStringValue(val); ptr = RSTRING_PTR(val); size = RSTRING_LEN(val); } else { ptr = ""; size = 0; } if (oracle_client_version >= ORAVER_10_1) { /* Oracle 10g or upper */ oci_lc(OCIAttrSet(oci8_get_oci_session(self), OCI_HTYPE_SESSION, ptr, size, OCI_ATTR_CLIENT_INFO, oci8_errhp)); } else { /* Oracle 9i or lower */ oci8_exec_sql_var_t bind_vars[1]; /* :client_info */ bind_vars[0].valuep = ptr; bind_vars[0].value_sz = size; bind_vars[0].dty = SQLT_CHR; bind_vars[0].indp = NULL; bind_vars[0].alenp = NULL; oci8_exec_sql(oci8_get_svcctx(self), "BEGIN\n" " DBMS_APPLICATION_INFO.SET_CLIENT_INFO(:client_info);\n" "END;\n", 0, NULL, 1, bind_vars, 1); } return val; }
static VALUE get_rowid_attr(rowid_arg_t *arg) { oci8_base_t *base = arg->base; ub4 attrtype = arg->attrtype; char buf[MAX_ROWID_LEN]; ub2 buflen; sword rv; /* get a rowid descriptor from OCIHandle */ rv = OCIDescriptorAlloc(oci8_envhp, (dvoid*)&arg->ridp, OCI_DTYPE_ROWID, 0, NULL); if (rv != OCI_SUCCESS) oci8_env_raise(oci8_envhp, rv); rv = OCIAttrGet(base->hp.ptr, base->type, arg->ridp, 0, attrtype, oci8_errhp); if (rv != OCI_SUCCESS) { oci8_raise(oci8_errhp, rv, NULL); } /* convert the rowid descriptor to a string. */ if (have_OCIRowidToChar) { /* If OCIRowidToChar is available, use it. */ buflen = MAX_ROWID_LEN; rv = OCIRowidToChar(arg->ridp, TO_ORATEXT(buf), &buflen, oci8_errhp); if (rv != OCI_SUCCESS) { oci8_raise(oci8_errhp, rv, NULL); } } else { /* If OCIRowidToChar is not available, convert it on * Oracle Server. */ oci8_base_t *svc; oci8_exec_sql_var_t define_var; oci8_exec_sql_var_t bind_var; /* search a connection from the handle */ svc = base; while (svc->type != OCI_HTYPE_SVCCTX) { svc = svc->parent; if (svc == NULL) { rb_raise(rb_eRuntimeError, "No connection is found!!"); } } /* :strval */ define_var.valuep = buf; define_var.value_sz = sizeof(buf); define_var.dty = SQLT_CHR; define_var.indp = NULL; define_var.alenp = &buflen; /* :rowid */ bind_var.valuep = &arg->ridp; bind_var.value_sz = sizeof(void *); bind_var.dty = SQLT_RDD; bind_var.indp = NULL; bind_var.alenp = NULL; /* convert the rowid descriptor to a string value by querying Oracle server. */ oci8_exec_sql((oci8_svcctx_t*)svc, "SELECT :rid FROM dual", 1, &define_var, 1, &bind_var, 1); if (buflen == 0) { return Qnil; } } return rb_external_str_new_with_enc(buf, buflen, rb_usascii_encoding()); }
/* * call-seq: * ping -> true or false * * <b>(new in 2.0.2)</b> * * Makes a round trip call to the server to confirm that the connection and * the server are active. * * OCI8#ping also can be used to flush all the pending OCI client-side calls * to the server if any exist. * * === Oracle 10.2 client or upper * A dummy round trip call is made by a newly added OCI function * OCIPing[http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14250/oci16msc007.htm#sthref3540] in Oracle 10.2. * * === Oracle 10.1 client or lower * A simple PL/SQL block "BEGIN NULL; END;" is executed to make a round trip call. */ static VALUE oci8_ping(VALUE self) { oci8_svcctx_t *svcctx = oci8_get_svcctx(self); sword rv; if (have_OCIPing_nb) { /* Oracle 10.2 or upper */ rv = OCIPing_nb(svcctx, svcctx->base.hp.svc, oci8_errhp, OCI_DEFAULT); } else { /* Oracle 10.1 or lower */ rv = oci8_exec_sql(svcctx, "BEGIN NULL; END;", 0U, NULL, 0U, NULL, 0); } return rv == OCI_SUCCESS ? Qtrue : FALSE; }
/* * call-seq: * client_identifier = string or nil * * <b>(new in 2.0.3)</b> * * Sets the client ID. This information is stored in the V$SESSION * view. * * === Oracle 9i client or upper * * This doesn't perform network round trips. The change is reflected * to the server by the next round trip such as OCI8#exec, OCI8#ping, * etc. * * === Oracle 8i client or lower * * This executes the following PL/SQL block internally. * The change is reflected immediately by a network round trip. * * BEGIN * DBMS_SESSION.SET_IDENTIFIER(:client_id); * END; * * See {Oracle Manual: Oracle Database PL/SQL Packages and Types Reference}[http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14258/d_sessio.htm#i996935] * */ static VALUE oci8_set_client_identifier(VALUE self, VALUE val) { char *ptr; ub4 size; int use_attr_set = 1; if (!NIL_P(val)) { OCI8SafeStringValue(val); ptr = RSTRING_PTR(val); size = RSTRING_LEN(val); } else { ptr = ""; size = 0; } if (oracle_client_version < ORAVER_9_0) { use_attr_set = 0; } else if (oracle_client_version < ORAVERNUM(9, 2, 0, 3, 0) && size == 0) { /* Workaround for Bug 2449486 */ use_attr_set = 0; } if (use_attr_set) { if (size > 0 && ptr[0] == ':') { rb_raise(rb_eArgError, "client identifier should not start with ':'."); } oci_lc(OCIAttrSet(oci8_get_oci_session(self), OCI_HTYPE_SESSION, ptr, size, OCI_ATTR_CLIENT_IDENTIFIER, oci8_errhp)); } else { oci8_exec_sql_var_t bind_vars[1]; /* :client_id */ bind_vars[0].valuep = ptr; bind_vars[0].value_sz = size; bind_vars[0].dty = SQLT_CHR; bind_vars[0].indp = NULL; bind_vars[0].alenp = NULL; oci8_exec_sql(oci8_get_svcctx(self), "BEGIN\n" " DBMS_SESSION.SET_IDENTIFIER(:client_id);\n" "END;\n", 0, NULL, 1, bind_vars, 1); } return val; }
/* * call-seq: * module = string or nil * * <b>(new in 2.0.3)</b> * * Sets the name of the current module. This information is * stored in the V$SESSION view and is also stored in the V$SQL view * and the V$SQLAREA view when a SQL statement is executed and the SQL * statement is first parsed in the Oracle server. * * === Oracle 10g client or upper * * This doesn't perform network round trips. The change is reflected * to the server by the next round trip such as OCI8#exec, OCI8#ping, * etc. * * === Oracle 9i client or lower * * This executes the following PL/SQL block internally. * The change is reflected immediately by a network round trip. * * DECLARE * action VARCHAR2(32); * BEGIN * -- retrieve action name. * SELECT SYS_CONTEXT('USERENV','ACTION') INTO action FROM DUAL; * -- change module name without modifying the action name. * DBMS_APPLICATION_INFO.SET_MODULE(:module, action); * END; * * See {Oracle Manual: Oracle Database PL/SQL Packages and Types Reference}[http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14258/d_appinf.htm#i999254] * */ static VALUE oci8_set_module(VALUE self, VALUE val) { const char *ptr; ub4 size; if (!NIL_P(val)) { OCI8SafeStringValue(val); ptr = RSTRING_PTR(val); size = RSTRING_LEN(val); } else { ptr = ""; size = 0; } if (oracle_client_version >= ORAVER_10_1) { /* Oracle 10g or upper */ chker2(OCIAttrSet(oci8_get_oci_session(self), OCI_HTYPE_SESSION, (dvoid*)ptr, size, OCI_ATTR_MODULE, oci8_errhp), DATA_PTR(self)); } else { /* Oracle 9i or lower */ oci8_exec_sql_var_t bind_vars[1]; /* :module */ bind_vars[0].valuep = (dvoid*)ptr; bind_vars[0].value_sz = size; bind_vars[0].dty = SQLT_CHR; bind_vars[0].indp = NULL; bind_vars[0].alenp = NULL; oci8_exec_sql(oci8_get_svcctx(self), "DECLARE\n" " action VARCHAR2(32);\n" "BEGIN\n" " SELECT SYS_CONTEXT('USERENV','ACTION') INTO action FROM DUAL;\n" " DBMS_APPLICATION_INFO.SET_MODULE(:module, action);\n" "END;\n", 0, NULL, 1, bind_vars, 1); } return self; }