use reifydb_core::{
interface::catalog::id::{PrimaryKeyId, RingBufferId},
key::ringbuffer::RingBufferKey,
return_internal_error,
};
use reifydb_transaction::transaction::admin::AdminTransaction;
use crate::{CatalogStore, Result, store::ringbuffer::shape::ringbuffer};
impl CatalogStore {
pub(crate) fn set_ringbuffer_primary_key(
txn: &mut AdminTransaction,
ringbuffer_id: RingBufferId,
primary_key_id: PrimaryKeyId,
) -> Result<()> {
let multi = match txn.get(&RingBufferKey::encoded(ringbuffer_id))? {
Some(v) => v,
None => return_internal_error!(format!(
"Ring buffer with ID {} not found when setting primary key. This indicates a critical catalog inconsistency.",
ringbuffer_id.0
)),
};
let mut updated_row = multi.row.clone();
ringbuffer::SHAPE.set_u64(&mut updated_row, ringbuffer::PRIMARY_KEY, primary_key_id.0);
txn.set(&RingBufferKey::encoded(ringbuffer_id), updated_row)?;
Ok(())
}
}
#[cfg(test)]
pub mod tests {
use reifydb_core::interface::catalog::id::{PrimaryKeyId, RingBufferId};
use reifydb_engine::test_harness::create_test_admin_transaction;
use reifydb_transaction::transaction::Transaction;
use crate::{CatalogStore, test_utils::ensure_test_ringbuffer};
#[test]
fn test_set_ringbuffer_primary_key() {
let mut txn = create_test_admin_transaction();
let ringbuffer = ensure_test_ringbuffer(&mut txn);
let pk_id = PrimaryKeyId(100);
CatalogStore::set_ringbuffer_primary_key(&mut txn, ringbuffer.id, pk_id).unwrap();
let retrieved_pk =
CatalogStore::get_ringbuffer_pk_id(&mut Transaction::Admin(&mut txn), ringbuffer.id).unwrap();
assert_eq!(retrieved_pk, Some(pk_id));
}
#[test]
fn test_set_ringbuffer_primary_key_nonexistent() {
let mut txn = create_test_admin_transaction();
let result = CatalogStore::set_ringbuffer_primary_key(&mut txn, RingBufferId(999), PrimaryKeyId(1));
assert!(result.is_err());
let err = result.unwrap_err();
assert!(err.to_string().contains("Ring buffer with ID 999 not found"));
assert!(err.to_string().contains("critical catalog inconsistency"));
}
#[test]
fn test_set_ringbuffer_primary_key_overwrites() {
let mut txn = create_test_admin_transaction();
let ringbuffer = ensure_test_ringbuffer(&mut txn);
let pk_id1 = PrimaryKeyId(100);
CatalogStore::set_ringbuffer_primary_key(&mut txn, ringbuffer.id, pk_id1).unwrap();
let pk_id2 = PrimaryKeyId(200);
CatalogStore::set_ringbuffer_primary_key(&mut txn, ringbuffer.id, pk_id2).unwrap();
let retrieved_pk =
CatalogStore::get_ringbuffer_pk_id(&mut Transaction::Admin(&mut txn), ringbuffer.id).unwrap();
assert_eq!(retrieved_pk, Some(pk_id2));
}
}