ruve-db 0.1.0

A hybrid vector and full-text search database with HNSW approximate nearest-neighbour indexing and BM25
Documentation
use std::fs::{OpenOptions};
use std::io::{Read, Seek, SeekFrom, Write};
use crate::types::Record;

// append a record, and it's size to file and returns its offset
pub fn append_record(record: &Record, path: &String) -> u64 {
    let mut file = OpenOptions::new()
        .create(true)
        .append(true)
        .read(true)
        .open(path)
        .unwrap();

    let offset = file.seek(SeekFrom::End(0)).unwrap();


    let serialized = bincode::serialize(record).unwrap();
    let length = serialized.len() as u64;

    file.write_all(&length.to_le_bytes()).unwrap();
    file.write_all(&serialized).unwrap();

    offset
}

// retrieve and deserialize a record from offset
pub fn retrieve_record(offset: u64, path: &String) -> Record {
    let mut file = OpenOptions::new()
        .read(true)
        .open(path)
        .unwrap();

    file.seek(SeekFrom::Start(offset)).unwrap();

    let mut record_size_buffer = [0u8; 8];
    file.read_exact(&mut record_size_buffer).unwrap();
    let record_size = u64::from_le_bytes(record_size_buffer);

    let mut record_buffer = vec![0u8; record_size as usize];
    file.read_exact(&mut record_buffer).unwrap();

    bincode::deserialize(&record_buffer).unwrap()
}