row0mysql.ic
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:3k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /******************************************************
  2. MySQL interface for Innobase
  3. (C) 2001 Innobase Oy
  4. Created 1/23/2001 Heikki Tuuri
  5. *******************************************************/
  6. /***********************************************************************
  7. Stores a variable-length field (like VARCHAR) length to dest, in the
  8. MySQL format. No real var implemented in MySQL yet! */
  9. UNIV_INLINE
  10. byte*
  11. row_mysql_store_var_len(
  12. /*====================*/
  13. /* out: dest + 2 */
  14. byte* dest, /* in: where to store */
  15. ulint len __attribute__((unused)))  /* in: length, must fit in two
  16.                                                  bytes */
  17. {
  18. ut_ad(len < 256 * 256);
  19. /*
  20. mach_write_to_2_little_endian(dest, len);
  21. return(dest + 2);
  22. */
  23. return(dest); /* No real var implemented in MySQL yet! */
  24. }
  25. /***********************************************************************
  26. Reads a MySQL format variable-length field (like VARCHAR) length and
  27. returns pointer to the field data. No real var implemented in MySQL yet! */
  28. UNIV_INLINE
  29. byte*
  30. row_mysql_read_var_ref(
  31. /*===================*/
  32. /* out: field + 2 */
  33. ulint* len, /* out: variable-length field length; does not work
  34. yet! */
  35. byte* field) /* in: field */
  36. {
  37. /*
  38. *len = mach_read_from_2_little_endian(field);
  39. return(field + 2);
  40. */
  41. UT_NOT_USED(len);
  42. return(field); /* No real var implemented in MySQL yet! */
  43. }
  44. /******************************************************************
  45. Stores a non-SQL-NULL field given in the MySQL format in the Innobase
  46. format. */
  47. UNIV_INLINE
  48. void
  49. row_mysql_store_col_in_innobase_format(
  50. /*===================================*/
  51. dfield_t* dfield, /* in/out: dfield */
  52. byte* buf, /* in/out: buffer for the converted
  53. value; this must be at least col_len
  54. long! */
  55. byte* mysql_data, /* in: MySQL column value, not
  56. SQL NULL; NOTE that dfield may also
  57. get a pointer to mysql_data,
  58. therefore do not discard this as long
  59. as dfield is used! */
  60. ulint col_len, /* in: MySQL column length */
  61. ulint type, /* in: data type */
  62. ulint is_unsigned) /* in: != 0 if unsigned integer type */
  63. {
  64. byte* ptr  = mysql_data;
  65. if (type == DATA_INT) {
  66. /* Store integer data in Innobase in a big-endian format,
  67. sign bit negated */
  68. ptr = buf + col_len;
  69. for (;;) {
  70. ptr--;
  71. *ptr = *mysql_data;
  72. if (ptr == buf) {
  73. break;
  74. }
  75. mysql_data++;
  76. }
  77. if (!is_unsigned) {
  78. *ptr = (byte) (*ptr ^ 128);
  79. }
  80. } else if (type == DATA_VARCHAR || type == DATA_VARMYSQL
  81. || type == DATA_BINARY) {
  82. /* Remove trailing spaces. */
  83. /* Handle UCS2 strings differently.  As no new
  84. collations will be introduced in 4.1, we hardcode the
  85. charset-collation codes here.  In 5.0, the logic will
  86. be based on mbminlen. */
  87. ulint cset = dtype_get_charset_coll(
  88. dtype_get_prtype(dfield_get_type(dfield)));
  89. ptr = row_mysql_read_var_ref(&col_len, mysql_data);
  90. if (cset == 35/*ucs2_general_ci*/
  91. || cset == 90/*ucs2_bin*/
  92. || (cset >= 128/*ucs2_unicode_ci*/
  93. && cset <= 144/*ucs2_persian_ci*/)) {
  94. /* space=0x0020 */
  95. /* Trim "half-chars", just in case. */
  96. col_len &= ~1;
  97. while (col_len >= 2 && ptr[col_len - 2] == 0x00
  98. && ptr[col_len - 1] == 0x20) {
  99. col_len -= 2;
  100. }
  101. } else {
  102. /* space=0x20 */
  103. while (col_len > 0 && ptr[col_len - 1] == 0x20) {
  104. col_len--;
  105. }
  106. }
  107. } else if (type == DATA_BLOB) {
  108. ptr = row_mysql_read_blob_ref(&col_len, mysql_data, col_len);
  109. }
  110. dfield_set_data(dfield, ptr, col_len);
  111. }