static VALUE oci8_bfile_initialize(int argc, VALUE *argv, VALUE self) { oci8_lob_t *lob = DATA_PTR(self); VALUE svc; VALUE dir_alias; VALUE filename; rb_scan_args(argc, argv, "12", &svc, &dir_alias, &filename); TO_SVCCTX(svc); /* check argument type */ oci_lc(OCIDescriptorAlloc(oci8_envhp, &lob->base.hp.ptr, OCI_DTYPE_LOB, 0, NULL)); lob->base.type = OCI_DTYPE_LOB; lob->svc = svc; lob->pos = 0; lob->char_width = 1; lob->csfrm = SQLCS_IMPLICIT; lob->lobtype = OCI_TEMP_BLOB; lob->state = S_BFILE_CLOSE; if (argc != 1) { OCI8SafeStringValue(dir_alias); OCI8SafeStringValue(filename); oci8_bfile_set_name(self, dir_alias, filename); } oci8_link_to_parent((oci8_base_t*)lob, (oci8_base_t*)DATA_PTR(svc)); return Qnil; }
/* * call-seq: * logon(username, password, dbname) -> connection * * <b>internal use only</b> * * Creates a simple logon session by the OCI function OCILogon(). */ static VALUE oci8_logon(VALUE self, VALUE username, VALUE password, VALUE dbname) { oci8_svcctx_t *svcctx = DATA_PTR(self); if (svcctx->logoff_strategy != NULL) { rb_raise(rb_eRuntimeError, "Could not reuse the session."); } /* check arugmnets */ OCI8SafeStringValue(username); OCI8SafeStringValue(password); if (!NIL_P(dbname)) { OCI8SafeStringValue(dbname); } /* logon */ oci_lc(OCILogon_nb(svcctx, oci8_envhp, oci8_errhp, &svcctx->base.hp.svc, RSTRING_ORATEXT(username), RSTRING_LEN(username), RSTRING_ORATEXT(password), RSTRING_LEN(password), NIL_P(dbname) ? NULL : RSTRING_ORATEXT(dbname), NIL_P(dbname) ? 0 : RSTRING_LEN(dbname))); svcctx->base.type = OCI_HTYPE_SVCCTX; svcctx->logoff_strategy = &simple_logoff; /* setup the session handle */ oci_lc(OCIAttrGet(svcctx->base.hp.ptr, OCI_HTYPE_SVCCTX, &svcctx->usrhp, 0, OCI_ATTR_SESSION, oci8_errhp)); copy_session_handle(svcctx); /* setup the server handle */ oci_lc(OCIAttrGet(svcctx->base.hp.ptr, OCI_HTYPE_SVCCTX, &svcctx->srvhp, 0, OCI_ATTR_SERVER, oci8_errhp)); copy_server_handle(svcctx); return Qnil; }
/* * @overload initialize(conn, directory = nil, filename = nil) * * Creates a BFILE object. * This is correspond to {BFILENAME}[https://docs.oracle.com/database/121/SQLRF/functions020.htm]. * * @param [OCI8] conn * @param [String] directory a directory object created by * {"CREATE DIRECTORY"}[http://docs.oracle.com/database/121/SQLRF/statements_5008.htm]. * @param [String] filename * @return [OCI8::BFILE] */ static VALUE oci8_bfile_initialize(int argc, VALUE *argv, VALUE self) { oci8_lob_t *lob = TO_LOB(self); VALUE svc; VALUE dir_alias; VALUE filename; oci8_svcctx_t *svcctx; int rv; rb_scan_args(argc, argv, "12", &svc, &dir_alias, &filename); svcctx = oci8_get_svcctx(svc); rv = OCIDescriptorAlloc(oci8_envhp, &lob->base.hp.ptr, OCI_DTYPE_LOB, 0, NULL); if (rv != OCI_SUCCESS) { oci8_env_raise(oci8_envhp, rv); } lob->base.type = OCI_DTYPE_LOB; lob->pos = 0; lob->csfrm = SQLCS_IMPLICIT; lob->lobtype = OCI_TEMP_BLOB; lob->state = S_BFILE_CLOSE; if (argc != 1) { OCI8SafeStringValue(dir_alias); OCI8SafeStringValue(filename); oci8_bfile_set_name(self, dir_alias, filename); } oci8_link_to_parent(&lob->base, &svcctx->base); lob->svcctx = svcctx; return Qnil; }
/* * call-seq: * logon(username, password, dbname) -> connection * * <b>internal use only</b> * * Creates a simple logon session by the OCI function OCILogon(). */ static VALUE oci8_logon(VALUE self, VALUE username, VALUE password, VALUE dbname) { oci8_svcctx_t *svcctx = DATA_PTR(self); if (svcctx->logoff_method != NULL) { rb_raise(rb_eRuntimeError, "Could not reuse the session."); } /* check arugmnets */ OCI8SafeStringValue(username); OCI8SafeStringValue(password); if (!NIL_P(dbname)) { OCI8SafeStringValue(dbname); } /* logon */ oci_lc(OCILogon_nb(svcctx, oci8_envhp, oci8_errhp, &svcctx->base.hp.svc, RSTRING_ORATEXT(username), RSTRING_LEN(username), RSTRING_ORATEXT(password), RSTRING_LEN(password), NIL_P(dbname) ? NULL : RSTRING_ORATEXT(dbname), NIL_P(dbname) ? 0 : RSTRING_LEN(dbname))); svcctx->base.type = OCI_HTYPE_SVCCTX; svcctx->logoff_method = call_oci_logoff; return Qnil; }
/* * call-seq: * OCI8::ConnectionPool.new(conn_min, conn_max, conn_incr, username = nil, password = nil, dbname = nil) -> connection pool * OCI8::ConnectionPool.new(conn_min, conn_max, conn_incr, connect_string) -> connection pool * * Creates a connection pool. * * <i>conn_min</i> specifies the minimum number of connections in the * connection pool. Valid values are 0 and higher. * * <i>conn_max</i> specifies the maximum number of connections that * can be opened to the database. Once this value is reached, no more * connections are opened. Valid values are 1 and higher. * * <i>conn_incr</i> allows the application to set the next increment * for connections to be opened to the database if the current number * of connections are less than <i>conn_max</i>. Valid values are 0 * and higher. * * <i>username</i> and <i>password</i> are required to establish an * implicit primary session. When both are nil, external * authentication is used. * * <i>dbname</i> specifies the database server to connect to. * * If the number of arguments is four, <i>username</i>, * <i>password</i> and <i>dbname</i> are extracted from the fourth * argument <i>connect_string</i>. The syntax is "username/password" or * "username/password@dbname". */ static VALUE oci8_cpool_initialize(int argc, VALUE *argv, VALUE self) { VALUE conn_min; VALUE conn_max; VALUE conn_incr; VALUE username; VALUE password; VALUE dbname; oci8_cpool_t *cpool = DATA_PTR(self); OraText *pool_name; sb4 pool_name_len; sword rv; /* check arguments */ rb_scan_args(argc, argv, "42", &conn_min, &conn_max, &conn_incr, &username, &password, &dbname); Check_Type(conn_min, T_FIXNUM); Check_Type(conn_max, T_FIXNUM); Check_Type(conn_incr, T_FIXNUM); if (argc == 4) { VALUE mode; VALUE conn_str = username; OCI8SafeStringValue(conn_str); oci8_do_parse_connect_string(conn_str, &username, &password, &dbname, &mode); if (!NIL_P(mode)) { rb_raise(rb_eArgError, "invalid connect string \"%s\": Connection pooling doesn't support sysdba and sysoper privileges.", RSTRING_PTR(conn_str)); } } else { if (!NIL_P(username)) { OCI8SafeStringValue(username); } if (!NIL_P(password)) { OCI8SafeStringValue(password); } if (!NIL_P(dbname)) { OCI8SafeStringValue(dbname); } } rv = OCIHandleAlloc(oci8_envhp, &cpool->base.hp.ptr, OCI_HTYPE_CPOOL, 0, NULL); if (rv != OCI_SUCCESS) oci8_env_raise(oci8_envhp, rv); cpool->base.type = OCI_HTYPE_CPOOL; oci_lc(OCIConnectionPoolCreate(oci8_envhp, oci8_errhp, cpool->base.hp.poolhp, &pool_name, &pool_name_len, NIL_P(dbname) ? NULL : RSTRING_ORATEXT(dbname), NIL_P(dbname) ? 0 : RSTRING_LEN(dbname), FIX2UINT(conn_min), FIX2UINT(conn_max), FIX2UINT(conn_incr), NIL_P(username) ? NULL : RSTRING_ORATEXT(username), NIL_P(username) ? 0 : RSTRING_LEN(username), NIL_P(password) ? NULL : RSTRING_ORATEXT(password), NIL_P(password) ? 0 : RSTRING_LEN(password), OCI_DEFAULT)); cpool->pool_name = rb_str_new(TO_CHARPTR(pool_name), pool_name_len); rb_str_freeze(cpool->pool_name); return Qnil; }
/* * call-seq: * server_attach(dbname, mode) * * <b>internal use only</b> * * Attachs to the server by the OCI function OCIServerAttach(). */ static VALUE oci8_server_attach(VALUE self, VALUE dbname, VALUE mode) { oci8_svcctx_t *svcctx = oci8_get_svcctx(self); if (svcctx->logoff_strategy != &complex_logoff) { rb_raise(rb_eRuntimeError, "Use this method only for the service context handle created by OCI8#server_handle()."); } if (svcctx->state & OCI8_STATE_SERVER_ATTACH_WAS_CALLED) { rb_raise(rb_eRuntimeError, "Could not use this method twice."); } /* check arguments */ if (!NIL_P(dbname)) { OCI8SafeStringValue(dbname); } Check_Type(mode, T_FIXNUM); /* attach to the server */ oci_lc(OCIServerAttach_nb(svcctx, svcctx->srvhp, oci8_errhp, NIL_P(dbname) ? NULL : RSTRING_ORATEXT(dbname), NIL_P(dbname) ? 0 : RSTRING_LEN(dbname), FIX2UINT(mode))); oci_lc(OCIAttrSet(svcctx->base.hp.ptr, OCI_HTYPE_SVCCTX, svcctx->srvhp, 0, OCI_ATTR_SERVER, oci8_errhp)); svcctx->state |= OCI8_STATE_SERVER_ATTACH_WAS_CALLED; return self; }
void oci8_do_parse_connect_string(VALUE conn_str, VALUE *user, VALUE *pass, VALUE *dbname, VALUE *mode) { static VALUE re = Qnil; if (NIL_P(re)) { re = rb_eval_string(CONN_STR_REGEX); rb_global_variable(&re); } OCI8SafeStringValue(conn_str); if (RTEST(rb_reg_match(re, conn_str))) { *user = rb_reg_nth_match(1, rb_backref_get()); *pass = rb_reg_nth_match(2, rb_backref_get()); *dbname = rb_reg_nth_match(3, rb_backref_get()); *mode = rb_reg_nth_match(4, rb_backref_get()); if (RSTRING_LEN(*user) == 0 && RSTRING_LEN(*pass) == 0) { /* external credential */ *user = Qnil; *pass = Qnil; } if (!NIL_P(*mode)) { char *ptr; SafeStringValue(*mode); ptr = RSTRING_PTR(*mode); if (strcasecmp(ptr, "SYSDBA") == 0) { *mode = sym_SYSDBA; } else if (strcasecmp(ptr, "SYSOPER") == 0) { *mode = sym_SYSOPER; } } } else { rb_raise(rb_eArgError, "invalid connect string \"%s\" (expect \"username/password[@(tns_name|//host[:port]/service_name)][ as (sysdba|sysoper)]\"", RSTRING_PTR(conn_str)); } }
/* * 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 oci8_bfile_set_filename(VALUE self, VALUE filename) { VALUE dir_alias; OCI8SafeStringValue(filename); oci8_bfile_get_name(self, &dir_alias, NULL); oci8_bfile_set_name(self, dir_alias, filename); rb_ivar_set(self, id_filename, filename); return filename; }
static VALUE oci8_bfile_set_dir_alias(VALUE self, VALUE dir_alias) { VALUE filename; OCI8SafeStringValue(dir_alias); oci8_bfile_get_name(self, NULL, &filename); oci8_bfile_set_name(self, dir_alias, filename); rb_ivar_set(self, id_dir_alias, dir_alias); return dir_alias; }
/* * call-seq: * attr_set_string(attr_type, attr_value) * * Sets the value of an attribute as `oratext *' datatype. * +attr_value+ is converted to {OCI8.encoding} before it is set * when the ruby version is 1.9. * * @param [Fixnum] attr_type * @param [String] attr_value * @return [self] * * @since 2.0.4 * @private */ static VALUE attr_set_string(VALUE self, VALUE attr_type, VALUE val) { oci8_base_t *base = DATA_PTR(self); /* validate arguments */ Check_Type(attr_type, T_FIXNUM); OCI8SafeStringValue(val); /* set attribute */ chker2(OCIAttrSet(base->hp.ptr, base->type, RSTRING_PTR(val), RSTRING_LEN(val), FIX2INT(attr_type), oci8_errhp), base); return self; }
/* * 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; }
/* * call-seq: * new(username, password, dbname = nil, privilege = nil) * * Connects to an Oracle database server by +username+ and +password+ * at +dbname+ as +privilege+. * * === connecting to the local server * * Set +username+ and +password+ or pass "username/password" as a * single argument. * * OCI8.new('scott', 'tiger') * or * OCI8.new('scott/tiger') * * === connecting to a remote server * * Set +username+, +password+ and +dbname+ or pass * "username/password@dbname" as a single argument. * * OCI8.new('scott', 'tiger', 'orcl.world') * or * OCI8.new('scott/[email protected]') * * The +dbname+ is a net service name or an easy connectection * identifier. The former is a name listed in the file tnsnames.ora. * Ask to your DBA if you don't know what it is. The latter has the * syntax as "//host:port/service_name". * * OCI8.new('scott', 'tiger', '//remote-host:1521/XE') * or * OCI8.new('scott/tiger@//remote-host:1521/XE') * * === connecting as a privileged user * * Set :SYSDBA or :SYSOPER to +privilege+, otherwise * "username/password as sysdba" or "username/password as sysoper" * as a single argument. * * OCI8.new('sys', 'change_on_install', nil, :SYSDBA) * or * OCI8.new('sys/change_on_install as sysdba') * * === external OS authentication * * Set nil to +username+ and +password+, or "/" as a single argument. * * OCI8.new(nil, nil) * or * OCI8.new('/') * * To connect to a remote host: * * OCI8.new(nil, nil, 'dbname') * or * OCI8.new('/@dbname') * * === proxy authentication * * Enclose end user's username with square brackets and add it at the * end of proxy user's username. * * OCI8.new('proxy_user_name[end_user_name]', 'proxy_password') * or * OCI8.new('proxy_user_name[end_user_name]/proxy_password') * */ static VALUE oci8_svcctx_initialize(int argc, VALUE *argv, VALUE self) { VALUE vusername; VALUE vpassword; VALUE vdbname; VALUE vmode; oci8_svcctx_t *svcctx = DATA_PTR(self); sword rv; enum logon_type_t logon_type = T_IMPLICIT; ub4 cred = OCI_CRED_RDBMS; ub4 mode = OCI_DEFAULT; OCISvcCtx *svchp = NULL; svcctx->executing_thread = Qnil; if (argc == 1) { oci8_do_parse_connect_string(argv[0], &vusername, &vpassword, &vdbname, &vmode); } else { rb_scan_args(argc, argv, "22", &vusername, &vpassword, &vdbname, &vmode); } rb_ivar_set(self, id_at_prefetch_rows, Qnil); rb_ivar_set(self, id_at_username, Qnil); if (NIL_P(vusername) && NIL_P(vpassword)) { /* external credential */ logon_type = T_EXPLICIT; cred = OCI_CRED_EXT; } else { /* RDBMS credential */ OCI8SafeStringValue(vusername); /* 1 */ OCI8SafeStringValue(vpassword); /* 2 */ } if (!NIL_P(vdbname)) { OCI8SafeStringValue(vdbname); /* 3 */ } if (!NIL_P(vmode)) { /* 4 */ logon_type = T_EXPLICIT; Check_Type(vmode, T_SYMBOL); if (vmode == sym_SYSDBA) { mode = OCI_SYSDBA; } else if (vmode == sym_SYSOPER) { mode = OCI_SYSOPER; } else { rb_raise(rb_eArgError, "invalid privilege name %s (expect :SYSDBA or :SYSOPER)", rb_id2name(SYM2ID(vmode))); } } switch (logon_type) { case T_IMPLICIT: rv = OCILogon_nb(svcctx, oci8_envhp, oci8_errhp, &svchp, RSTRING_ORATEXT(vusername), RSTRING_LEN(vusername), RSTRING_ORATEXT(vpassword), RSTRING_LEN(vpassword), NIL_P(vdbname) ? NULL : RSTRING_ORATEXT(vdbname), NIL_P(vdbname) ? 0 : RSTRING_LEN(vdbname)); svcctx->base.hp.svc = svchp; svcctx->base.type = OCI_HTYPE_SVCCTX; svcctx->logon_type = T_IMPLICIT; if (rv != OCI_SUCCESS) { oci8_raise(oci8_errhp, rv, NULL); } break; case T_EXPLICIT: /* allocate OCI handles. */ rv = OCIHandleAlloc(oci8_envhp, &svcctx->base.hp.ptr, OCI_HTYPE_SVCCTX, 0, 0); if (rv != OCI_SUCCESS) oci8_env_raise(oci8_envhp, rv); svcctx->base.type = OCI_HTYPE_SVCCTX; rv = OCIHandleAlloc(oci8_envhp, (void*)&svcctx->authhp, OCI_HTYPE_SESSION, 0, 0); if (rv != OCI_SUCCESS) oci8_env_raise(oci8_envhp, rv); rv = OCIHandleAlloc(oci8_envhp, (void*)&svcctx->srvhp, OCI_HTYPE_SERVER, 0, 0); if (rv != OCI_SUCCESS) oci8_env_raise(oci8_envhp, rv); /* set username and password to OCISession. */ if (cred == OCI_CRED_RDBMS) { oci_lc(OCIAttrSet(svcctx->authhp, OCI_HTYPE_SESSION, RSTRING_PTR(vusername), RSTRING_LEN(vusername), OCI_ATTR_USERNAME, oci8_errhp)); oci_lc(OCIAttrSet(svcctx->authhp, OCI_HTYPE_SESSION, RSTRING_PTR(vpassword), RSTRING_LEN(vpassword), OCI_ATTR_PASSWORD, oci8_errhp)); } /* attach to server and set to OCISvcCtx. */ rv = OCIServerAttach_nb(svcctx, svcctx->srvhp, oci8_errhp, NIL_P(vdbname) ? NULL : RSTRING_ORATEXT(vdbname), NIL_P(vdbname) ? 0 : RSTRING_LEN(vdbname), OCI_DEFAULT); if (rv != OCI_SUCCESS) oci8_raise(oci8_errhp, rv, NULL); oci_lc(OCIAttrSet(svcctx->base.hp.ptr, OCI_HTYPE_SVCCTX, svcctx->srvhp, 0, OCI_ATTR_SERVER, oci8_errhp)); /* begin session. */ rv = OCISessionBegin_nb(svcctx, svcctx->base.hp.ptr, oci8_errhp, svcctx->authhp, cred, mode); if (rv != OCI_SUCCESS) oci8_raise(oci8_errhp, rv, NULL); oci_lc(OCIAttrSet(svcctx->base.hp.ptr, OCI_HTYPE_SVCCTX, svcctx->authhp, 0, OCI_ATTR_SESSION, oci8_errhp)); svcctx->logon_type = T_EXPLICIT; break; default: break; } svcctx->pid = getpid(); svcctx->is_autocommit = 0; #ifdef RUBY_VM svcctx->non_blocking = 1; #endif svcctx->long_read_len = INT2FIX(65535); return Qnil; }