use crate::error::DbCoreError;
use crate::snapshot::SnapshotTable;
use crate::table::TableDef;
pub(crate) fn check_new_virtual_table(table: &TableDef) -> Result<(), DbCoreError> {
if table.is_virtual() && !table.indexes.is_empty() {
return Err(refuse(&table.name, NO_INDEXES));
}
Ok(())
}
pub(crate) fn check_virtual_pair(
name: &str,
old: &SnapshotTable,
new: &SnapshotTable,
) -> Result<bool, DbCoreError> {
match (old.kind.module(), new.kind.module()) {
(None, None) => return Ok(false),
(None, Some(module)) => {
return Err(refuse(
name,
&format!("it became a virtual table using {module}"),
))
},
(Some(module), None) => {
return Err(refuse(
name,
&format!("it is no longer a virtual table using {module}"),
))
},
(Some(old_module), Some(new_module)) if old_module != new_module => {
return Err(refuse(
name,
&format!("its module changed from {old_module} to {new_module}"),
))
},
(Some(_), Some(_)) => {},
}
if old.column_order != new.column_order || old.columns != new.columns {
return Err(refuse(name, "its columns changed"));
}
if old.kind.args() != new.kind.args() {
return Err(refuse(name, "its module arguments changed"));
}
if !new.indexes.is_empty() {
return Err(refuse(name, NO_INDEXES));
}
Ok(true)
}
const NO_INDEXES: &str = "virtual tables cannot declare indexes";
fn refuse(table: &str, reason: &str) -> DbCoreError {
DbCoreError::VirtualTableChange {
table: table.to_owned(),
reason: reason.to_owned(),
}
}