⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 oci8.c

📁 php-4.4.7学习linux时下载的源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
		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**)&param,						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 + -