Advertisement
Guest User

src_file_function_paste

a guest
May 23rd, 2024
122
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Rust 4.74 KB | Source Code | 0 0
  1. pub fn update_with_nested_conditions_in_table(
  2.         &mut self,
  3.         table_name: &str,
  4.         update_input: (String, String),
  5.         nested_condition: NestedCondition,
  6.     ) -> Result<(), Error> {
  7.         let copied_tables = self.tables.clone();
  8.  
  9.         let table = self
  10.             .tables
  11.             .get_mut(table_name)
  12.             .ok_or(Error::TableNotFound(table_name.to_owned()))?;
  13.  
  14.         let is_primary_key_column = table
  15.             .primary_key_column
  16.             .as_ref()
  17.             .map(|c| c.name == update_input.0)
  18.             .unwrap_or(false);
  19.  
  20.         let old_table_copy = table.copy();
  21.  
  22.         let update_column = table
  23.             .columns
  24.             .iter()
  25.             .find(|c| c.name == update_input.0)
  26.             .ok_or(Error::TableError(table_errors::Error::NonExistingColumn(
  27.                 update_input.0.clone(),
  28.             )))?;
  29.  
  30.         if let Some(fk_info) = &update_column.foreign_key {
  31.             let referenced_table = copied_tables.get(&fk_info.reference_table).cloned().ok_or(
  32.                 Error::ReferencedTableNotFound(fk_info.reference_table.clone()),
  33.             )?;
  34.  
  35.             let referenced_column = referenced_table
  36.                 .columns
  37.                 .iter()
  38.                 .find(|c| c.name == fk_info.reference_column)
  39.                 .ok_or(Error::ReferencedColumnNotFound(
  40.                     fk_info.reference_table.clone(),
  41.                     fk_info.reference_column.clone(),
  42.                 ))?;
  43.  
  44.             let new_value = if update_input.1.trim().to_lowercase() == "null" {
  45.                 Value::Null
  46.             } else {
  47.                 match update_column.data_type {
  48.                     ColumnDataType::Integer => update_input
  49.                         .1
  50.                         .parse::<i64>()
  51.                         .map(Value::Integer)
  52.                         .map_err(|_| Error::ParseError(1, update_input.1.clone()))?,
  53.                     ColumnDataType::Float => update_input
  54.                         .1
  55.                         .parse::<f64>()
  56.                         .map(Value::Float)
  57.                         .map_err(|_| Error::ParseError(1, update_input.1.clone()))?,
  58.                     ColumnDataType::Text => Value::Text(update_input.1.clone()),
  59.                 }
  60.             };
  61.  
  62.             if new_value == Value::Null {
  63.                 return Err(Error::NullForeignKey(update_column.name.clone()));
  64.             }
  65.  
  66.             if !referenced_column.data.contains(&new_value) {
  67.                 return Err(Error::ForeignKeyViolation(
  68.                     new_value.to_string(),
  69.                     update_column.name.clone(),
  70.                     fk_info.reference_table.clone(),
  71.                 ));
  72.             }
  73.         }
  74.  
  75.         table.update_with_nested_conditions(update_input, nested_condition)?;
  76.  
  77.         if is_primary_key_column {
  78.             let primary_key_column_name = table
  79.                 .primary_key_column
  80.                 .as_ref()
  81.                 .map(|c| c.name.clone())
  82.                 .unwrap_or_default();
  83.  
  84.             let mut old_primary_key_value = None;
  85.             let mut new_primary_key_value = None;
  86.  
  87.             // Iterate over the old and new table data
  88.             for (old_row, new_row) in old_table_copy.columns.iter().zip(table.columns.iter()) {
  89.                 if old_row.name == primary_key_column_name {
  90.                     for (old_value, new_value) in old_row.data.iter().zip(new_row.data.iter()) {
  91.                         if old_value != new_value {
  92.                             old_primary_key_value = Some(old_value.clone());
  93.                             new_primary_key_value = Some(new_value.clone());
  94.                             break;
  95.                         }
  96.                     }
  97.                 }
  98.             }
  99.  
  100.             // Check if the primary key value has changed
  101.  
  102.             if let (Some(old_primary_key_value), Some(new_primary_key_value)) = (old_primary_key_value, new_primary_key_value) {
  103.  
  104.                 // update the referencing tables
  105.                 for (referencing_table_name, referencing_column_name) in &table.referenced_as_foreign_key {
  106.                     if let Some(referencing_table) = self.tables.get_mut(referencing_table_name) {
  107.                         if let Some(referencing_column) = referencing_table.columns.iter_mut().find(|c| c.name == *referencing_column_name) {
  108.                             for row in &mut referencing_column.data {
  109.                                 if *row == old_primary_key_value {
  110.                                     *row = new_primary_key_value.clone();
  111.                                 }
  112.                             }
  113.                         }
  114.                     }
  115.                 }
  116.             }
  117.  
  118.         }
  119.  
  120.         Ok(())
  121.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement