boolean OCI_ColumnDescribe ( OCI_Column *col, OCI_Connection *con, OCI_Statement *stmt, void *handle, int index, int ptype ) { void *param = NULL; boolean res = TRUE; /* get descriptor */ if (ptype == OCI_DESC_COLLECTION) { OCI_CALL1 ( res, con, stmt, OCIAttrGet((dvoid *) handle, (ub4) OCI_DTYPE_PARAM, (dvoid *) ¶m, (ub4 *) NULL, (ub4) OCI_ATTR_COLLECTION_ELEMENT, con->err) ) } else { ub4 htype = 0; if (ptype == OCI_DESC_RESULTSET) { htype = OCI_HTYPE_STMT; } else { htype = OCI_DTYPE_PARAM; } OCI_CALL1 ( res, con, stmt, OCIParamGet((dvoid *) handle, htype, con->err, (void**) ¶m, (ub4) index) ) } /* sql code */ OCI_CALL1 ( res, con, stmt, OCIAttrGet((dvoid *) param, (ub4) OCI_DTYPE_PARAM, (dvoid *) &col->ocode, (ub4 *) NULL, (ub4) OCI_ATTR_DATA_TYPE, con->err) ) /* size */ OCI_CALL1 ( res, con, stmt, OCIAttrGet((dvoid *) param, (ub4) OCI_DTYPE_PARAM, (dvoid *) &col->size, (ub4 *) NULL, (ub4) OCI_ATTR_DATA_SIZE, con->err) ) /* scale */ OCI_CALL1 ( res, con, stmt, OCIAttrGet((dvoid *) param, (ub4) OCI_DTYPE_PARAM, (dvoid *) &col->scale, (ub4 *) NULL, (ub4) OCI_ATTR_SCALE, con->err) ) /* precision */ if (ptype == OCI_DESC_RESULTSET) { sb2 prec = 0; OCI_CALL1 ( res, con, stmt, OCIAttrGet((dvoid *) param, (ub4) OCI_DTYPE_PARAM, (dvoid *) &prec, (ub4 *) NULL, (ub4) OCI_ATTR_PRECISION, con->err) ) col->prec = (sb2) prec; } else { ub1 prec = 0; OCI_CALL1 ( res, con, stmt, OCIAttrGet((dvoid *) param, (ub4) OCI_DTYPE_PARAM, (dvoid *) &prec, (ub4 *) NULL, (ub4) OCI_ATTR_PRECISION, con->err) ) col->prec = (sb2) prec; } /* charset form */ OCI_CALL1 ( res, con, stmt, OCIAttrGet((dvoid *) param, (ub4) OCI_DTYPE_PARAM, (dvoid *) &col->csfrm, (ub4 *) NULL, (ub4) OCI_ATTR_CHARSET_FORM, con->err) ) /* type of column length for string based column */ #if OCI_VERSION_COMPILE >= OCI_9_2 if ((OCILib.version_runtime >= OCI_9_2) && (con->ver_num >= OCI_9_2)) { /* char used - no error checking because on Oracle 9.0, querying this param that is not char/varchar based will cause an error */ OCI_CALL1 ( res, con, stmt, OCIAttrGet((dvoid *) param, (ub4) OCI_DTYPE_PARAM, (dvoid *) &col->charused, (ub4 *) NULL, (ub4) OCI_ATTR_CHAR_USED, con->err) ) } /* char size */ if (col->charused == TRUE) { OCI_CALL1 ( res, con, stmt, OCIAttrGet((dvoid *) param, (ub4) OCI_DTYPE_PARAM, (dvoid *) &col->charsize, (ub4 *) NULL, (ub4) OCI_ATTR_CHAR_SIZE, con->err) ) } if ((OCILib.version_runtime >= OCI_9_0) && (con->ver_num >= OCI_9_0)) { /* fractional time precision for timestamps */ if (col->ocode == SQLT_TIMESTAMP || col->ocode == SQLT_TIMESTAMP_TZ || col->ocode == SQLT_TIMESTAMP_LTZ) { OCI_CALL1 ( res, con, stmt, OCIAttrGet((dvoid *) param, (ub4) OCI_DTYPE_PARAM, (dvoid *) &col->prec, (ub4 *) NULL, (ub4) OCI_ATTR_FSPRECISION, con->err) ) } /* leading and fractional precision for interval */ if (col->ocode == SQLT_INTERVAL_DS || col->ocode == SQLT_INTERVAL_YM) { OCI_CALL1 ( res, con, stmt, OCIAttrGet((dvoid *) param, (ub4) OCI_DTYPE_PARAM, (dvoid *) &col->prec, (ub4 *) NULL, (ub4) OCI_ATTR_LFPRECISION, con->err) ) OCI_CALL1 ( res, con, stmt, OCIAttrGet((dvoid *) param, (ub4) OCI_DTYPE_PARAM, (dvoid *) &col->prec2, (ub4 *) NULL, (ub4) OCI_ATTR_FSPRECISION, con->err) ) } } #endif /* check nullable only for table based column */ if (ptype < OCI_DESC_TYPE) { OCI_CALL1 ( res, con, stmt, OCIAttrGet((dvoid *) param, (ub4) OCI_DTYPE_PARAM, (dvoid *) &col->null, (ub4 *) NULL, (ub4) OCI_ATTR_IS_NULL, con->err) ) } else { col->null = TRUE; } /* name */ if (res == TRUE) { void *ostr = NULL; int osize = 0; ub4 attrname = 0; if (ptype == OCI_DESC_COLLECTION) { attrname = OCI_ATTR_TYPE_NAME; } else { attrname = OCI_ATTR_NAME; } OCI_CALL1 ( res, con, stmt, OCIAttrGet((dvoid *) param, (ub4) OCI_DTYPE_PARAM, (dvoid *) &ostr, (ub4 *) &osize, (ub4) attrname, con->err) ) if ((res == TRUE) && (ostr != NULL)) { col->name = (mtext *) OCI_MemAlloc(OCI_IPC_STRING, sizeof(mtext), (size_t) ((osize / (int) sizeof(omtext)) + 1), TRUE); if (col->name != NULL) { OCI_CopyString(ostr, col->name, &osize, sizeof(omtext), sizeof(mtext)); } else { res = FALSE; } } }
boolean OCI_ColumnDescribe ( OCI_Column *col, OCI_Connection *con, OCI_Statement *stmt, void *handle, int index, int ptype ) { void *param = NULL; boolean res = TRUE; /* get descriptor */ if (OCI_DESC_COLLECTION == ptype) { OCI_CALL1 ( res, con, stmt, OCIAttrGet((dvoid *) handle, (ub4) OCI_DTYPE_PARAM, (dvoid *) ¶m, (ub4 *) NULL, (ub4) OCI_ATTR_COLLECTION_ELEMENT, con->err) ) } else { ub4 htype = (OCI_DESC_RESULTSET == ptype) ? OCI_HTYPE_STMT : OCI_DTYPE_PARAM; OCI_CALL1 ( res, con, stmt, OCIParamGet((dvoid *) handle, htype, con->err, (void**) ¶m, (ub4) index) ) } /* sql code */ OCI_CALL1 ( res, con, stmt, OCIAttrGet((dvoid *) param, (ub4) OCI_DTYPE_PARAM, (dvoid *) &col->sqlcode, (ub4 *) NULL, (ub4) OCI_ATTR_DATA_TYPE, con->err) ) /* when the column is a record from a PL/SQL table, OCI returns an undocumented SQLT code */ #if OCI_VERSION_COMPILE >= OCI_12_1 if (SQLT_UNDOCUMENTED_REC == col->sqlcode) { col->sqlcode = SQLT_REC; } #endif /* size */ OCI_CALL1 ( res, con, stmt, OCIAttrGet((dvoid *) param, (ub4) OCI_DTYPE_PARAM, (dvoid *) &col->size, (ub4 *) NULL, (ub4) OCI_ATTR_DATA_SIZE, con->err) ) /* scale */ OCI_CALL1 ( res, con, stmt, OCIAttrGet((dvoid *) param, (ub4) OCI_DTYPE_PARAM, (dvoid *) &col->scale, (ub4 *) NULL, (ub4) OCI_ATTR_SCALE, con->err) ) /* precision */ if (OCI_DESC_RESULTSET == ptype) { sb2 prec = 0; OCI_CALL1 ( res, con, stmt, OCIAttrGet((dvoid *) param, (ub4) OCI_DTYPE_PARAM, (dvoid *) &prec, (ub4 *) NULL, (ub4) OCI_ATTR_PRECISION, con->err) ) col->prec = (sb2) prec; } else { ub1 prec = 0; OCI_CALL1 ( res, con, stmt, OCIAttrGet((dvoid *) param, (ub4) OCI_DTYPE_PARAM, (dvoid *) &prec, (ub4 *) NULL, (ub4) OCI_ATTR_PRECISION, con->err) ) col->prec = (sb2) prec; } /* charset form */ OCI_CALL1 ( res, con, stmt, OCIAttrGet((dvoid *) param, (ub4) OCI_DTYPE_PARAM, (dvoid *) &col->csfrm, (ub4 *) NULL, (ub4) OCI_ATTR_CHARSET_FORM, con->err) ) /* type of column length for string based column */ #if OCI_VERSION_COMPILE >= OCI_9_2 if ((OCILib.version_runtime >= OCI_9_2) && (con->ver_num >= OCI_9_2)) { /* char used - no error checking because on Oracle 9.0, querying this param that is not text based will cause an error */ OCI_CALL1 ( res, con, stmt, OCIAttrGet((dvoid *) param, (ub4) OCI_DTYPE_PARAM, (dvoid *) &col->charused, (ub4 *) NULL, (ub4) OCI_ATTR_CHAR_USED, con->err) ) } /* char size */ if (col->charused) { OCI_CALL1 ( res, con, stmt, OCIAttrGet((dvoid *) param, (ub4) OCI_DTYPE_PARAM, (dvoid *) &col->charsize, (ub4 *) NULL, (ub4) OCI_ATTR_CHAR_SIZE, con->err) ) } if ((OCILib.version_runtime >= OCI_9_0) && (con->ver_num >= OCI_9_0)) { /* fractional time precision for timestamps */ if ( SQLT_TIMESTAMP == col->sqlcode || SQLT_TIMESTAMP_TZ == col->sqlcode || SQLT_TIMESTAMP_LTZ == col->sqlcode ) { OCI_CALL1 ( res, con, stmt, OCIAttrGet((dvoid *) param, (ub4) OCI_DTYPE_PARAM, (dvoid *) &col->prec, (ub4 *) NULL, (ub4) OCI_ATTR_FSPRECISION, con->err) ) } /* leading and fractional precision for interval */ if (SQLT_INTERVAL_DS == col->sqlcode || SQLT_INTERVAL_YM == col->sqlcode) { OCI_CALL1 ( res, con, stmt, OCIAttrGet((dvoid *) param, (ub4) OCI_DTYPE_PARAM, (dvoid *) &col->prec, (ub4 *) NULL, (ub4) OCI_ATTR_LFPRECISION, con->err) ) OCI_CALL1 ( res, con, stmt, OCIAttrGet((dvoid *) param, (ub4) OCI_DTYPE_PARAM, (dvoid *) &col->prec2, (ub4 *) NULL, (ub4) OCI_ATTR_FSPRECISION, con->err) ) } } #endif #if OCI_VERSION_COMPILE >= OCI_12_1 if ((OCILib.version_runtime >= OCI_12_1) && (con->ver_num >= OCI_12_1)) { if (ptype < OCI_DESC_TYPE) { ub8 value = 0; OCI_CALL1 ( res, con, stmt, OCIAttrGet((dvoid *) param, (ub4) OCI_DTYPE_PARAM, (dvoid *) &value, (ub4 *) NULL, (ub4) OCI_ATTR_COL_PROPERTIES, con->err) ) if (value & OCI_ATTR_COL_PROPERTY_IS_IDENTITY) { col->props |= OCI_CPF_IS_IDENTITY; } if (value & OCI_ATTR_COL_PROPERTY_IS_GEN_ALWAYS) { col->props |= OCI_CPF_IS_GEN_ALWAYS; } if (value & OCI_ATTR_COL_PROPERTY_IS_GEN_BY_DEF_ON_NULL) { col->props |= OCI_CPF_IS_GEN_BY_DEFAULT_ON_NULL; } } }