### column名とvalueを指定してupdate
fn update_value_by_column_condition(
&mut self,
where_column: &str,
where_value: &Value,
set_column: &str,
new_value: Value,
) -> Result<usize, String> {
let where_index = self.columns.columns.iter().position(|c| c.name == where_column)
.ok_or_else(|| format!("Column '{}' not found", where_column))?;
let set_index = self.columns.columns.iter().position(|c| c.name == set_column)
.ok_or_else(|| format!("Column '{}' not found", set_column))?;
let expected_type = &self.columns.columns[set_index].constraint;
if !type_matches(&new_value, expected_type) {
return Err(format!(
"Type mismatch: column '{}' expects {:?}, got {:?}",
set_column, expected_type, new_value
));
}
let mut updated = 0;
for row in self.rows.iter_mut() {
if let Some(v) = row.get(where_index) {
if v == where_value {
row[set_index] = new_value.clone();
updated += 1;
}
}
}
Ok(updated)
}
let result = table.insert_row(vec![
Value::Integer(2),
Value::Text("Bob".to_string()),
Value::Integer(25),
]);
println!("{:?}", table);
let _ = table.update_value_by_column_condition(
"id",
&Value::Integer(2),
"name",
Value::Text("Carol".to_string()),
);
let matching_rows = table.find_rows_by_column_value("id", &Value::Integer(2));
for row in matching_rows {
println!("Matched row: {:?}", row);
}
Matched row: [Integer(2), Text(“Carol”), Integer(25)]
### delete
fn delete_rows_by_column_value(
&mut self,
column_name: &str,
target: &Value,
) -> Result<usize, String> {
let col_index = self
.columns
.columns
.iter()
.position(|col| col.name == column_name)
.ok_or_else(|| format!("Column '{}' not found", column_name))?;
let original_len = self.rows.len();
self.rows.retain(|row| row.get(col_index) != Some(target));
Ok(original_len - self.rows.len())
}
let matching_rows = table.find_rows_by_column_value("id", &Value::Integer(2));
for row in matching_rows {
println!("Matched row: {:?}", row);
}
let _ = table.delete_rows_by_column_value("id", &Value::Integer(2));
println!("{:?}", table);
Matched row: [Integer(2), Text(“Carol”), Integer(25)]
Table { name: “users”, columns: Columns { columns: [Column { name: “id”, constraint: Integer }, Column { name: “name”, constraint: Text }, Column { name: “age”, constraint: Integer }] }, rows: [[Integer(1), Text(“Alice”), Integer(30)]] }
これで、一通りcreate, insert, select, update, deleteまではできた。
ここから改善していく。