📄 oci8.c
字号:
if (statement->binds) { zend_hash_apply(statement->binds, (apply_func_t) _oci_bind_pre_exec TSRMLS_CC); } CALL_OCI_RETURN(error, OCIStmtExecute( statement->conn->pServiceContext, statement->pStmt, statement->pError, iters, 0, NULL, NULL, mode)); statement->error = oci_error(statement->pError, "OCIStmtExecute", error); if (statement->binds) { zend_hash_apply(statement->binds, (apply_func_t) _oci_bind_post_exec TSRMLS_CC); } oci_handle_error(statement->conn, statement->error); if (statement->error) { return 0; } if (mode & OCI_COMMIT_ON_SUCCESS) { statement->conn->needs_commit = 0; } else { statement->conn->needs_commit = 1; } } if ((statement->stmttype == OCI_STMT_SELECT) && (statement->executed == 0)) { /* we only need to do the define step is this very statement is executed the first time! */ statement->executed = 1; ALLOC_HASHTABLE(statement->columns); zend_hash_init(statement->columns, 13, NULL, _oci_column_hash_dtor, 0); counter = 1; CALL_OCI_RETURN(error, OCIAttrGet( (dvoid *)statement->pStmt, OCI_HTYPE_STMT, (dvoid *)&colcount, (ub4 *)0, OCI_ATTR_PARAM_COUNT, statement->pError)); statement->error = oci_error(statement->pError, "OCIAttrGet OCI_HTYPE_STMT/OCI_ATTR_PARAM_COUNT", error); if (statement->error) { oci_handle_error(statement->conn, statement->error); return 0; /* XXX we loose memory!!! */ } statement->ncolumns = colcount; for (counter = 1; counter <= colcount; counter++) { memset(&column,0,sizeof(oci_out_column)); if (zend_hash_index_update(statement->columns, counter, &column, sizeof(oci_out_column), (void**) &outcol) == FAILURE) { efree(statement->columns); /* out of memory */ return 0; } outcol->statement = statement; CALL_OCI_RETURN(error, OCIParamGet( (dvoid *)statement->pStmt, OCI_HTYPE_STMT, statement->pError, (dvoid**)¶m, counter)); statement->error = oci_error(statement->pError, "OCIParamGet OCI_HTYPE_STMT", error); if (statement->error) { oci_handle_error(statement->conn, statement->error); return 0; /* XXX we loose memory!!! */ } CALL_OCI_RETURN(error, OCIAttrGet( (dvoid *)param, OCI_DTYPE_PARAM, (dvoid *)&outcol->data_type, (ub4 *)0, OCI_ATTR_DATA_TYPE, statement->pError)); statement->error = oci_error(statement->pError, "OCIAttrGet OCI_DTYPE_PARAM/OCI_ATTR_DATA_TYPE", error); if (statement->error) { oci_handle_error(statement->conn, statement->error); return 0; /* XXX we loose memory!!! */ } CALL_OCI_RETURN(error, OCIAttrGet( (dvoid *)param, OCI_DTYPE_PARAM, (dvoid *)&outcol->data_size, (dvoid *)0, OCI_ATTR_DATA_SIZE, statement->pError)); statement->error = oci_error(statement->pError, "OCIAttrGet OCI_DTYPE_PARAM/OCI_ATTR_DATA_SIZE", error); if (statement->error) { oci_handle_error(statement->conn, statement->error); return 0; /* XXX we loose memory!!! */ } outcol->storage_size4 = outcol->data_size; outcol->retlen = outcol->data_size; CALL_OCI_RETURN(error, OCIAttrGet( (dvoid *)param, OCI_DTYPE_PARAM, (dvoid *)&outcol->scale, (dvoid *)0, OCI_ATTR_SCALE, statement->pError)); statement->error = oci_error(statement->pError, "OCIAttrGet OCI_DTYPE_PARAM/OCI_ATTR_SCALE", error); if (statement->error) { oci_handle_error(statement->conn, statement->error); return 0; /* XXX we lose memory!!! */ } CALL_OCI_RETURN(error, OCIAttrGet( (dvoid *)param, OCI_DTYPE_PARAM, (dvoid *)&outcol->precision, (dvoid *)0, OCI_ATTR_PRECISION, statement->pError)); statement->error = oci_error(statement->pError, "OCIAttrGet OCI_DTYPE_PARAM/OCI_ATTR_PRECISION", error); if (statement->error) { oci_handle_error(statement->conn, statement->error); return 0; /* XXX we lose memory!!! */ } CALL_OCI_RETURN(error, OCIAttrGet( (dvoid *)param, OCI_DTYPE_PARAM, (dvoid **)&colname, /* XXX this string is NOT zero terminated!!!! */ (ub4 *)&outcol->name_len, (ub4)OCI_ATTR_NAME, statement->pError)); statement->error = oci_error(statement->pError, "OCIAttrGet OCI_DTYPE_PARAM/OCI_ATTR_NAME", error); if (statement->error) { oci_handle_error(statement->conn, statement->error); return 0; /* XXX we loose memory!!! */ } outcol->name = estrndup((char*) colname,outcol->name_len); /* find a user-setted define */ if (statement->defines) { zend_hash_find(statement->defines,outcol->name,outcol->name_len,(void **) &outcol->define); } buf = 0; switch (outcol->data_type) { case SQLT_RSET: outcol->pstmt = oci_parse(statement->conn,0,0); outcol->stmtid = outcol->pstmt->id; define_type = SQLT_RSET; outcol->is_cursor = 1; outcol->storage_size4 = -1; outcol->retlen = -1; dynamic = OCI_DEFAULT; buf = &(outcol->pstmt->pStmt); break; case SQLT_RDD: /* ROWID */ case SQLT_BLOB: /* binary LOB */ case SQLT_CLOB: /* character LOB */ case SQLT_BFILE: /* binary file LOB */ define_type = outcol->data_type; outcol->is_descr = 1; outcol->storage_size4 = -1; dynamic = OCI_DEFAULT; if (outcol->data_type == SQLT_BFILE) { dtype = OCI_DTYPE_FILE; } else if (outcol->data_type == SQLT_RDD ) { dtype = OCI_DTYPE_ROWID; } else { dtype = OCI_DTYPE_LOB; } descr = oci_new_desc(dtype,statement->conn); outcol->descid = descr->id; buf = &(descr->ocidescr); break; case SQLT_LNG: case SQLT_LBI: if (outcol->data_type == SQLT_LBI) { define_type = SQLT_BIN; } else { define_type = SQLT_CHR; } outcol->storage_size4 = OCI_MAX_DATA_SIZE; outcol->piecewise = 1; dynamic = OCI_DYNAMIC_FETCH; break; case SQLT_BIN: default: define_type = SQLT_CHR; if ((outcol->data_type == SQLT_DAT) || (outcol->data_type == SQLT_NUM)#ifdef SQLT_TIMESTAMP || (outcol->data_type == SQLT_TIMESTAMP)#endif#ifdef SQLT_TIMESTAMP_TZ || (outcol->data_type == SQLT_TIMESTAMP_TZ)#endif ) { outcol->storage_size4 = 512; /* XXX this should fit "most" NLS date-formats and Numbers */ } else { outcol->storage_size4++; /* add one for string terminator */ } if (outcol->data_type == SQLT_BIN) { outcol->storage_size4 *= 3; } dynamic = OCI_DEFAULT; buf = outcol->data = (text *) emalloc(outcol->storage_size4); break; } if (dynamic == OCI_DYNAMIC_FETCH) { CALL_OCI_RETURN(error, OCIDefineByPos( statement->pStmt, /* IN/OUT handle to the requested SQL query */ (OCIDefine **)&outcol->pDefine, /* IN/OUT pointer to a pointer to a define handle */ statement->pError, /* IN/OUT An error handle */ counter, /* IN position in the select list */ (dvoid *)NULL, /* IN/OUT pointer to a buffer */ outcol->storage_size4, /* IN The size of each valuep buffer in bytes */ define_type, /* IN The data type */ (dvoid *)&outcol->indicator, /* IN pointer to an indicator variable or arr */ (ub2 *)NULL, /* IN/OUT Pointer to array of length of data fetched */ (ub2 *)NULL, /* OUT Pointer to array of column-level return codes */ OCI_DYNAMIC_FETCH)); /* IN mode (OCI_DEFAULT, OCI_DYNAMIC_FETCH) */ statement->error = oci_error(statement->pError, "OCIDefineByPos", error); } else { CALL_OCI_RETURN(error, OCIDefineByPos( statement->pStmt, /* IN/OUT handle to the requested SQL query */ (OCIDefine **)&outcol->pDefine, /* IN/OUT pointer to a pointer to a define handle */ statement->pError, /* IN/OUT An error handle */ counter, /* IN position in the select list */ (dvoid *)buf, /* IN/OUT pointer to a buffer */ outcol->storage_size4, /* IN The size of each valuep buffer in bytes */ define_type, /* IN The data type */ (dvoid *)&outcol->indicator, /* IN pointer to an indicator variable or arr */ (ub2 *)&outcol->retlen, /* IN/OUT Pointer to array of length of data fetched */ (ub2 *)&outcol->retcode, /* OUT Pointer to array of column-level return codes */ OCI_DEFAULT)); /* IN mode (OCI_DEFAULT, OCI_DYNAMIC_FETCH) */ statement->error = oci_error(statement->pError, "OCIDefineByPos", error); } if (statement->error) { oci_handle_error(statement->conn, statement->error); return 0; /* XXX we loose memory!!! */ } } } return 1;}/* }}} *//* {{{ oci_fetch() */static int_oci_column_pre_fetch(void *data TSRMLS_DC){ oci_out_column *col = (oci_out_column *) data; if (col->piecewise) { col->retlen4 = 0; } return 0;}static intoci_fetch(oci_statement *statement, ub4 nrows, char *func TSRMLS_DC){ int i; oci_out_column *column; if (statement->columns) { zend_hash_apply(statement->columns, (apply_func_t) _oci_column_pre_fetch TSRMLS_CC); } CALL_OCI_RETURN(statement->error, OCIStmtFetch( statement->pStmt, statement->pError, nrows, OCI_FETCH_NEXT, OCI_DEFAULT)); if ((statement->error == OCI_NO_DATA) || (nrows == 0)) { if (statement->last_query == 0) { /* reset define-list for refcursors */ if (statement->columns) { zend_hash_destroy(statement->columns); efree(statement->columns); statement->columns = 0; statement->ncolumns = 0; } statement->executed = 0; } statement->error = 0; /* OCI_NO_DATA is NO error for us!!! */ statement->has_data = 0; return 0; } while (statement->error == OCI_NEED_DATA) { for (i = 0; i < statement->ncolumns; i++) { column = oci_get_col(statement, i + 1, 0); if (column->piecewise) { if (! column->data) { column->data = (text *) emalloc(OCI_PIECE_SIZE); } else { column->data = erealloc(column->data,column->retlen4 + OCI_PIECE_SIZE); } column->cb_retlen = OCI_PIECE_SIZE; CALL_OCI(OCIStmtSetPieceInfo( (void *) column->pDefine, OCI_HTYPE_DEFINE, statement->pError, ((char*)column->data) + column->retlen4, &(column->cb_retlen), OCI_NEXT_PIECE, &column->indicator, &column->retcode)); } } CALL_OCI_RETURN(statement->error, OCIStmtFetch( statement->pStmt, statement->pError, nrows, OCI_FETCH_NEXT, OCI_DEFAULT)); for (i = 0; i < statement->ncolumns; i++) { column = oci_get_col(statement, i + 1, 0); if (column->piecewise) { column->retlen4 += column->cb_retlen; } } } if (statement->error == OCI_SUCCESS_WITH_INFO || statement->error == OCI_SUCCESS) { statement->has_data = 1; /* do the stuff needed for OCIDefineByName */ for (i = 0; i < statement->ncolumns; i++) { column = oci_get_col(statement, i + 1, 0); if (column == NULL) { continue; } if (! column->define) { continue; } zval_dtor(column->define->zval); _oci_make_zval(column->define->zval,statement,column,"OCIFetch",0 TSRMLS_CC); } return 1; } oci_error(statement->pError, func, statement->error); oci_handle_error(statement->conn, statement->error); statement->has_data = 0; return 0;}/* }}} *//* {{{ oci_loadlob() */#define LOBREADSIZE 1048576l /* 1MB */static intoci_loadlob(oci_connection *connection, oci_descriptor *mydescr, char **buffer,ub4 *loblen){ ub4 siz = 0; ub4 readlen = 0; char *buf; TSRMLS_FETCH(); *loblen = 0; if (Z_TYPE_P(mydescr) == OCI_DTYPE_FILE) { CALL_OCI_RETURN(connection->error, OCILobFileOpen( connection->pServiceContext, connection->pError, mydescr->ocidescr, OCI_FILE_READONLY)); if (connection->error) { oci_error(connection->pError, "OCILobFileOpen",connection->error); oci_handle_error(connection, connection->error); return -1; } } CALL_OCI_RETURN(connection->error, OCILobGetLength( connection->pServiceContext, connection->pError, mydescr->ocidescr, &readlen)); if (connection->error) { oci_error(connection->pError, "OCILobGetLength",connection->error); oci_handle_error(connection, connection->error); return -1; } if (readlen == 0) { return 0; } buf = emalloc(readlen + 1); while (readlen > 0) { /* thies loop should not be entered on readlen == 0 */ CALL_OCI_RETURN(connection->error, OCILobRead( connection->pServiceContext, connection->pError, mydescr->ocidescr, &readlen, /* IN/OUT bytes toread/read */ siz + 1, /* offset (starts with 1) */ (dvoid *) ((char *) buf + siz), readlen, /* size of buffer */ (dvoid *)0, (OCICallbackLobRead) 0, /* callback... */ (ub2) connection->session->charsetId, /* The character set ID of the buffer data. */ (ub1) SQLCS_IMPLICIT)); /* The character set form of the buffer data. */ siz += readlen; readlen = LOBREADSIZE; if (connection->error == OCI_NEED_DATA) { buf = erealloc(buf,siz + LOBREADSIZE + 1); continue; } else { break; } } if (connection->error) { oci_error(connection->pError, "OCILobRead", connection->error); oci_handle_error(connection, connection->error); efree(buf); return -1; } if (Z_TYPE_P(mydescr) == OCI_DTYPE_FILE) { CALL_OCI_RETURN(connection->error, OCILobFileClose( connection->pServiceContext, connection->pError, mydescr->ocidescr)); if (connection->error) { oci_error(connection->pError, "OCILobFileClose", connection->error); oci_handle_error(connection, connection->error); efree(buf); return -1; } } buf = erealloc(buf,siz+1); buf[ siz ] = 0; *buffer = buf; *loblen = siz;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -