data0type.ic
上传用户:tsgydb
上传日期:2007-04-14
资源大小:10674k
文件大小:5k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /******************************************************
  2. Data types
  3. (c) 1996 Innobase Oy
  4. Created 1/16/1996 Heikki Tuuri
  5. *******************************************************/
  6. #include "mach0data.h"
  7. /*************************************************************************
  8. Sets a data type structure. */
  9. UNIV_INLINE
  10. void
  11. dtype_set(
  12. /*======*/
  13. dtype_t* type, /* in: type struct to init */
  14. ulint mtype, /* in: main data type */
  15. ulint prtype, /* in: precise type */
  16. ulint len, /* in: length of type */
  17. ulint prec) /* in: precision of type */
  18. {
  19. ut_ad(type);
  20. ut_ad(mtype <= DATA_MTYPE_MAX);
  21. type->mtype = mtype;
  22. type->prtype = prtype;
  23. type->len = len;
  24. type->prec = prec;
  25. ut_ad(dtype_validate(type));
  26. }
  27. /*************************************************************************
  28. Copies a data type structure. */
  29. UNIV_INLINE
  30. void
  31. dtype_copy(
  32. /*=======*/
  33. dtype_t* type1, /* in: type struct to copy to */
  34. dtype_t* type2) /* in: type struct to copy from */
  35. {
  36. *type1 = *type2;
  37. ut_ad(dtype_validate(type1));
  38. }
  39. /*************************************************************************
  40. Gets the SQL main data type. */
  41. UNIV_INLINE
  42. ulint
  43. dtype_get_mtype(
  44. /*============*/
  45. dtype_t* type)
  46. {
  47. ut_ad(type);
  48. return(type->mtype);
  49. }
  50. /*************************************************************************
  51. Gets the precise data type. */
  52. UNIV_INLINE
  53. ulint
  54. dtype_get_prtype(
  55. /*=============*/
  56. dtype_t* type)
  57. {
  58. ut_ad(type);
  59. return(type->prtype);
  60. }
  61. /*************************************************************************
  62. Gets the type length. */
  63. UNIV_INLINE
  64. ulint
  65. dtype_get_len(
  66. /*==========*/
  67. dtype_t* type)
  68. {
  69. ut_ad(type);
  70. return(type->len);
  71. }
  72. /*************************************************************************
  73. Gets the type precision. */
  74. UNIV_INLINE
  75. ulint
  76. dtype_get_prec(
  77. /*===========*/
  78. dtype_t* type)
  79. {
  80. ut_ad(type);
  81. return(type->prec);
  82. }
  83. /*************************************************************************
  84. Gets the padding character code for the type. */
  85. UNIV_INLINE
  86. ulint
  87. dtype_get_pad_char(
  88. /*===============*/
  89. /* out: padding character code, or
  90. ULINT_UNDEFINED if no padding specified */
  91. dtype_t* type) /* in: type */
  92. {
  93. if (type->mtype == DATA_CHAR) {
  94. /* space is the padding character for all char strings */
  95. return((ulint)' ');
  96. }
  97. ut_ad((type->mtype == DATA_BINARY) || (type->mtype == DATA_VARCHAR));
  98. /* No padding specified */
  99. return(ULINT_UNDEFINED);
  100. }
  101. /*************************************************************************
  102. Transforms the character code so that it is ordered appropriately for the
  103. language. */
  104. UNIV_INLINE
  105. ulint
  106. dtype_collate(
  107. /*==========*/
  108. /* out: collation order position */
  109. dtype_t* type, /* in: type */
  110. ulint code) /* in: character code stored in database
  111. record */
  112. {
  113. ut_ad((type->mtype == DATA_CHAR) || (type->mtype == DATA_VARCHAR));
  114. return(toupper(code));
  115. }
  116. /**************************************************************************
  117. Stores to a type the information which determines its alphabetical
  118. ordering. */
  119. UNIV_INLINE
  120. void
  121. dtype_store_for_order_and_null_size(
  122. /*================================*/
  123. byte* buf, /* in: buffer for DATA_ORDER_NULL_TYPE_BUF_SIZE
  124. bytes */
  125. dtype_t* type) /* in: type struct */
  126. {
  127. ut_ad(4 == DATA_ORDER_NULL_TYPE_BUF_SIZE);
  128. ut_ad(type->prtype < 256);
  129. buf[0] = (byte)(type->mtype & 0xFF);
  130. buf[1] = (byte)(type->prtype & 0xFF);
  131. mach_write_to_2(buf + 2, type->len & 0xFFFF);
  132. }
  133. /**************************************************************************
  134. Reads of a type the stored information which determines its alphabetical
  135. ordering. */
  136. UNIV_INLINE
  137. void
  138. dtype_read_for_order_and_null_size(
  139. /*===============================*/
  140. dtype_t* type, /* in: type struct */
  141. byte* buf) /* in: buffer for type order info */
  142. {
  143. ut_ad(4 == DATA_ORDER_NULL_TYPE_BUF_SIZE);
  144. type->mtype = buf[0];
  145. type->prtype = buf[1];
  146. type->len = mach_read_from_2(buf + 2);
  147. }
  148. /***************************************************************************
  149. Returns the size of a fixed size data type, 0 if not a fixed size type. */
  150. UNIV_INLINE
  151. ulint
  152. dtype_get_fixed_size(
  153. /*=================*/
  154. /* out: fixed size, or 0 */
  155. dtype_t* type) /* in: type */
  156. {
  157. ulint mtype;
  158. mtype = dtype_get_mtype(type);
  159. switch (mtype) {
  160. case DATA_CHAR:
  161. case DATA_FIXBINARY:
  162. case DATA_INT:
  163. case DATA_FLOAT:
  164. case DATA_DOUBLE:
  165. case DATA_MYSQL:
  166. return(dtype_get_len(type));
  167. case DATA_SYS:  if (type->prtype == DATA_ROW_ID) {
  168. return(DATA_ROW_ID_LEN);
  169. } else {
  170. return(0);
  171. }
  172. case DATA_VARCHAR:
  173. case DATA_BINARY:
  174. case DATA_DECIMAL:
  175. case DATA_VARMYSQL:
  176. case DATA_BLOB:
  177. return(0); 
  178. default: ut_a(0);
  179. }
  180. return(0);
  181. }
  182. /***************************************************************************
  183. Returns a stored SQL NULL size for a type. For fixed length types it is
  184. the fixed length of the type, otherwise 0. */
  185. UNIV_INLINE
  186. ulint
  187. dtype_get_sql_null_size(
  188. /*====================*/
  189. /* out: SQL null storage size */
  190. dtype_t* type) /* in: type */
  191. {
  192. return(dtype_get_fixed_size(type));
  193. }
  194. /***************************************************************************
  195. Returns TRUE if a type is of a fixed size. */
  196. UNIV_INLINE
  197. ibool
  198. dtype_is_fixed_size(
  199. /*================*/
  200. /* out: TRUE if fixed size */
  201. dtype_t* type) /* in: type */
  202. {
  203. ulint size;
  204. size = dtype_get_fixed_size(type);
  205. if (size) {
  206. return(TRUE);
  207. }
  208. return(FALSE);
  209. }