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

MySQL数据库

开发平台:

Visual C++

  1. /**********************************************************************
  2. Utilities for converting data from the database file
  3. to the machine format. 
  4. (c) 1995 Innobase Oy
  5. Created 11/28/1995 Heikki Tuuri
  6. ***********************************************************************/
  7. #include "mach0data.h"
  8. #ifdef UNIV_NONINL
  9. #include "mach0data.ic"
  10. #endif
  11. /*************************************************************
  12. Reads a ulint in a compressed form if the log record fully contains it. */
  13. byte*
  14. mach_parse_compressed(
  15. /*==================*/
  16. /* out: pointer to end of the stored field, NULL if
  17. not complete */
  18. byte*   ptr,    /* in: pointer to buffer from where to read */
  19. byte* end_ptr,/* in: pointer to end of the buffer */
  20. ulint* val) /* out: read value (< 2^32) */ 
  21. {
  22. ulint flag;
  23. ut_ad(ptr && end_ptr && val);
  24. if (ptr >= end_ptr) {
  25. return(NULL);
  26. }
  27. flag = mach_read_from_1(ptr);
  28. if (flag < 0x80) {
  29. *val = flag;
  30. return(ptr + 1);
  31. } else if (flag < 0xC0) {
  32. if (end_ptr < ptr + 2) {
  33. return(NULL);
  34. }
  35. *val = mach_read_from_2(ptr) & 0x7FFF;
  36. return(ptr + 2);
  37. } else if (flag < 0xE0) {
  38. if (end_ptr < ptr + 3) {
  39. return(NULL);
  40. }
  41. *val = mach_read_from_3(ptr) & 0x3FFFFF;
  42. return(ptr + 3);
  43. } else if (flag < 0xF0) {
  44. if (end_ptr < ptr + 4) {
  45. return(NULL);
  46. }
  47. *val = mach_read_from_4(ptr) & 0x1FFFFFFF;
  48. return(ptr + 4);
  49. } else {
  50. ut_ad(flag == 0xF0);
  51. if (end_ptr < ptr + 5) {
  52. return(NULL);
  53. }
  54. *val = mach_read_from_4(ptr + 1);
  55. return(ptr + 5);
  56. }
  57. }
  58. /*************************************************************
  59. Reads a dulint in a compressed form if the log record fully contains it. */
  60. byte*
  61. mach_dulint_parse_compressed(
  62. /*=========================*/
  63. /* out: pointer to end of the stored field, NULL if
  64. not complete */
  65. byte*   ptr,    /* in: pointer to buffer from where to read */
  66. byte* end_ptr,/* in: pointer to end of the buffer */
  67. dulint* val) /* out: read value */ 
  68. {
  69. ulint high;
  70. ulint low;
  71. ulint size;
  72. ut_ad(ptr && end_ptr && val);
  73. if (end_ptr < ptr + 5) {
  74. return(NULL);
  75. }
  76. high = mach_read_compressed(ptr);
  77. size = mach_get_compressed_size(high);
  78. ptr += size;
  79. if (end_ptr < ptr + 4) {
  80. return(NULL);
  81. }
  82. low = mach_read_from_4(ptr);
  83. *val = ut_dulint_create(high, low);
  84. return(ptr + 4); 
  85. }