📄 oci8.c
字号:
case OCI_NEED_DATA: php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s: OCI_NEED_DATA", what); break; case OCI_NO_DATA: php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s: OCI_NO_DATA", what); break; case OCI_ERROR: { CALL_OCI(OCIErrorGet( err_p, (ub4)1, NULL, &errcode, errbuf, (ub4)sizeof(errbuf), (ub4)OCI_HTYPE_ERROR)); php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s: %s", what, errbuf); break; } case OCI_INVALID_HANDLE: php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s: OCI_INVALID_HANDLE", what); break; case OCI_STILL_EXECUTING: php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s: OCI_STILL_EXECUTING", what); break; case OCI_CONTINUE: php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s: OCI_CONTINUE", what); break; default: break; } return errcode;}/* }}} *//* {{{ oci_ping() */static int oci_ping(oci_server *server){ char version[256]; TSRMLS_FETCH(); CALL_OCI_RETURN(OCI(error), OCIServerVersion( server->pServer, OCI(pError), (text*)version, sizeof(version), OCI_HTYPE_SERVER)); if (OCI(error) == OCI_SUCCESS) { return 1; } oci_error(OCI(pError), "oci_ping", OCI(error)); return 0;}/* }}} *//************************* INTERNAL FUNCTIONS *************************//* {{{ oci_debug() */static void oci_debug(const char *format, ...){ TSRMLS_FETCH(); if (OCI(debug_mode)) { char buffer[1024]; va_list args; va_start(args, format); vsnprintf(buffer, sizeof(buffer)-1, format, args); va_end(args); buffer[sizeof(buffer)-1] = '\0'; php_printf("OCIDebug: %s<br />\n", buffer); }}/* }}} *//* {{{ oci_get_conn() */static oci_connection *oci_get_conn(zval **conn TSRMLS_DC){ oci_connection *connection; connection = (oci_connection *) zend_fetch_resource(conn TSRMLS_CC, -1, "OCI8-Connection", NULL, 1, le_conn); if (connection && connection->is_open) { return connection; } else { return (oci_connection *) NULL; }}/* }}} *//* {{{ oci_get_stmt() */static oci_statement *oci_get_stmt(zval **stmt TSRMLS_DC){ oci_statement *statement; statement = (oci_statement *) zend_fetch_resource(stmt TSRMLS_CC, -1, "OCI8-Statement", NULL, 1, le_stmt); if (statement && statement->conn->is_open) { return statement; } else { return (oci_statement *) NULL; }}/* }}} *//* {{{ oci_get_desc() */static oci_descriptor *oci_get_desc(int ind TSRMLS_DC){ oci_descriptor *descriptor; int actual_resource_type; descriptor = (oci_descriptor *) zend_list_find(ind, &actual_resource_type); if (descriptor && (actual_resource_type == le_desc)) { return descriptor; } else { return (oci_descriptor *) NULL; }}/* }}} *//* {{{ oci_get_col() */static oci_out_column *oci_get_col(oci_statement *statement, int col, zval **value){ oci_out_column *outcol = NULL; int i; TSRMLS_FETCH(); if (statement->columns == 0) { /* we release the columns at the end of a fetch */ return NULL; } if (value) { if (Z_TYPE_PP(value) == IS_STRING) { for (i = 0; i < statement->ncolumns; i++) { outcol = oci_get_col(statement, i + 1, 0); if (outcol == NULL) { continue; } else if (((int) outcol->name_len == Z_STRLEN_PP(value)) && (! strncmp(outcol->name,Z_STRVAL_PP(value),Z_STRLEN_PP(value)))) { return outcol; } } } else { convert_to_long_ex(value); return oci_get_col(statement,Z_LVAL_PP(value),0); } } else if (col != -1) { if (zend_hash_index_find(statement->columns, col, (void **)&outcol) == FAILURE) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid column %d", col); return NULL; } return outcol; } return NULL;}/* }}} *//* {{{ oci_new_desc() */static oci_descriptor*oci_new_desc(int type,oci_connection *connection){ oci_descriptor *descr; TSRMLS_FETCH(); descr = emalloc(sizeof(oci_descriptor)); Z_TYPE_P(descr) = type; switch (Z_TYPE_P(descr)) { case OCI_DTYPE_FILE: case OCI_DTYPE_LOB: case OCI_DTYPE_ROWID: break; default: php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unknown descriptor type %d.",Z_TYPE_P(descr)); return 0; } CALL_OCI_RETURN(OCI(error), OCIDescriptorAlloc( connection->session->pEnv, (dvoid*)&(descr->ocidescr), Z_TYPE_P(descr), (size_t) 0, (dvoid **) 0)); if (OCI(error)) { ub4 error; error = oci_error(OCI(pError),"OCIDescriptorAlloc %d",OCI(error)); oci_handle_error(connection, error); return 0; } descr->id = zend_list_insert(descr,le_desc); descr->conn = connection; zend_list_addref(connection->id); oci_debug("oci_new_desc %d",descr->id); return descr;}#ifdef WITH_COLLECTIONS/* {{{ _oci_get_ocicoll() */static int_oci_get_ocicoll(zval *id,oci_collection **collection TSRMLS_DC){ zval **coll; if (zend_hash_find(Z_OBJPROP_P(id), "collection", sizeof("collection"), (void **)&coll) == FAILURE) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "cannot find collection"); return 0; } if ((*collection = oci_get_coll(Z_LVAL_PP(coll) TSRMLS_CC)) == NULL) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "collection not found"); return 0; } return Z_LVAL_PP(coll);}/* }}} */#endif/* }}} *//* {{{ _oci_get_ocidesc() */static int_oci_get_ocidesc(zval *id,oci_descriptor **descriptor TSRMLS_DC){ zval **desc; if (zend_hash_find(Z_OBJPROP_P(id), "descriptor", sizeof("descriptor"), (void **)&desc) == FAILURE) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "cannot find descriptor"); return 0; } if ((*descriptor = oci_get_desc(Z_LVAL_PP(desc) TSRMLS_CC)) == NULL) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "descriptor not found"); return 0; } return Z_LVAL_PP(desc);}/* }}} *//* {{{ _oci_make_zval() */static int _oci_make_zval(zval *value,oci_statement *statement,oci_out_column *column, char *func, int mode TSRMLS_DC){ oci_descriptor *descr; ub4 loblen; int size; char *buffer; if (column->indicator || column->retcode) if ((column->indicator != -1) && (column->retcode != 1405)) oci_debug("_oci_make_zval: %16s,retlen = %4d,retlen4 = %d,storage_size4 = %4d,indicator %4d, retcode = %4d", column->name,column->retlen,column->retlen4,column->storage_size4,column->indicator,column->retcode); if ((! statement->has_data) || (column->indicator == -1)) { /* column is NULL or statment has no current data */ ZVAL_NULL(value); return 0; } if (column->is_cursor) { /* REFCURSOR -> simply return the statement id */ ZVAL_RESOURCE(value,column->stmtid); zend_list_addref(column->stmtid); } else if (column->is_descr) { if ((column->data_type != SQLT_RDD) && (mode & OCI_RETURN_LOBS)) { /* OCI_RETURN_LOBS means that we want the content of the LOB back instead of the locator */ descr = oci_get_desc(column->descid TSRMLS_CC); if (! descr) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "unable to find my descriptor %p",column->data); return -1; } if (oci_loadlob(statement->conn,descr,&buffer,&loblen)) { ZVAL_FALSE(value); } else { if (loblen > 0) { ZVAL_STRINGL(value,buffer,loblen,0); } else { ZVAL_EMPTY_STRING(value); } } } else { /* return the locator */ object_init_ex(value, oci_lob_class_entry_ptr); add_property_resource(value, "descriptor", column->descid); zend_list_addref(column->descid); } } else { switch (column->retcode) { case 0: /* intact value */ if (column->piecewise) { size = column->retlen4; } else { size = column->retlen; } break; default: /* XXX we SHOULD maybe have a different behaviour for unknown results! */ ZVAL_FALSE(value); return 0; } ZVAL_STRINGL(value,column->data,size,1); } return 0;}/* }}} *//* {{{ oci_setprefetch() */static intoci_setprefetch(oci_statement *statement,int size){ ub4 prefetch; sword error; TSRMLS_FETCH(); prefetch = size * 1024; CALL_OCI_RETURN(error, OCIAttrSet( statement->pStmt, OCI_HTYPE_STMT, &prefetch, 0, OCI_ATTR_PREFETCH_MEMORY, statement->pError)); statement->error = oci_error(statement->pError, "OCIAttrSet OCI_ATTR_PREFETCH_MEMORY", error); if (statement->error) { oci_handle_error(statement->conn, statement->error); } prefetch = size; CALL_OCI_RETURN(error, OCIAttrSet( statement->pStmt, OCI_HTYPE_STMT, &prefetch, 0, OCI_ATTR_PREFETCH_ROWS, statement->pError)); statement->error = oci_error(statement->pError, "OCIAttrSet OCI_ATTR_PREFETCH_MEMORY", error); if (statement->error) { oci_handle_error(statement->conn, statement->error); } return 1;}/* }}} *//* {{{ oci_parse() */static oci_statement *oci_parse(oci_connection *connection, char *query, int len){ oci_statement *statement; sword error; TSRMLS_FETCH(); statement = ecalloc(1,sizeof(oci_statement)); CALL_OCI(OCIHandleAlloc( connection->session->pEnv, (dvoid **)&statement->pStmt, OCI_HTYPE_STMT, 0, NULL)); CALL_OCI(OCIHandleAlloc( connection->session->pEnv, (dvoid **)&statement->pError, OCI_HTYPE_ERROR, 0, NULL)); if (len > 0) { CALL_OCI_RETURN(error, OCIStmtPrepare( statement->pStmt, connection->pError, (text*)query, len, OCI_NTV_SYNTAX, OCI_DEFAULT)); connection->error = oci_error(connection->pError, "OCIParse", error); if (connection->error) { CALL_OCI(OCIHandleFree( statement->pStmt, OCI_HTYPE_STMT)); CALL_OCI(OCIHandleFree( statement->pError, OCI_HTYPE_ERROR)); efree(statement); oci_handle_error(connection, connection->error); return 0; } } if (query) { statement->last_query = estrdup(query); } statement->conn = connection; statement->has_data = 0; statement->id = zend_list_insert(statement,le_stmt); oci_debug("oci_parse \"%s\" id=%d conn=%d", SAFE_STRING(query), statement->id, statement->conn->id); zend_list_addref(statement->conn->id); return statement;}/* }}} *//* {{{ oci_execute() */static intoci_execute(oci_statement *statement, char *func,ub4 mode){ oci_out_column *outcol; oci_out_column column; OCIParam *param = 0; text *colname; ub4 counter; ub2 define_type; ub4 iters; ub4 colcount; ub2 dynamic; int dtype; dvoid *buf; oci_descriptor *descr; sword error; TSRMLS_FETCH(); if (! statement->stmttype) { CALL_OCI_RETURN(error, OCIAttrGet( (dvoid *)statement->pStmt, OCI_HTYPE_STMT, (ub2 *)&statement->stmttype, (ub4 *)0, OCI_ATTR_STMT_TYPE, statement->pError)); statement->error = oci_error(statement->pError, "OCIAttrGet OCI_HTYPE_STMT/OCI_ATTR_STMT_TYPE", error); if (statement->error) { oci_handle_error(statement->conn, statement->error); return 0; } } if (statement->stmttype == OCI_STMT_SELECT) { iters = 0; } else { iters = 1; } if (statement->last_query) { /* if we execute refcursors we don't have a query and we don't want to execute!!! */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -