data0type.ic
上传用户:tsgydb
上传日期:2007-04-14
资源大小:10674k
文件大小:5k
- /******************************************************
- Data types
- (c) 1996 Innobase Oy
- Created 1/16/1996 Heikki Tuuri
- *******************************************************/
- #include "mach0data.h"
- /*************************************************************************
- Sets a data type structure. */
- UNIV_INLINE
- void
- dtype_set(
- /*======*/
- dtype_t* type, /* in: type struct to init */
- ulint mtype, /* in: main data type */
- ulint prtype, /* in: precise type */
- ulint len, /* in: length of type */
- ulint prec) /* in: precision of type */
- {
- ut_ad(type);
- ut_ad(mtype <= DATA_MTYPE_MAX);
-
- type->mtype = mtype;
- type->prtype = prtype;
- type->len = len;
- type->prec = prec;
- ut_ad(dtype_validate(type));
- }
- /*************************************************************************
- Copies a data type structure. */
- UNIV_INLINE
- void
- dtype_copy(
- /*=======*/
- dtype_t* type1, /* in: type struct to copy to */
- dtype_t* type2) /* in: type struct to copy from */
- {
- *type1 = *type2;
- ut_ad(dtype_validate(type1));
- }
- /*************************************************************************
- Gets the SQL main data type. */
- UNIV_INLINE
- ulint
- dtype_get_mtype(
- /*============*/
- dtype_t* type)
- {
- ut_ad(type);
- return(type->mtype);
- }
- /*************************************************************************
- Gets the precise data type. */
- UNIV_INLINE
- ulint
- dtype_get_prtype(
- /*=============*/
- dtype_t* type)
- {
- ut_ad(type);
- return(type->prtype);
- }
- /*************************************************************************
- Gets the type length. */
- UNIV_INLINE
- ulint
- dtype_get_len(
- /*==========*/
- dtype_t* type)
- {
- ut_ad(type);
- return(type->len);
- }
- /*************************************************************************
- Gets the type precision. */
- UNIV_INLINE
- ulint
- dtype_get_prec(
- /*===========*/
- dtype_t* type)
- {
- ut_ad(type);
- return(type->prec);
- }
- /*************************************************************************
- Gets the padding character code for the type. */
- UNIV_INLINE
- ulint
- dtype_get_pad_char(
- /*===============*/
- /* out: padding character code, or
- ULINT_UNDEFINED if no padding specified */
- dtype_t* type) /* in: type */
- {
- if (type->mtype == DATA_CHAR) {
- /* space is the padding character for all char strings */
- return((ulint)' ');
- }
- ut_ad((type->mtype == DATA_BINARY) || (type->mtype == DATA_VARCHAR));
- /* No padding specified */
- return(ULINT_UNDEFINED);
- }
- /*************************************************************************
- Transforms the character code so that it is ordered appropriately for the
- language. */
- UNIV_INLINE
- ulint
- dtype_collate(
- /*==========*/
- /* out: collation order position */
- dtype_t* type, /* in: type */
- ulint code) /* in: character code stored in database
- record */
- {
- ut_ad((type->mtype == DATA_CHAR) || (type->mtype == DATA_VARCHAR));
- return(toupper(code));
- }
- /**************************************************************************
- Stores to a type the information which determines its alphabetical
- ordering. */
- UNIV_INLINE
- void
- dtype_store_for_order_and_null_size(
- /*================================*/
- byte* buf, /* in: buffer for DATA_ORDER_NULL_TYPE_BUF_SIZE
- bytes */
- dtype_t* type) /* in: type struct */
- {
- ut_ad(4 == DATA_ORDER_NULL_TYPE_BUF_SIZE);
- ut_ad(type->prtype < 256);
-
- buf[0] = (byte)(type->mtype & 0xFF);
- buf[1] = (byte)(type->prtype & 0xFF);
- mach_write_to_2(buf + 2, type->len & 0xFFFF);
- }
- /**************************************************************************
- Reads of a type the stored information which determines its alphabetical
- ordering. */
- UNIV_INLINE
- void
- dtype_read_for_order_and_null_size(
- /*===============================*/
- dtype_t* type, /* in: type struct */
- byte* buf) /* in: buffer for type order info */
- {
- ut_ad(4 == DATA_ORDER_NULL_TYPE_BUF_SIZE);
-
- type->mtype = buf[0];
- type->prtype = buf[1];
- type->len = mach_read_from_2(buf + 2);
- }
- /***************************************************************************
- Returns the size of a fixed size data type, 0 if not a fixed size type. */
- UNIV_INLINE
- ulint
- dtype_get_fixed_size(
- /*=================*/
- /* out: fixed size, or 0 */
- dtype_t* type) /* in: type */
- {
- ulint mtype;
- mtype = dtype_get_mtype(type);
- switch (mtype) {
- case DATA_CHAR:
- case DATA_FIXBINARY:
- case DATA_INT:
- case DATA_FLOAT:
- case DATA_DOUBLE:
- case DATA_MYSQL:
- return(dtype_get_len(type));
- case DATA_SYS: if (type->prtype == DATA_ROW_ID) {
- return(DATA_ROW_ID_LEN);
- } else {
- return(0);
- }
- case DATA_VARCHAR:
- case DATA_BINARY:
- case DATA_DECIMAL:
- case DATA_VARMYSQL:
- case DATA_BLOB:
- return(0);
- default: ut_a(0);
- }
- return(0);
- }
- /***************************************************************************
- Returns a stored SQL NULL size for a type. For fixed length types it is
- the fixed length of the type, otherwise 0. */
- UNIV_INLINE
- ulint
- dtype_get_sql_null_size(
- /*====================*/
- /* out: SQL null storage size */
- dtype_t* type) /* in: type */
- {
- return(dtype_get_fixed_size(type));
- }
- /***************************************************************************
- Returns TRUE if a type is of a fixed size. */
- UNIV_INLINE
- ibool
- dtype_is_fixed_size(
- /*================*/
- /* out: TRUE if fixed size */
- dtype_t* type) /* in: type */
- {
- ulint size;
- size = dtype_get_fixed_size(type);
- if (size) {
- return(TRUE);
- }
- return(FALSE);
- }