Linux ip-172-26-2-223 5.4.0-1018-aws #18-Ubuntu SMP Wed Jun 24 01:15:00 UTC 2020 x86_64
Apache
: 172.26.2.223 | : 3.18.103.55
Cant Read [ /etc/named.conf ]
8.1.13
www
www.github.com/MadExploits
Terminal
AUTO ROOT
Adminer
Backdoor Destroyer
Linux Exploit
Lock Shell
Lock File
Create User
CREATE RDP
PHP Mailer
BACKCONNECT
UNLOCK SHELL
HASH IDENTIFIER
CPANEL RESET
CREATE WP USER
BLACK DEFEND!
README
+ Create Folder
+ Create File
/
www /
server /
php /
82 /
src /
ext /
pdo_oci /
[ HOME SHELL ]
Name
Size
Permission
Action
tests
[ DIR ]
drwxr-xr-x
CREDITS
40
B
-rw-r--r--
config.m4
6.32
KB
-rw-r--r--
config.w32
1.45
KB
-rw-r--r--
oci_driver.c
23.37
KB
-rw-r--r--
oci_statement.c
27.39
KB
-rw-r--r--
pdo_oci.c
3.79
KB
-rw-r--r--
php_pdo_oci.h
1.38
KB
-rw-r--r--
php_pdo_oci_int.h
2.94
KB
-rw-r--r--
Delete
Unzip
Zip
${this.title}
Close
Code Editor : oci_driver.c
/* +----------------------------------------------------------------------+ | Copyright (c) The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | | available through the world-wide-web at the following url: | | https://www.php.net/license/3_01.txt | | If you did not receive a copy of the PHP license and are unable to | | obtain it through the world-wide-web, please send a note to | | license@php.net so we can mail you a copy immediately. | +----------------------------------------------------------------------+ | Author: Wez Furlong <wez@php.net> | +----------------------------------------------------------------------+ */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "php.h" #include "php_ini.h" #include "ext/standard/info.h" #include "pdo/php_pdo.h" #include "pdo/php_pdo_driver.h" #include "php_pdo_oci.h" #include "php_pdo_oci_int.h" #include "Zend/zend_exceptions.h" static inline ub4 pdo_oci_sanitize_prefetch(long prefetch); static void pdo_oci_fetch_error_func(pdo_dbh_t *dbh, pdo_stmt_t *stmt, zval *info) /* {{{ */ { pdo_oci_db_handle *H = (pdo_oci_db_handle *)dbh->driver_data; pdo_oci_error_info *einfo; einfo = &H->einfo; if (stmt) { pdo_oci_stmt *S = (pdo_oci_stmt*)stmt->driver_data; if (S->einfo.errmsg) { einfo = &S->einfo; } } if (einfo->errcode) { add_next_index_long(info, einfo->errcode); add_next_index_string(info, einfo->errmsg); } } /* }}} */ ub4 _oci_error(OCIError *err, pdo_dbh_t *dbh, pdo_stmt_t *stmt, char *what, sword status, int isinit, const char *file, int line) /* {{{ */ { text errbuf[1024] = "<<Unknown>>"; char tmp_buf[2048]; pdo_oci_db_handle *H = (pdo_oci_db_handle *)dbh->driver_data; pdo_oci_error_info *einfo; pdo_oci_stmt *S = NULL; pdo_error_type *pdo_err = &dbh->error_code; if (stmt) { S = (pdo_oci_stmt*)stmt->driver_data; einfo = &S->einfo; pdo_err = &stmt->error_code; } else { einfo = &H->einfo; } if (einfo->errmsg) { pefree(einfo->errmsg, dbh->is_persistent); } einfo->errmsg = NULL; einfo->errcode = 0; einfo->file = file; einfo->line = line; if (isinit) { /* Initialization error */ strcpy(*pdo_err, "HY000"); slprintf(tmp_buf, sizeof(tmp_buf), "%s (%s:%d)", what, file, line); einfo->errmsg = pestrdup(tmp_buf, dbh->is_persistent); } else { switch (status) { case OCI_SUCCESS: strcpy(*pdo_err, "00000"); break; case OCI_ERROR: OCIErrorGet(err, (ub4)1, NULL, &einfo->errcode, errbuf, (ub4)sizeof(errbuf), OCI_HTYPE_ERROR); slprintf(tmp_buf, sizeof(tmp_buf), "%s: %s (%s:%d)", what, errbuf, file, line); einfo->errmsg = pestrdup(tmp_buf, dbh->is_persistent); break; case OCI_SUCCESS_WITH_INFO: OCIErrorGet(err, (ub4)1, NULL, &einfo->errcode, errbuf, (ub4)sizeof(errbuf), OCI_HTYPE_ERROR); slprintf(tmp_buf, sizeof(tmp_buf), "%s: OCI_SUCCESS_WITH_INFO: %s (%s:%d)", what, errbuf, file, line); einfo->errmsg = pestrdup(tmp_buf, dbh->is_persistent); break; case OCI_NEED_DATA: slprintf(tmp_buf, sizeof(tmp_buf), "%s: OCI_NEED_DATA (%s:%d)", what, file, line); einfo->errmsg = pestrdup(tmp_buf, dbh->is_persistent); break; case OCI_NO_DATA: slprintf(tmp_buf, sizeof(tmp_buf), "%s: OCI_NO_DATA (%s:%d)", what, file, line); einfo->errmsg = pestrdup(tmp_buf, dbh->is_persistent); break; case OCI_INVALID_HANDLE: slprintf(tmp_buf, sizeof(tmp_buf), "%s: OCI_INVALID_HANDLE (%s:%d)", what, file, line); einfo->errmsg = pestrdup(tmp_buf, dbh->is_persistent); break; case OCI_STILL_EXECUTING: slprintf(tmp_buf, sizeof(tmp_buf), "%s: OCI_STILL_EXECUTING (%s:%d)", what, file, line); einfo->errmsg = pestrdup(tmp_buf, dbh->is_persistent); break; case OCI_CONTINUE: slprintf(tmp_buf, sizeof(tmp_buf), "%s: OCI_CONTINUE (%s:%d)", what, file, line); einfo->errmsg = pestrdup(tmp_buf, dbh->is_persistent); break; } if (einfo->errcode) { switch (einfo->errcode) { case 1013: /* user requested cancel of current operation */ zend_bailout(); break; case 12154: /* ORA-12154: TNS:could not resolve service name */ strcpy(*pdo_err, "42S02"); break; case 22: /* ORA-00022: invalid session id */ case 378: case 602: case 603: case 604: case 609: case 1012: /* ORA-01012: */ case 1033: case 1041: case 1043: case 1089: case 1090: case 1092: case 3113: /* ORA-03133: end of file on communication channel */ case 3114: case 3122: case 3135: case 12153: case 27146: case 28511: /* consider the connection closed */ dbh->is_closed = 1; H->attached = 0; strcpy(*pdo_err, "01002"); /* FIXME */ break; default: strcpy(*pdo_err, "HY000"); } } if (stmt) { /* always propagate the error code back up to the dbh, * so that we can catch the error information when execute * is called via query. See Bug #33707 */ if (H->einfo.errmsg) { pefree(H->einfo.errmsg, dbh->is_persistent); } H->einfo = *einfo; H->einfo.errmsg = einfo->errmsg ? pestrdup(einfo->errmsg, dbh->is_persistent) : NULL; strcpy(dbh->error_code, stmt->error_code); } } /* little mini hack so that we can use this code from the dbh ctor */ if (!dbh->methods && status != OCI_SUCCESS_WITH_INFO) { zend_throw_exception_ex(php_pdo_get_exception(), einfo->errcode, "SQLSTATE[%s]: %s", *pdo_err, einfo->errmsg); } return einfo->errcode; } /* }}} */ static void oci_handle_closer(pdo_dbh_t *dbh) /* {{{ */ { pdo_oci_db_handle *H = (pdo_oci_db_handle *)dbh->driver_data; if (H->svc) { /* rollback any outstanding work */ OCITransRollback(H->svc, H->err, 0); } if (H->session) { OCIHandleFree(H->session, OCI_HTYPE_SESSION); H->session = NULL; } if (H->svc) { OCIHandleFree(H->svc, OCI_HTYPE_SVCCTX); H->svc = NULL; } if (H->server && H->attached) { H->last_err = OCIServerDetach(H->server, H->err, OCI_DEFAULT); if (H->last_err) { oci_drv_error("OCIServerDetach"); } H->attached = 0; } if (H->server) { OCIHandleFree(H->server, OCI_HTYPE_SERVER); H->server = NULL; } if (H->err) { OCIHandleFree(H->err, OCI_HTYPE_ERROR); H->err = NULL; } if (H->charset && H->env) { OCIHandleFree(H->env, OCI_HTYPE_ENV); H->env = NULL; } if (H->einfo.errmsg) { pefree(H->einfo.errmsg, dbh->is_persistent); H->einfo.errmsg = NULL; } pefree(H, dbh->is_persistent); } /* }}} */ static bool oci_handle_preparer(pdo_dbh_t *dbh, zend_string *sql, pdo_stmt_t *stmt, zval *driver_options) /* {{{ */ { pdo_oci_db_handle *H = (pdo_oci_db_handle *)dbh->driver_data; pdo_oci_stmt *S = ecalloc(1, sizeof(*S)); ub4 prefetch; zend_string *nsql = NULL; int ret; #ifdef HAVE_OCISTMTFETCH2 S->exec_type = pdo_attr_lval(driver_options, PDO_ATTR_CURSOR, PDO_CURSOR_FWDONLY) == PDO_CURSOR_SCROLL ? OCI_STMT_SCROLLABLE_READONLY : OCI_DEFAULT; #else S->exec_type = OCI_DEFAULT; #endif S->H = H; stmt->supports_placeholders = PDO_PLACEHOLDER_NAMED; ret = pdo_parse_params(stmt, sql, &nsql); if (ret == 1) { /* query was re-written */ sql = nsql; } else if (ret == -1) { /* couldn't grok it */ strcpy(dbh->error_code, stmt->error_code); efree(S); return false; } /* create an OCI statement handle */ OCIHandleAlloc(H->env, (dvoid*)&S->stmt, OCI_HTYPE_STMT, 0, NULL); /* and our own private error handle */ OCIHandleAlloc(H->env, (dvoid*)&S->err, OCI_HTYPE_ERROR, 0, NULL); if (ZSTR_LEN(sql) != 0) { H->last_err = OCIStmtPrepare(S->stmt, H->err, (text*) ZSTR_VAL(sql), (ub4) ZSTR_LEN(sql), OCI_NTV_SYNTAX, OCI_DEFAULT); if (nsql) { zend_string_release(nsql); nsql = NULL; } if (H->last_err) { H->last_err = oci_drv_error("OCIStmtPrepare"); OCIHandleFree(S->stmt, OCI_HTYPE_STMT); OCIHandleFree(S->err, OCI_HTYPE_ERROR); efree(S); return false; } } prefetch = H->prefetch; /* Note 0 is allowed so in future REF CURSORs can be used & then passed with no row loss*/ H->last_err = OCIAttrSet(S->stmt, OCI_HTYPE_STMT, &prefetch, 0, OCI_ATTR_PREFETCH_ROWS, H->err); if (!H->last_err) { prefetch *= PDO_OCI_PREFETCH_ROWSIZE; H->last_err = OCIAttrSet(S->stmt, OCI_HTYPE_STMT, &prefetch, 0, OCI_ATTR_PREFETCH_MEMORY, H->err); } stmt->driver_data = S; stmt->methods = &oci_stmt_methods; if (nsql) { zend_string_release(nsql); nsql = NULL; } return true; } /* }}} */ static zend_long oci_handle_doer(pdo_dbh_t *dbh, const zend_string *sql) /* {{{ */ { pdo_oci_db_handle *H = (pdo_oci_db_handle *)dbh->driver_data; OCIStmt *stmt; ub2 stmt_type; ub4 rowcount; int ret = -1; OCIHandleAlloc(H->env, (dvoid*)&stmt, OCI_HTYPE_STMT, 0, NULL); H->last_err = OCIStmtPrepare(stmt, H->err, (text*)ZSTR_VAL(sql), (ub4) ZSTR_LEN(sql), OCI_NTV_SYNTAX, OCI_DEFAULT); if (H->last_err) { H->last_err = oci_drv_error("OCIStmtPrepare"); OCIHandleFree(stmt, OCI_HTYPE_STMT); return -1; } H->last_err = OCIAttrGet(stmt, OCI_HTYPE_STMT, &stmt_type, 0, OCI_ATTR_STMT_TYPE, H->err); if (stmt_type == OCI_STMT_SELECT) { /* invalid usage; cancel it */ OCIHandleFree(stmt, OCI_HTYPE_STMT); php_error_docref(NULL, E_WARNING, "issuing a SELECT query here is invalid"); return -1; } /* now we are good to go */ H->last_err = OCIStmtExecute(H->svc, stmt, H->err, 1, 0, NULL, NULL, (dbh->auto_commit && !dbh->in_txn) ? OCI_COMMIT_ON_SUCCESS : OCI_DEFAULT); sword last_err = H->last_err; if (last_err) { H->last_err = oci_drv_error("OCIStmtExecute"); } if (!last_err || last_err == OCI_SUCCESS_WITH_INFO) { /* return the number of affected rows */ H->last_err = OCIAttrGet(stmt, OCI_HTYPE_STMT, &rowcount, 0, OCI_ATTR_ROW_COUNT, H->err); ret = rowcount; } OCIHandleFree(stmt, OCI_HTYPE_STMT); return ret; } /* }}} */ static zend_string* oci_handle_quoter(pdo_dbh_t *dbh, const zend_string *unquoted, enum pdo_param_type paramtype ) /* {{{ */ { int qcount = 0; char const *cu, *l, *r; char *c, *quoted; size_t quotedlen; zend_string *quoted_str; if (ZSTR_LEN(unquoted) == 0) { return zend_string_init("''", 2, 0); } /* count single quotes */ for (cu = ZSTR_VAL(unquoted); (cu = strchr(cu,'\'')); qcount++, cu++) ; /* empty loop */ quotedlen = ZSTR_LEN(unquoted) + qcount + 2; quoted = c = emalloc(quotedlen+1); *c++ = '\''; /* foreach (chunk that ends in a quote) */ for (l = ZSTR_VAL(unquoted); (r = strchr(l,'\'')); l = r+1) { strncpy(c, l, r-l+1); c += (r-l+1); *c++ = '\''; /* add second quote */ } /* Copy remainder and add enclosing quote */ strncpy(c, l, quotedlen-(c-quoted)-1); quoted[quotedlen-1] = '\''; quoted[quotedlen] = '\0'; quoted_str = zend_string_init(quoted, quotedlen, 0); efree(quoted); return quoted_str; } /* }}} */ static bool oci_handle_begin(pdo_dbh_t *dbh) /* {{{ */ { /* with Oracle, there is nothing special to be done */ return true; } /* }}} */ static bool oci_handle_commit(pdo_dbh_t *dbh) /* {{{ */ { pdo_oci_db_handle *H = (pdo_oci_db_handle *)dbh->driver_data; H->last_err = OCITransCommit(H->svc, H->err, 0); if (H->last_err) { H->last_err = oci_drv_error("OCITransCommit"); return false; } return true; } /* }}} */ static bool oci_handle_rollback(pdo_dbh_t *dbh) /* {{{ */ { pdo_oci_db_handle *H = (pdo_oci_db_handle *)dbh->driver_data; H->last_err = OCITransRollback(H->svc, H->err, 0); if (H->last_err) { H->last_err = oci_drv_error("OCITransRollback"); return false; } return true; } /* }}} */ static bool oci_handle_set_attribute(pdo_dbh_t *dbh, zend_long attr, zval *val) /* {{{ */ { zend_long lval; pdo_oci_db_handle *H = (pdo_oci_db_handle *)dbh->driver_data; switch (attr) { case PDO_ATTR_AUTOCOMMIT: { bool bval; if (!pdo_get_bool_param(&bval, val)) { return false; } if (dbh->in_txn) { /* Assume they want to commit whatever is outstanding */ H->last_err = OCITransCommit(H->svc, H->err, 0); if (H->last_err) { H->last_err = oci_drv_error("OCITransCommit"); return false; } dbh->in_txn = false; } dbh->auto_commit = (unsigned int) bval; return true; } case PDO_ATTR_PREFETCH: { if (!pdo_get_long_param(&lval, val)) { return false; } H->prefetch = pdo_oci_sanitize_prefetch(lval); return true; } case PDO_OCI_ATTR_ACTION: { #if (OCI_MAJOR_VERSION >= 10) zend_string *action = zval_try_get_string(val); if (UNEXPECTED(!action)) { return false; } H->last_err = OCIAttrSet(H->session, OCI_HTYPE_SESSION, (dvoid *) ZSTR_VAL(action), (ub4) ZSTR_LEN(action), OCI_ATTR_ACTION, H->err); if (H->last_err) { oci_drv_error("OCIAttrSet: OCI_ATTR_ACTION"); return false; } return true; #else oci_drv_error("Unsupported attribute type"); return false; #endif } case PDO_OCI_ATTR_CLIENT_INFO: { #if (OCI_MAJOR_VERSION >= 10) zend_string *client_info = zval_try_get_string(val); if (UNEXPECTED(!client_info)) { return false; } H->last_err = OCIAttrSet(H->session, OCI_HTYPE_SESSION, (dvoid *) ZSTR_VAL(client_info), (ub4) ZSTR_LEN(client_info), OCI_ATTR_CLIENT_INFO, H->err); if (H->last_err) { oci_drv_error("OCIAttrSet: OCI_ATTR_CLIENT_INFO"); return false; } return true; #else oci_drv_error("Unsupported attribute type"); return false; #endif } case PDO_OCI_ATTR_CLIENT_IDENTIFIER: { #if (OCI_MAJOR_VERSION >= 10) zend_string *identifier = zval_try_get_string(val); if (UNEXPECTED(!identifier)) { return false; } H->last_err = OCIAttrSet(H->session, OCI_HTYPE_SESSION, (dvoid *) ZSTR_VAL(identifier), (ub4) ZSTR_LEN(identifier), OCI_ATTR_CLIENT_IDENTIFIER, H->err); if (H->last_err) { oci_drv_error("OCIAttrSet: OCI_ATTR_CLIENT_IDENTIFIER"); return false; } return true; #else oci_drv_error("Unsupported attribute type"); return false; #endif } case PDO_OCI_ATTR_MODULE: { #if (OCI_MAJOR_VERSION >= 10) zend_string *module = zval_try_get_string(val); if (UNEXPECTED(!module)) { return false; } H->last_err = OCIAttrSet(H->session, OCI_HTYPE_SESSION, (dvoid *) ZSTR_VAL(module), (ub4) ZSTR_LEN(module), OCI_ATTR_MODULE, H->err); if (H->last_err) { oci_drv_error("OCIAttrSet: OCI_ATTR_MODULE"); return false; } return true; #else oci_drv_error("Unsupported attribute type"); return false; #endif } case PDO_OCI_ATTR_CALL_TIMEOUT: { #if (OCI_MAJOR_VERSION >= 18) if (!pdo_get_long_param(&lval, val)) { return false; } ub4 timeout = (ub4) lval; H->last_err = OCIAttrSet(H->svc, OCI_HTYPE_SVCCTX, (dvoid *) &timeout, (ub4) 0, OCI_ATTR_CALL_TIMEOUT, H->err); if (H->last_err) { oci_drv_error("OCIAttrSet: OCI_ATTR_CALL_TIMEOUT"); return false; } return true; #else oci_drv_error("Unsupported attribute type"); return false; #endif } default: return false; } } /* }}} */ static int oci_handle_get_attribute(pdo_dbh_t *dbh, zend_long attr, zval *return_value) /* {{{ */ { pdo_oci_db_handle *H = (pdo_oci_db_handle *)dbh->driver_data; switch (attr) { case PDO_ATTR_SERVER_VERSION: case PDO_ATTR_SERVER_INFO: { text infostr[512]; char verstr[15]; ub4 vernum; if (OCIServerRelease(H->svc, H->err, infostr, (ub4)sizeof(infostr), (ub1)OCI_HTYPE_SVCCTX, &vernum)) { ZVAL_STRING(return_value, "<<Unknown>>"); } else { if (attr == PDO_ATTR_SERVER_INFO) { ZVAL_STRING(return_value, (char *)infostr); } else { slprintf(verstr, sizeof(verstr), "%d.%d.%d.%d.%d", (int)((vernum>>24) & 0xFF), /* version number */ (int)((vernum>>20) & 0x0F), /* release number*/ (int)((vernum>>12) & 0xFF), /* update number */ (int)((vernum>>8) & 0x0F), /* port release number */ (int)((vernum>>0) & 0xFF)); /* port update number */ ZVAL_STRING(return_value, verstr); } } return TRUE; } case PDO_ATTR_CLIENT_VERSION: { #if OCI_MAJOR_VERSION > 10 || (OCI_MAJOR_VERSION == 10 && OCI_MINOR_VERSION >= 2) /* Run time client version */ sword major, minor, update, patch, port_update; char verstr[15]; OCIClientVersion(&major, &minor, &update, &patch, &port_update); slprintf(verstr, sizeof(verstr), "%d.%d.%d.%d.%d", major, minor, update, patch, port_update); ZVAL_STRING(return_value, verstr); #elif defined(PHP_PDO_OCI_CLIENT_VERSION) /* Compile time client version */ ZVAL_STRING(return_value, PHP_PDO_OCI_CLIENT_VERSION); #else return FALSE; #endif /* Check for OCIClientVersion() support */ return TRUE; } case PDO_ATTR_AUTOCOMMIT: ZVAL_BOOL(return_value, dbh->auto_commit); return TRUE; case PDO_ATTR_PREFETCH: ZVAL_LONG(return_value, H->prefetch); return TRUE; case PDO_OCI_ATTR_CALL_TIMEOUT: { #if (OCI_MAJOR_VERSION >= 18) ub4 timeout; H->last_err = OCIAttrGet(H->svc, OCI_HTYPE_SVCCTX, (dvoid *) &timeout, NULL, OCI_ATTR_CALL_TIMEOUT, H->err); if (H->last_err) { oci_drv_error("OCIAttrGet: OCI_ATTR_CALL_TIMEOUT"); return FALSE; } ZVAL_LONG(return_value, (zend_long) timeout); return TRUE; #else oci_drv_error("Unsupported attribute type"); return FALSE; #endif } default: return FALSE; } return FALSE; } /* }}} */ static zend_result pdo_oci_check_liveness(pdo_dbh_t *dbh) /* {{{ */ { pdo_oci_db_handle *H = (pdo_oci_db_handle *)dbh->driver_data; sb4 error_code = 0; #if (!((OCI_MAJOR_VERSION > 10) || ((OCI_MAJOR_VERSION == 10) && (OCI_MINOR_VERSION >= 2)))) char version[256]; #endif /* TODO move attached check to PDO level */ if (H->attached == 0) { return FAILURE; } /* TODO add persistent_timeout check at PDO level */ /* Use OCIPing instead of OCIServerVersion. If OCIPing returns ORA-1010 (invalid OCI operation) * such as from Pre-10.1 servers, the error is still from the server and we would have * successfully performed a roundtrip and validated the connection. Use OCIServerVersion for * Pre-10.2 clients */ #if ((OCI_MAJOR_VERSION > 10) || ((OCI_MAJOR_VERSION == 10) && (OCI_MINOR_VERSION >= 2))) /* OCIPing available 10.2 onwards */ H->last_err = OCIPing (H->svc, H->err, OCI_DEFAULT); #else /* use good old OCIServerVersion() */ H->last_err = OCIServerVersion (H->svc, H->err, (text *)version, sizeof(version), OCI_HTYPE_SVCCTX); #endif if (H->last_err == OCI_SUCCESS) { return SUCCESS; } OCIErrorGet (H->err, (ub4)1, NULL, &error_code, NULL, 0, OCI_HTYPE_ERROR); if (error_code == 1010) { return SUCCESS; } return FAILURE; } /* }}} */ static const struct pdo_dbh_methods oci_methods = { oci_handle_closer, oci_handle_preparer, oci_handle_doer, oci_handle_quoter, oci_handle_begin, oci_handle_commit, oci_handle_rollback, oci_handle_set_attribute, NULL, /* last_id not supported */ pdo_oci_fetch_error_func, oci_handle_get_attribute, pdo_oci_check_liveness, /* check_liveness */ NULL, /* get_driver_methods */ NULL, /* request_shutdown */ NULL, /* in transaction, use PDO's internal tracking mechanism */ NULL /* get_gc */ }; static int pdo_oci_handle_factory(pdo_dbh_t *dbh, zval *driver_options) /* {{{ */ { pdo_oci_db_handle *H; int i, ret = 0; struct pdo_data_src_parser vars[] = { { "charset", NULL, 0 }, { "dbname", "", 0 }, { "user", NULL, 0 }, { "password", NULL, 0 } }; php_pdo_parse_data_source(dbh->data_source, dbh->data_source_len, vars, 4); H = pecalloc(1, sizeof(*H), dbh->is_persistent); dbh->driver_data = H; dbh->skip_param_evt = 1 << PDO_PARAM_EVT_FETCH_PRE | 1 << PDO_PARAM_EVT_FETCH_POST | 1 << PDO_PARAM_EVT_NORMALIZE; H->prefetch = PDO_OCI_PREFETCH_DEFAULT; /* allocate an environment */ #ifdef HAVE_OCIENVNLSCREATE if (vars[0].optval) { H->charset = OCINlsCharSetNameToId(pdo_oci_Env, (const oratext *)vars[0].optval); if (!H->charset) { oci_init_error("OCINlsCharSetNameToId: unknown character set name"); goto cleanup; } else { if (OCIEnvNlsCreate(&H->env, PDO_OCI_INIT_MODE, 0, NULL, NULL, NULL, 0, NULL, H->charset, H->charset) != OCI_SUCCESS) { oci_init_error("OCIEnvNlsCreate: Check the character set is valid and that PHP has access to Oracle libraries and NLS data"); goto cleanup; } } } #endif if (H->env == NULL) { /* use the global environment */ H->env = pdo_oci_Env; } /* something to hold errors */ OCIHandleAlloc(H->env, (dvoid **)&H->err, OCI_HTYPE_ERROR, 0, NULL); /* handle for the server */ OCIHandleAlloc(H->env, (dvoid **)&H->server, OCI_HTYPE_SERVER, 0, NULL); H->last_err = OCIServerAttach(H->server, H->err, (text*)vars[1].optval, (sb4) strlen(vars[1].optval), OCI_DEFAULT); if (H->last_err) { oci_drv_error("pdo_oci_handle_factory"); goto cleanup; } H->attached = 1; /* create a service context */ H->last_err = OCIHandleAlloc(H->env, (dvoid**)&H->svc, OCI_HTYPE_SVCCTX, 0, NULL); if (H->last_err) { oci_drv_error("OCIHandleAlloc: OCI_HTYPE_SVCCTX"); goto cleanup; } H->last_err = OCIHandleAlloc(H->env, (dvoid**)&H->session, OCI_HTYPE_SESSION, 0, NULL); if (H->last_err) { oci_drv_error("OCIHandleAlloc: OCI_HTYPE_SESSION"); goto cleanup; } /* set server handle into service handle */ H->last_err = OCIAttrSet(H->svc, OCI_HTYPE_SVCCTX, H->server, 0, OCI_ATTR_SERVER, H->err); if (H->last_err) { oci_drv_error("OCIAttrSet: OCI_ATTR_SERVER"); goto cleanup; } /* username */ if (!dbh->username && vars[2].optval) { dbh->username = pestrdup(vars[2].optval, dbh->is_persistent); } if (dbh->username) { H->last_err = OCIAttrSet(H->session, OCI_HTYPE_SESSION, dbh->username, (ub4) strlen(dbh->username), OCI_ATTR_USERNAME, H->err); if (H->last_err) { oci_drv_error("OCIAttrSet: OCI_ATTR_USERNAME"); goto cleanup; } } /* password */ if (!dbh->password && vars[3].optval) { dbh->password = pestrdup(vars[3].optval, dbh->is_persistent); } if (dbh->password) { H->last_err = OCIAttrSet(H->session, OCI_HTYPE_SESSION, dbh->password, (ub4) strlen(dbh->password), OCI_ATTR_PASSWORD, H->err); if (H->last_err) { oci_drv_error("OCIAttrSet: OCI_ATTR_PASSWORD"); goto cleanup; } } /* Now fire up the session */ H->last_err = OCISessionBegin(H->svc, H->err, H->session, OCI_CRED_RDBMS, OCI_DEFAULT); if (H->last_err) { oci_drv_error("OCISessionBegin"); /* OCISessionBegin returns OCI_SUCCESS_WITH_INFO when * user's password has expired, but is still usable. */ if (H->last_err != OCI_SUCCESS_WITH_INFO) { goto cleanup; } } /* set the server handle into service handle */ H->last_err = OCIAttrSet(H->svc, OCI_HTYPE_SVCCTX, H->session, 0, OCI_ATTR_SESSION, H->err); if (H->last_err) { oci_drv_error("OCIAttrSet: OCI_ATTR_SESSION"); goto cleanup; } /* Get max character width */ H->last_err = OCINlsNumericInfoGet(H->env, H->err, &H->max_char_width, OCI_NLS_CHARSET_MAXBYTESZ); if (H->last_err) { oci_drv_error("OCINlsNumericInfoGet: OCI_NLS_CHARSET_MAXBYTESZ"); goto cleanup; } dbh->methods = &oci_methods; dbh->alloc_own_columns = 1; dbh->native_case = PDO_CASE_UPPER; ret = 1; cleanup: for (i = 0; i < sizeof(vars)/sizeof(vars[0]); i++) { if (vars[i].freeme) { efree(vars[i].optval); } } if (!ret) { oci_handle_closer(dbh); } return ret; } /* }}} */ const pdo_driver_t pdo_oci_driver = { PDO_DRIVER_HEADER(oci), pdo_oci_handle_factory }; static inline ub4 pdo_oci_sanitize_prefetch(long prefetch) /* {{{ */ { if (prefetch < 0) { prefetch = 0; } else if (prefetch > UB4MAXVAL / PDO_OCI_PREFETCH_ROWSIZE) { prefetch = PDO_OCI_PREFETCH_DEFAULT; } return ((ub4)prefetch); } /* }}} */
Close