/* * call-seq: * logoff * * Disconnects from the Oracle server. The uncommitted transaction is * rollbacked. */ static VALUE oci8_svcctx_logoff(VALUE self) { oci8_svcctx_t *svcctx = (oci8_svcctx_t *)DATA_PTR(self); sword rv; while (svcctx->base.children != NULL) { oci8_base_free(svcctx->base.children); } switch (svcctx->logon_type) { case T_IMPLICIT: oci_lc(OCITransRollback_nb(svcctx, svcctx->base.hp.svc, oci8_errhp, OCI_DEFAULT)); rv = OCILogoff_nb(svcctx, svcctx->base.hp.svc, oci8_errhp); svcctx->base.type = 0; svcctx->logon_type = T_NOT_LOGIN; if (rv != OCI_SUCCESS) oci8_raise(oci8_errhp, rv, NULL); svcctx->authhp = NULL; svcctx->srvhp = NULL; break; case T_EXPLICIT: oci_lc(OCITransRollback_nb(svcctx, svcctx->base.hp.svc, oci8_errhp, OCI_DEFAULT)); rv = OCISessionEnd_nb(svcctx, svcctx->base.hp.svc, oci8_errhp, svcctx->authhp, OCI_DEFAULT); if (rv == OCI_SUCCESS) { rv = OCIServerDetach_nb(svcctx, svcctx->srvhp, oci8_errhp, OCI_DEFAULT); } svcctx->logon_type = T_NOT_LOGIN; if (rv != OCI_SUCCESS) oci8_raise(oci8_errhp, rv, NULL); break; case T_NOT_LOGIN: break; } return Qtrue; }
static void call_oci_logoff(oci8_svcctx_t *svcctx) { svcctx->logoff_method = NULL; svcctx->session->type = 0; svcctx->server->type = 0; oci_lc(OCILogoff_nb(svcctx, svcctx->base.hp.svc, oci8_errhp)); svcctx->base.type = 0; }