#![allow(unused_variables)]
use std::path::PathBuf;
use crate::error::{Error, Result};
use crate::columnar::schema::Schema;
use crate::columnar::table::Table;
use crate::columnar::compression::CompressionType;
#[derive(Debug, Clone)]
pub struct StorageOptions {
pub base_dir: PathBuf,
pub compression: CompressionType,
pub create_dirs: bool,
pub use_mmap: bool,
}
impl Default for StorageOptions {
fn default() -> Self {
StorageOptions {
base_dir: PathBuf::from("db"),
compression: CompressionType::None,
create_dirs: true,
use_mmap: true,
}
}
}
pub struct Storage {
options: StorageOptions,
}
impl Storage {
pub fn new(options: StorageOptions) -> Result<Self> {
if options.create_dirs && !options.base_dir.exists() {
std::fs::create_dir_all(&options.base_dir)?;
}
Ok(Storage {
options,
})
}
pub fn create_table(&self, name: &str, schema: Schema) -> Result<Table> {
let table_dir = self.options.base_dir.join(name);
if table_dir.exists() {
return Err(Error::InvalidArgument(format!(
"Table {} already exists",
name
)));
}
std::fs::create_dir_all(&table_dir)?;
for field in &schema.fields {
let column_path = table_dir.join(format!("{}.col", field.name));
let mut _file = std::fs::File::create(column_path)?;
}
Table::open(name, self.options.base_dir.to_str().unwrap())
}
pub fn open_table(&self, name: &str) -> Result<Table> {
Table::open(name, self.options.base_dir.to_str().unwrap())
}
pub fn drop_table(&self, name: &str) -> Result<()> {
let table_dir = self.options.base_dir.join(name);
if !table_dir.exists() {
return Err(Error::InvalidArgument(format!(
"Table {} does not exist",
name
)));
}
std::fs::remove_dir_all(table_dir)?;
Ok(())
}
pub fn list_tables(&self) -> Result<Vec<String>> {
let mut tables = Vec::new();
for entry in std::fs::read_dir(&self.options.base_dir)? {
let entry = entry?;
let path = entry.path();
if path.is_dir() {
if let Some(name) = path.file_name() {
if let Some(name_str) = name.to_str() {
tables.push(name_str.to_string());
}
}
}
}
Ok(tables)
}
pub fn options(&self) -> &StorageOptions {
&self.options
}
}