| 1056 | } |
| 1057 | |
| 1058 | bool table_storage::update_tuple(Oid table_id, ItemPointer tid, HeapTuple new_tuple) |
| 1059 | { |
| 1060 | auto& table_data = get_table_data(table_id); |
| 1061 | TupleDesc tupdesc = table_data.get_tuple_descriptor(); |
| 1062 | |
| 1063 | try { |
| 1064 | const auto row_number = utils::tid_to_row_number(tid); |
| 1065 | |
| 1066 | // Verify row exists |
| 1067 | if (row_number >= table_data.num_rows()) { |
| 1068 | ereport( |
| 1069 | ERROR, |
| 1070 | (errcode(ERRCODE_INTERNAL_ERROR), |
| 1071 | errmsg("Row number %zu out of range for table %s", row_number, table_data.get_table_name().c_str()))); |
| 1072 | return false; |
| 1073 | } |
| 1074 | |
| 1075 | // Extract values from HeapTuple |
| 1076 | std::vector<Datum> values(tupdesc->natts, 0); |
| 1077 | std::vector<uint8_t> nulls(tupdesc->natts, 0); |
| 1078 | heap_deform_tuple(new_tuple, tupdesc, values.data(), reinterpret_cast<bool*>(nulls.data())); |
| 1079 | |
| 1080 | icm::string_map<nd::array> row; |
| 1081 | ::convert_pg_to_nd(table_data, values, nulls, new_tuple->t_len, row); |
| 1082 | table_data.add_update_row(row_number, std::move(row)); |
| 1083 | |
| 1084 | return true; |
| 1085 | } catch (const base::exception& e) { |
| 1086 | ereport(ERROR, (errcode(ERRCODE_INTERNAL_ERROR), errmsg("Failed to update tuple: %s", e.what()))); |
| 1087 | return false; |
| 1088 | } |
| 1089 | } |
| 1090 | |
| 1091 | bool table_storage::fetch_tuple(Oid table_id, ItemPointer tid, TupleTableSlot* slot) |
| 1092 | { |
no test coverage detected