A bit of database code cleanup.

This commit is contained in:
projectmoon 2020-10-23 20:19:04 +00:00 committed by ProjectMoon
parent 9f8ef281de
commit 9176e858d5
1 changed files with 8 additions and 7 deletions

View File

@ -3,6 +3,8 @@ use sled::transaction::abort;
use sled::transaction::{TransactionError, TransactionalTree, UnabortableTransactionError}; use sled::transaction::{TransactionError, TransactionalTree, UnabortableTransactionError};
use sled::{Db, Tree}; use sled::{Db, Tree};
use std::collections::HashMap; use std::collections::HashMap;
use std::path::Path;
use std::str;
use thiserror::Error; use thiserror::Error;
use zerocopy::byteorder::I32; use zerocopy::byteorder::I32;
use zerocopy::{AsBytes, LayoutVerified}; use zerocopy::{AsBytes, LayoutVerified};
@ -103,8 +105,8 @@ fn convert_i32(raw_value: &[u8]) -> Result<i32, DataError> {
} }
} }
/// Atomically alter the count of variables in the database, by the /// Use a transaction to atomically alter the count of variables in
/// given amount. Count cannot go below 0. /// the database by the given amount. Count cannot go below 0.
fn alter_room_variable_count( fn alter_room_variable_count(
variables: &TransactionalTree, variables: &TransactionalTree,
room_id: &str, room_id: &str,
@ -127,7 +129,7 @@ fn alter_room_variable_count(
} }
impl Database { impl Database {
pub fn new<P: AsRef<std::path::Path>>(path: P) -> Result<Database, DataError> { pub fn new<P: AsRef<Path>>(path: P) -> Result<Database, DataError> {
let db = sled::open(path)?; let db = sled::open(path)?;
let variables = db.open_tree("variables")?; let variables = db.open_tree("variables")?;
let rooms = db.open_tree("rooms")?; let rooms = db.open_tree("rooms")?;
@ -152,16 +154,15 @@ impl Database {
.scan_prefix(prefix) .scan_prefix(prefix)
.map(|entry| match entry { .map(|entry| match entry {
Ok((key, raw_value)) => { Ok((key, raw_value)) => {
//Strips room and username from key, leaving //Strips room and username from key, leaving behind name.
//behind name. let variable_name = str::from_utf8(&key[prefix_len..])?;
let variable_name = std::str::from_utf8(&key[prefix_len..])?;
Ok((variable_name.to_owned(), convert_i32(&raw_value)?)) Ok((variable_name.to_owned(), convert_i32(&raw_value)?))
} }
Err(e) => Err(e.into()), Err(e) => Err(e.into()),
}) })
.collect(); .collect();
//Convert_I32 to hash map. Can we do this in the first mapping //Convert I32 to hash map. Can we do this in the first mapping
//step instead? For some reason this is faster. //step instead? For some reason this is faster.
variables.map(|entries| entries.into_iter().collect()) variables.map(|entries| entries.into_iter().collect())
} }