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

MySQL数据库

开发平台:

Visual C++

  1. /******************************************************
  2. Update of a row
  3. (c) 1996 Innobase Oy
  4. Created 12/27/1996 Heikki Tuuri
  5. *******************************************************/
  6. #include "mtr0log.h"
  7. #include "trx0trx.h"
  8. #include "trx0undo.h"
  9. #include "row0row.h"
  10. #include "btr0sea.h"
  11. /*************************************************************************
  12. Creates an update vector object. */
  13. UNIV_INLINE
  14. upd_t*
  15. upd_create(
  16. /*=======*/
  17. /* out, own: update vector object */
  18. ulint n, /* in: number of fields */
  19. mem_heap_t* heap) /* in: heap from which memory allocated */
  20. {
  21. upd_t* update;
  22. ulint i;
  23. update = mem_heap_alloc(heap, sizeof(upd_t));
  24. update->info_bits = 0;
  25. update->n_fields = n;
  26. update->fields = mem_heap_alloc(heap, sizeof(upd_field_t) * n);
  27. for (i = 0; i < n; i++) {
  28. update->fields[i].extern_storage = 0;
  29. }
  30. return(update);
  31. }
  32. /*************************************************************************
  33. Returns the number of fields in the update vector == number of columns
  34. to be updated by an update vector. */
  35. UNIV_INLINE
  36. ulint
  37. upd_get_n_fields(
  38. /*=============*/
  39. /* out: number of fields */
  40. upd_t* update) /* in: update vector */
  41. {
  42. ut_ad(update);
  43. return(update->n_fields);
  44. }
  45. /*************************************************************************
  46. Returns the nth field of an update vector. */
  47. UNIV_INLINE
  48. upd_field_t*
  49. upd_get_nth_field(
  50. /*==============*/
  51. /* out: update vector field */
  52. upd_t* update, /* in: update vector */
  53. ulint n) /* in: field position in update vector */
  54. {
  55. ut_ad(update);
  56. ut_ad(n < update->n_fields);
  57. return(update->fields + n);
  58. }
  59. /*************************************************************************
  60. Sets an index field number to be updated by an update vector field. */
  61. UNIV_INLINE
  62. void
  63. upd_field_set_field_no(
  64. /*===================*/
  65. upd_field_t* upd_field, /* in: update vector field */
  66. ulint field_no, /* in: field number in a clustered
  67. index */
  68. dict_index_t* index, /* in: index */
  69. trx_t* trx) /* in: transaction */
  70. {
  71. upd_field->field_no = field_no;
  72. if (field_no >= dict_index_get_n_fields(index)) {
  73. fprintf(stderr,
  74. "InnoDB: Error: trying to access field %lu in ",
  75. (ulong) field_no);
  76. dict_index_name_print(stderr, trx, index);
  77. fprintf(stderr, "n"
  78. "InnoDB: but index only has %lu fieldsn",
  79. (ulong) dict_index_get_n_fields(index));
  80. }
  81. dtype_copy(dfield_get_type(&(upd_field->new_val)),
  82. dict_index_get_nth_type(index, field_no));
  83. }
  84. /*************************************************************************
  85. Updates the trx id and roll ptr field in a clustered index record when
  86. a row is updated or marked deleted. */
  87. UNIV_INLINE
  88. void
  89. row_upd_rec_sys_fields(
  90. /*===================*/
  91. rec_t* rec, /* in: record */
  92. dict_index_t* index, /* in: clustered index */
  93. trx_t* trx, /* in: transaction */
  94. dulint roll_ptr)/* in: roll ptr of the undo log record */
  95. {
  96. ut_ad(index->type & DICT_CLUSTERED);
  97. #ifdef UNIV_SYNC_DEBUG
  98. ut_ad(!buf_block_align(rec)->is_hashed
  99. || rw_lock_own(&btr_search_latch, RW_LOCK_EX));
  100. #endif /* UNIV_SYNC_DEBUG */
  101. row_set_rec_trx_id(rec, index, trx->id);
  102. row_set_rec_roll_ptr(rec, index, roll_ptr);
  103. }