...
This commit is contained in:
parent
7dff7ecc5e
commit
eccea1ad04
@ -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
|
||||||
|
@ -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>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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() {
|
||||||
|
@ -13,10 +13,10 @@ 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
|
||||||
pub lookuppath: String,
|
pub lookuppath: String,
|
||||||
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user