row0mysql.ic
上传用户:tsgydb
上传日期:2007-04-14
资源大小:10674k
文件大小: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) /* in: length, must fit in two bytes */
  16. {
  17. ut_ad(len < 256 * 256);
  18. /*
  19. mach_write_to_2_little_endian(dest, len);
  20. return(dest + 2);
  21. */
  22. return(dest); /* No real var implemented in MySQL yet! */
  23. }
  24. /***********************************************************************
  25. Reads a MySQL format variable-length field (like VARCHAR) length and
  26. returns pointer to the field data. No real var implemented in MySQL yet! */
  27. UNIV_INLINE
  28. byte*
  29. row_mysql_read_var_ref(
  30. /*===================*/
  31. /* out: field + 2 */
  32. ulint* len, /* out: variable-length field length; does not work
  33. yet! */
  34. byte* field) /* in: field */
  35. {
  36. /*
  37. *len = mach_read_from_2_little_endian(field);
  38. return(field + 2);
  39. */
  40. UT_NOT_USED(len);
  41. return(field); /* No real var implemented in MySQL yet! */
  42. }
  43. /******************************************************************
  44. Stores a non-SQL-NULL field given in the MySQL format in the Innobase
  45. format. */
  46. UNIV_INLINE
  47. void
  48. row_mysql_store_col_in_innobase_format(
  49. /*===================================*/
  50. dfield_t* dfield, /* in/out: dfield */
  51. byte* buf, /* in/out: buffer for the converted
  52. value */
  53. byte* mysql_data, /* in: MySQL column value, not
  54. SQL NULL; NOTE that dfield may also
  55. get a pointer to mysql_data,
  56. therefore do not discard this as long
  57. as dfield is used! */
  58. ulint col_len, /* in: MySQL column length */
  59. ulint type, /* in: data type */
  60. ulint is_unsigned) /* in: != 0 if unsigned integer type */
  61. {
  62. byte* ptr  = mysql_data;
  63. if (type == DATA_INT) {
  64. /* Store integer data in Innobase in a big-endian format,
  65. sign bit negated */
  66. ptr = buf + col_len;
  67. for (;;) {
  68. ptr--;
  69. *ptr = *mysql_data;
  70. if (ptr == buf) {
  71. break;
  72. }
  73. mysql_data++;
  74. }
  75. if (!is_unsigned) {
  76. *ptr = (byte) (*ptr ^ 128);
  77. }
  78. } else if (type == DATA_VARCHAR || type == DATA_VARMYSQL
  79. || type == DATA_BINARY) {
  80. ptr = row_mysql_read_var_ref(&col_len, mysql_data);
  81. /* Remove trailing spaces */
  82. while (col_len > 0 && ptr[col_len - 1] == ' ') {
  83. col_len--;
  84. } else if (type == DATA_BLOB) {
  85. ptr = row_mysql_read_blob_ref(&col_len, mysql_data, col_len);
  86. }
  87. dfield_set_data(dfield, ptr, col_len);
  88. }