Start database implementation.
This commit is contained in:
parent
b92ee28bef
commit
5d4cd09497
19
src/database/header.rs
Normal file
19
src/database/header.rs
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
pub struct Header {
|
||||||
|
pub depth:u8,
|
||||||
|
pub root:u32,
|
||||||
|
}
|
||||||
|
impl Header {
|
||||||
|
pub fn serialize(&self) -> [u8;16]
|
||||||
|
{
|
||||||
|
[0; 16]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
impl Default for Header {
|
||||||
|
fn default() -> Self
|
||||||
|
{
|
||||||
|
Self {
|
||||||
|
depth:1,
|
||||||
|
root:1,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
82
src/database/mod.rs
Normal file
82
src/database/mod.rs
Normal file
@ -0,0 +1,82 @@
|
|||||||
|
use tokio::{
|
||||||
|
fs::File,
|
||||||
|
io::{
|
||||||
|
Error, SeekFrom,
|
||||||
|
AsyncWriteExt, AsyncSeekExt
|
||||||
|
},
|
||||||
|
};
|
||||||
|
use std::collections::BTreeSet;
|
||||||
|
|
||||||
|
mod header;
|
||||||
|
mod page;
|
||||||
|
mod trie;
|
||||||
|
|
||||||
|
const PAGE_SIZE :u64 = 4096;
|
||||||
|
|
||||||
|
enum Path {
|
||||||
|
Index(usize),
|
||||||
|
Key(&u8),
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct Database {
|
||||||
|
file:File,
|
||||||
|
temp:BTreeSet<u64>,
|
||||||
|
}
|
||||||
|
impl Database {
|
||||||
|
async fn init(&mut self) -> Result<(),Error>
|
||||||
|
{
|
||||||
|
let mut header = header::Header::default();
|
||||||
|
header.depth = 1;
|
||||||
|
header.root = 2;
|
||||||
|
|
||||||
|
let buffered = header.serialize();
|
||||||
|
|
||||||
|
self.file.set_len(PAGE_SIZE * 3).await?;
|
||||||
|
|
||||||
|
self.file.seek(SeekFrom::Start(0)).await?;
|
||||||
|
self.file.write(&buffered).await?;
|
||||||
|
|
||||||
|
self.file.seek(SeekFrom::Start(PAGE_SIZE)).await?;
|
||||||
|
self.file.write(&buffered).await?;
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
impl From<File> for Database {
|
||||||
|
fn from(value: File) -> Self
|
||||||
|
{
|
||||||
|
Self {
|
||||||
|
file:value,
|
||||||
|
temp:BTreeSet::new(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Object
|
||||||
|
** Meta [16]
|
||||||
|
** [0:3] Type
|
||||||
|
**
|
||||||
|
** 00 Blob
|
||||||
|
** [3:3] Size
|
||||||
|
**
|
||||||
|
** 01 List
|
||||||
|
** []
|
||||||
|
**
|
||||||
|
** 10 Trie
|
||||||
|
**
|
||||||
|
** Addr [48]
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Page Table Entry
|
||||||
|
** <>
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Allocation Table Entry
|
||||||
|
** <>
|
||||||
|
**
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Header
|
||||||
|
** <>
|
||||||
|
**
|
||||||
|
*/
|
74
src/database/page.rs
Normal file
74
src/database/page.rs
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
pub enum Usage {
|
||||||
|
Blob = 0b00,
|
||||||
|
List = 0b01,
|
||||||
|
Trie = 0b10,
|
||||||
|
Table = 0b11,
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct Entry {
|
||||||
|
addr:u64,
|
||||||
|
res:u64,
|
||||||
|
}
|
||||||
|
impl Entry {
|
||||||
|
pub fn new() -> Self
|
||||||
|
{
|
||||||
|
Self {
|
||||||
|
addr:0,
|
||||||
|
res:0,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn blob(address:u64, size:u8) -> Self
|
||||||
|
{
|
||||||
|
let addr = address & ((1 << 48) - 1);
|
||||||
|
let size = (size as u64) << 48;
|
||||||
|
Self {
|
||||||
|
addr: size|addr,
|
||||||
|
res: 0,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn serialize(&self) -> [u8;16]
|
||||||
|
{
|
||||||
|
[
|
||||||
|
(self.addr & 0xFF) as u8,
|
||||||
|
((self.addr >> 8) & 0xFF) as u8,
|
||||||
|
((self.addr >> 16) & 0xFF) as u8,
|
||||||
|
((self.addr >> 24) & 0xFF) as u8,
|
||||||
|
((self.addr >> 32) & 0xFF) as u8,
|
||||||
|
((self.addr >> 40) & 0xFF) as u8,
|
||||||
|
((self.addr >> 48) & 0xFF) as u8,
|
||||||
|
((self.addr >> 56) & 0xFF) as u8,
|
||||||
|
|
||||||
|
(self.res & 0xFF) as u8,
|
||||||
|
((self.res >> 8) & 0xFF) as u8,
|
||||||
|
((self.res >> 16) & 0xFF) as u8,
|
||||||
|
((self.res >> 24) & 0xFF) as u8,
|
||||||
|
((self.res >> 32) & 0xFF) as u8,
|
||||||
|
((self.res >> 40) & 0xFF) as u8,
|
||||||
|
((self.res >> 48) & 0xFF) as u8,
|
||||||
|
((self.res >> 56) & 0xFF) as u8,
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn deserialize(&mut self, data:[u8;16])
|
||||||
|
{
|
||||||
|
self.addr = data[0] as u64
|
||||||
|
|(data[1] << 8) as u64
|
||||||
|
|(data[2] << 16) as u64
|
||||||
|
|(data[3] << 24) as u64
|
||||||
|
|(data[4] << 32) as u64
|
||||||
|
|(data[5] << 40) as u64
|
||||||
|
|(data[6] << 48) as u64
|
||||||
|
|(data[7] << 56) as u64;
|
||||||
|
|
||||||
|
self.res = data[8] as u64
|
||||||
|
|(data[9] << 8) as u64
|
||||||
|
|(data[10] << 16) as u64
|
||||||
|
|(data[11] << 24) as u64
|
||||||
|
|(data[12] << 32) as u64
|
||||||
|
|(data[13] << 40) as u64
|
||||||
|
|(data[14] << 48) as u64
|
||||||
|
|(data[15] << 56) as u64;
|
||||||
|
}
|
||||||
|
}
|
8
src/database/trie.rs
Normal file
8
src/database/trie.rs
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
pub struct TrieEntry {
|
||||||
|
meta:u8,
|
||||||
|
bytes:[u8; 11],
|
||||||
|
child:u32,
|
||||||
|
lesser:u32,
|
||||||
|
greater:u32,
|
||||||
|
data:u64,
|
||||||
|
}
|
@ -2,3 +2,4 @@
|
|||||||
|
|
||||||
mod blockfile; pub use blockfile::BlockFile;
|
mod blockfile; pub use blockfile::BlockFile;
|
||||||
mod triefile; pub use triefile::TrieFile;
|
mod triefile; pub use triefile::TrieFile;
|
||||||
|
mod database; pub use database::Database;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user