row0upd.ic
上传用户:tsgydb
上传日期:2007-04-14
资源大小:10674k
文件大小: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. update = mem_heap_alloc(heap, sizeof(upd_t));
  23. update->info_bits = 0;
  24. update->n_fields = n;
  25. update->fields = mem_heap_alloc(heap, sizeof(upd_field_t) * n);
  26. return(update);
  27. }
  28. /*************************************************************************
  29. Returns the number of fields in the update vector == number of columns
  30. to be updated by an update vector. */
  31. UNIV_INLINE
  32. ulint
  33. upd_get_n_fields(
  34. /*=============*/
  35. /* out: number of fields */
  36. upd_t* update) /* in: update vector */
  37. {
  38. ut_ad(update);
  39. return(update->n_fields);
  40. }
  41. /*************************************************************************
  42. Returns the nth field of an update vector. */
  43. UNIV_INLINE
  44. upd_field_t*
  45. upd_get_nth_field(
  46. /*==============*/
  47. /* out: update vector field */
  48. upd_t* update, /* in: update vector */
  49. ulint n) /* in: field position in update vector */
  50. {
  51. ut_ad(update);
  52. ut_ad(n < update->n_fields);
  53. return(update->fields + n);
  54. }
  55. /*************************************************************************
  56. Sets the clustered index field number to be updated by an update vector
  57. field. */
  58. UNIV_INLINE
  59. void
  60. upd_field_set_field_no(
  61. /*===================*/
  62. upd_field_t* upd_field, /* in: update vector field */
  63. ulint field_no, /* in: field number in a clustered
  64. index */
  65. dict_index_t* index) /* in: clustered index */
  66. {
  67. ut_ad(index->type & DICT_CLUSTERED);
  68. upd_field->field_no = field_no;
  69. dtype_copy(dfield_get_type(&(upd_field->new_val)),
  70. dict_index_get_nth_type(index, field_no));
  71. }
  72. /*************************************************************************
  73. Updates the trx id and roll ptr field in a clustered index record when
  74. a row is updated or marked deleted. */
  75. UNIV_INLINE
  76. void
  77. row_upd_rec_sys_fields(
  78. /*===================*/
  79. rec_t* rec, /* in: record */
  80. dict_index_t* index, /* in: clustered index */
  81. trx_t* trx, /* in: transaction */
  82. dulint roll_ptr)/* in: roll ptr of the undo log record */
  83. {
  84. ut_ad(index->type & DICT_CLUSTERED);
  85. ut_ad(!buf_block_align(rec)->is_hashed
  86. || rw_lock_own(&btr_search_latch, RW_LOCK_EX));
  87. row_set_rec_trx_id(rec, index, trx->id);
  88. row_set_rec_roll_ptr(rec, index, roll_ptr);
  89. }