This commit is contained in:
despiegk 2025-04-20 06:52:35 +02:00
parent 7dff7ecc5e
commit eccea1ad04
4 changed files with 31 additions and 12 deletions

View File

@ -14,9 +14,7 @@ pub const HEADER_SIZE: usize = 12;
impl OurDB { impl OurDB {
/// Selects and opens a database file for read/write operations /// Selects and opens a database file for read/write operations
pub(crate) fn db_file_select(&mut self, file_nr: u16) -> Result<(), Error> { pub(crate) fn db_file_select(&mut self, file_nr: u16) -> Result<(), Error> {
if file_nr > 65535 { // No need to check if file_nr > 65535 as u16 can't exceed that value
return Err(Error::InvalidOperation("File number needs to be < 65536".to_string()));
}
let path = self.path.join(format!("{}.db", file_nr)); let path = self.path.join(format!("{}.db", file_nr));
@ -53,6 +51,18 @@ impl OurDB {
/// Gets the file number to use for the next write operation /// Gets the file number to use for the next write operation
pub(crate) fn get_file_nr(&mut self) -> Result<u16, Error> { pub(crate) fn get_file_nr(&mut self) -> Result<u16, Error> {
// For keysize 2, 3, or 4, we can only use file_nr 0
if self.lookup.keysize() <= 4 {
let path = self.path.join("0.db");
if !path.exists() {
self.create_new_db_file(0)?;
}
return Ok(0);
}
// For keysize 6, we can use multiple files
let path = self.path.join(format!("{}.db", self.last_used_file_nr)); let path = self.path.join(format!("{}.db", self.last_used_file_nr));
if !path.exists() { if !path.exists() {
@ -254,7 +264,7 @@ impl OurDB {
// Read and process records // Read and process records
let mut buffer = vec![0u8; 1024]; // Read in chunks let mut buffer = vec![0u8; 1024]; // Read in chunks
let mut position = 0; let mut _position = 0;
while let Ok(bytes_read) = src_file.read(&mut buffer) { while let Ok(bytes_read) = src_file.read(&mut buffer) {
if bytes_read == 0 { if bytes_read == 0 {
@ -265,7 +275,7 @@ impl OurDB {
// This is a simplified version - in a real implementation, // This is a simplified version - in a real implementation,
// you would need to handle records that span chunk boundaries // you would need to handle records that span chunk boundaries
position += bytes_read; _position += bytes_read;
} }
// TODO: Implement proper record copying and position updating // TODO: Implement proper record copying and position updating

View File

@ -37,7 +37,11 @@ pub struct OurDBConfig {
pub incremental_mode: bool, pub incremental_mode: bool,
/// Maximum file size (default: 500MB) /// Maximum file size (default: 500MB)
pub file_size: Option<u32>, pub file_size: Option<u32>,
/// Lookup table key size /// Lookup table key size (default: 4)
/// - 2: For databases with < 65,536 records (single file)
/// - 3: For databases with < 16,777,216 records (single file)
/// - 4: For databases with < 4,294,967,296 records (single file)
/// - 6: For large databases requiring multiple files (default)
pub keysize: Option<u8>, pub keysize: Option<u8>,
} }

View File

@ -27,10 +27,10 @@ impl Location {
// Create padded bytes // Create padded bytes
let mut padded = vec![0u8; keysize as usize]; let mut padded = vec![0u8; keysize as usize];
let start_idx = keysize as usize - bytes.len(); if bytes.len() > keysize as usize {
if start_idx < 0 {
return Err(Error::InvalidOperation("Input bytes exceed keysize".to_string())); return Err(Error::InvalidOperation("Input bytes exceed keysize".to_string()));
} }
let start_idx = keysize as usize - bytes.len();
for (i, &b) in bytes.iter().enumerate() { for (i, &b) in bytes.iter().enumerate() {
if i + start_idx < padded.len() { if i + start_idx < padded.len() {

View File

@ -13,9 +13,9 @@ pub struct LookupConfig {
/// Size of the lookup table /// Size of the lookup table
pub size: u32, pub size: u32,
/// Size of each entry in bytes (2-6) /// Size of each entry in bytes (2-6)
/// - 2: For databases with < 65,536 records /// - 2: For databases with < 65,536 records (single file)
/// - 3: For databases with < 16,777,216 records /// - 3: For databases with < 16,777,216 records (single file)
/// - 4: For databases with < 4,294,967,296 records /// - 4: For databases with < 4,294,967,296 records (single file)
/// - 6: For large databases requiring multiple files /// - 6: For large databases requiring multiple files
pub keysize: u8, pub keysize: u8,
/// Path for disk-based lookup /// Path for disk-based lookup
@ -37,6 +37,11 @@ pub struct LookupTable {
} }
impl LookupTable { impl LookupTable {
/// Returns the keysize of this lookup table
pub fn keysize(&self) -> u8 {
self.keysize
}
/// Creates a new lookup table with the given configuration /// Creates a new lookup table with the given configuration
pub fn new(config: LookupConfig) -> Result<Self, Error> { pub fn new(config: LookupConfig) -> Result<Self, Error> {
// Verify keysize is valid // Verify keysize is valid