| 434 | } |
| 435 | |
| 436 | pub fn update(&self, table_id: TableId, index_id: IndexId, buffer: &mut [u8]) -> Result<usize, NodesError> { |
| 437 | let stdb = self.relational_db(); |
| 438 | let tx = &mut *self.get_tx()?; |
| 439 | |
| 440 | let (row_len, row_ptr, update_flags) = stdb |
| 441 | .update(tx, table_id, index_id, buffer) |
| 442 | .map(|(gen_cols, row_ref, update_flags)| { |
| 443 | let row_len = Self::project_cols_bsatn(buffer, gen_cols, row_ref); |
| 444 | (row_len, row_ref.pointer(), update_flags) |
| 445 | }) |
| 446 | .inspect_err( |
| 447 | #[cold] |
| 448 | #[inline(never)] |
| 449 | |e| match e { |
| 450 | DBError::Datastore(DatastoreError::Index(IndexError::UniqueConstraintViolation(_))) => {} |
| 451 | _ => { |
| 452 | let res = stdb.table_name_from_id_mut(tx, table_id); |
| 453 | if let Ok(Some(table_name)) = res { |
| 454 | log::debug!("update(table: {table_name}, table_id: {table_id}, index_id: {index_id}): {e}") |
| 455 | } else { |
| 456 | log::debug!("update(table_id: {table_id}, index_id: {index_id}): {e}") |
| 457 | } |
| 458 | } |
| 459 | }, |
| 460 | )?; |
| 461 | |
| 462 | if update_flags.is_scheduler_table { |
| 463 | self.schedule_row(stdb, tx, table_id, row_ptr)?; |
| 464 | } |
| 465 | tx.metrics.bytes_written += buffer.len(); |
| 466 | tx.metrics.rows_updated += 1; |
| 467 | |
| 468 | Ok(row_len) |
| 469 | } |
| 470 | |
| 471 | #[tracing::instrument(level = "trace", skip_all)] |
| 472 | pub fn datastore_delete_by_index_scan_point_bsatn( |