pub struct KorrosyncServiceRedb { /* private fields */ }Expand description
Redb-based implementation of KoReader synchronization service.
This service provides a high-level API for user authentication and reading progress synchronization using an embedded redb database with transactional guarantees.
Implementations§
Source§impl KorrosyncServiceRedb
impl KorrosyncServiceRedb
Sourcepub fn new(path: impl AsRef<Path>) -> Result<KorrosyncServiceRedb, ServiceError>
pub fn new(path: impl AsRef<Path>) -> Result<KorrosyncServiceRedb, ServiceError>
Creates a new KorrosyncServiceRedb with a database at the specified path.
This method initializes the embedded redb database and creates the required tables if they don’t already exist. If the database file already exists, it will be opened and reused.
Parent directories are created automatically if they don’t exist, so you can
safely provide paths like "data/db/korrosync.db" without pre-creating the folders.
§Arguments
path- Path to the database file (will be created if it doesn’t exist)
§Returns
Returns a new KorrosyncServiceRedb instance ready for use.
§Errors
Returns an error if:
- Parent directories cannot be created (permission issues, invalid path)
- The database file cannot be created or opened
- There are permission issues accessing the file or directories
- The database is corrupted or incompatible
§Examples
use korrosync::service::db::KorrosyncServiceRedb;
// Create a service with a simple database file
let service = KorrosyncServiceRedb::new("korrosync.db")?;
Trait Implementations§
Source§impl KorrosyncService for KorrosyncServiceRedb
impl KorrosyncService for KorrosyncServiceRedb
Source§fn get_user(&self, name: String) -> Result<Option<User>, ServiceError>
fn get_user(&self, name: String) -> Result<Option<User>, ServiceError>
Retrieves a user by username from the database.
§Arguments
name- The username to look up
§Returns
Ok(Some(user))- User found with the given usernameOk(None)- No user exists with the given username
§Example
use korrosync::service::db::{KorrosyncService, KorrosyncServiceRedb};
let service = KorrosyncServiceRedb::new("korrosync.db")?;
match service.get_user("alice".into())? {
Some(user) => println!("Found user: {}", user.username()),
None => println!("User not found"),
}Source§fn create_or_update_user(&self, user: User) -> Result<User, ServiceError>
fn create_or_update_user(&self, user: User) -> Result<User, ServiceError>
Adds a new user or updates an existing user in the database.
§Arguments
user- Reference to the user to add or update
§Example
use korrosync::service::db::{KorrosyncService, KorrosyncServiceRedb};
use korrosync::model::User;
let service = KorrosyncServiceRedb::new("korrosync.db")?;
let user = User::new("alice", "secure_password")?;
service.create_or_update_user(user)?;
println!("User added successfully");Source§fn update_progress(
&self,
user: String,
document: String,
progress: Progress,
) -> Result<(String, u64), ServiceError>
fn update_progress( &self, user: String, document: String, progress: Progress, ) -> Result<(String, u64), ServiceError>
Updates or creates reading progress for a user’s document.
This method stores the reading progress for a specific user and document combination. If progress already exists for this combination, it will be overwritten with the new data. The operation is atomic and transactional.
§Arguments
user- The username of the userdocument- The document identifier (typically filename or path)progress- The progress information to store
§Returns
Returns a tuple containing:
- The document identifier (echoed back)
- The timestamp from the progress record
§Example
use korrosync::service::db::{KorrosyncService, KorrosyncServiceRedb};
use korrosync::model::Progress;
let service = KorrosyncServiceRedb::new("korrosync.db")?;
let progress = Progress {
device_id: "device-123".to_string(),
device: "Kindle".to_string(),
percentage: 45.5,
progress: "Page 91 of 200".to_string(),
timestamp: 1609459200000,
};
let (doc, ts) = service.update_progress("alice".into(), "book.epub".into(), progress)?;
println!("Updated progress for {} at timestamp {}", doc, ts);Source§fn get_progress(
&self,
user: String,
document: String,
) -> Result<Option<Progress>, ServiceError>
fn get_progress( &self, user: String, document: String, ) -> Result<Option<Progress>, ServiceError>
Retrieves reading progress for a specific user and document.
§Arguments
user- The username of the userdocument- The document identifier to look up
§Returns
Returns the Progress information if found.
§Example
use korrosync::service::db::{KorrosyncService, KorrosyncServiceRedb};
let service = KorrosyncServiceRedb::new("korrosync.db")?;
match service.get_progress("alice".to_string(), "book.epub".to_string()) {
Ok(Some(progress)) => {
println!("Progress: {}% on device {}",
progress.percentage, progress.device);
}
Ok(None) => println!("No progress found"),
Err(e) => println!("Unexpected error: {}", e),
}Auto Trait Implementations§
impl Freeze for KorrosyncServiceRedb
impl !RefUnwindSafe for KorrosyncServiceRedb
impl Send for KorrosyncServiceRedb
impl Sync for KorrosyncServiceRedb
impl Unpin for KorrosyncServiceRedb
impl !UnwindSafe for KorrosyncServiceRedb
Blanket Implementations§
Source§impl<T> ArchivePointee for T
impl<T> ArchivePointee for T
Source§type ArchivedMetadata = ()
type ArchivedMetadata = ()
Source§fn pointer_metadata(
_: &<T as ArchivePointee>::ArchivedMetadata,
) -> <T as Pointee>::Metadata
fn pointer_metadata( _: &<T as ArchivePointee>::ArchivedMetadata, ) -> <T as Pointee>::Metadata
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> IntoRequest<T> for T
impl<T> IntoRequest<T> for T
Source§fn into_request(self) -> Request<T>
fn into_request(self) -> Request<T>
T in a tonic::RequestSource§impl<T> LayoutRaw for T
impl<T> LayoutRaw for T
Source§fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>
fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>
Source§impl<T, N1, N2> Niching<NichedOption<T, N1>> for N2
impl<T, N1, N2> Niching<NichedOption<T, N1>> for N2
Source§unsafe fn is_niched(niched: *const NichedOption<T, N1>) -> bool
unsafe fn is_niched(niched: *const NichedOption<T, N1>) -> bool
Source§fn resolve_niched(out: Place<NichedOption<T, N1>>)
fn resolve_niched(out: Place<NichedOption<T, N1>>)
out indicating that a T is niched.Source§impl<D> OwoColorize for D
impl<D> OwoColorize for D
Source§fn fg<C>(&self) -> FgColorDisplay<'_, C, Self>where
C: Color,
fn fg<C>(&self) -> FgColorDisplay<'_, C, Self>where
C: Color,
Source§fn bg<C>(&self) -> BgColorDisplay<'_, C, Self>where
C: Color,
fn bg<C>(&self) -> BgColorDisplay<'_, C, Self>where
C: Color,
Source§fn black(&self) -> FgColorDisplay<'_, Black, Self>
fn black(&self) -> FgColorDisplay<'_, Black, Self>
Source§fn on_black(&self) -> BgColorDisplay<'_, Black, Self>
fn on_black(&self) -> BgColorDisplay<'_, Black, Self>
Source§fn red(&self) -> FgColorDisplay<'_, Red, Self>
fn red(&self) -> FgColorDisplay<'_, Red, Self>
Source§fn on_red(&self) -> BgColorDisplay<'_, Red, Self>
fn on_red(&self) -> BgColorDisplay<'_, Red, Self>
Source§fn green(&self) -> FgColorDisplay<'_, Green, Self>
fn green(&self) -> FgColorDisplay<'_, Green, Self>
Source§fn on_green(&self) -> BgColorDisplay<'_, Green, Self>
fn on_green(&self) -> BgColorDisplay<'_, Green, Self>
Source§fn yellow(&self) -> FgColorDisplay<'_, Yellow, Self>
fn yellow(&self) -> FgColorDisplay<'_, Yellow, Self>
Source§fn on_yellow(&self) -> BgColorDisplay<'_, Yellow, Self>
fn on_yellow(&self) -> BgColorDisplay<'_, Yellow, Self>
Source§fn blue(&self) -> FgColorDisplay<'_, Blue, Self>
fn blue(&self) -> FgColorDisplay<'_, Blue, Self>
Source§fn on_blue(&self) -> BgColorDisplay<'_, Blue, Self>
fn on_blue(&self) -> BgColorDisplay<'_, Blue, Self>
Source§fn magenta(&self) -> FgColorDisplay<'_, Magenta, Self>
fn magenta(&self) -> FgColorDisplay<'_, Magenta, Self>
Source§fn on_magenta(&self) -> BgColorDisplay<'_, Magenta, Self>
fn on_magenta(&self) -> BgColorDisplay<'_, Magenta, Self>
Source§fn purple(&self) -> FgColorDisplay<'_, Magenta, Self>
fn purple(&self) -> FgColorDisplay<'_, Magenta, Self>
Source§fn on_purple(&self) -> BgColorDisplay<'_, Magenta, Self>
fn on_purple(&self) -> BgColorDisplay<'_, Magenta, Self>
Source§fn cyan(&self) -> FgColorDisplay<'_, Cyan, Self>
fn cyan(&self) -> FgColorDisplay<'_, Cyan, Self>
Source§fn on_cyan(&self) -> BgColorDisplay<'_, Cyan, Self>
fn on_cyan(&self) -> BgColorDisplay<'_, Cyan, Self>
Source§fn white(&self) -> FgColorDisplay<'_, White, Self>
fn white(&self) -> FgColorDisplay<'_, White, Self>
Source§fn on_white(&self) -> BgColorDisplay<'_, White, Self>
fn on_white(&self) -> BgColorDisplay<'_, White, Self>
Source§fn default_color(&self) -> FgColorDisplay<'_, Default, Self>
fn default_color(&self) -> FgColorDisplay<'_, Default, Self>
Source§fn on_default_color(&self) -> BgColorDisplay<'_, Default, Self>
fn on_default_color(&self) -> BgColorDisplay<'_, Default, Self>
Source§fn bright_black(&self) -> FgColorDisplay<'_, BrightBlack, Self>
fn bright_black(&self) -> FgColorDisplay<'_, BrightBlack, Self>
Source§fn on_bright_black(&self) -> BgColorDisplay<'_, BrightBlack, Self>
fn on_bright_black(&self) -> BgColorDisplay<'_, BrightBlack, Self>
Source§fn bright_red(&self) -> FgColorDisplay<'_, BrightRed, Self>
fn bright_red(&self) -> FgColorDisplay<'_, BrightRed, Self>
Source§fn on_bright_red(&self) -> BgColorDisplay<'_, BrightRed, Self>
fn on_bright_red(&self) -> BgColorDisplay<'_, BrightRed, Self>
Source§fn bright_green(&self) -> FgColorDisplay<'_, BrightGreen, Self>
fn bright_green(&self) -> FgColorDisplay<'_, BrightGreen, Self>
Source§fn on_bright_green(&self) -> BgColorDisplay<'_, BrightGreen, Self>
fn on_bright_green(&self) -> BgColorDisplay<'_, BrightGreen, Self>
Source§fn bright_yellow(&self) -> FgColorDisplay<'_, BrightYellow, Self>
fn bright_yellow(&self) -> FgColorDisplay<'_, BrightYellow, Self>
Source§fn on_bright_yellow(&self) -> BgColorDisplay<'_, BrightYellow, Self>
fn on_bright_yellow(&self) -> BgColorDisplay<'_, BrightYellow, Self>
Source§fn bright_blue(&self) -> FgColorDisplay<'_, BrightBlue, Self>
fn bright_blue(&self) -> FgColorDisplay<'_, BrightBlue, Self>
Source§fn on_bright_blue(&self) -> BgColorDisplay<'_, BrightBlue, Self>
fn on_bright_blue(&self) -> BgColorDisplay<'_, BrightBlue, Self>
Source§fn bright_magenta(&self) -> FgColorDisplay<'_, BrightMagenta, Self>
fn bright_magenta(&self) -> FgColorDisplay<'_, BrightMagenta, Self>
Source§fn on_bright_magenta(&self) -> BgColorDisplay<'_, BrightMagenta, Self>
fn on_bright_magenta(&self) -> BgColorDisplay<'_, BrightMagenta, Self>
Source§fn bright_purple(&self) -> FgColorDisplay<'_, BrightMagenta, Self>
fn bright_purple(&self) -> FgColorDisplay<'_, BrightMagenta, Self>
Source§fn on_bright_purple(&self) -> BgColorDisplay<'_, BrightMagenta, Self>
fn on_bright_purple(&self) -> BgColorDisplay<'_, BrightMagenta, Self>
Source§fn bright_cyan(&self) -> FgColorDisplay<'_, BrightCyan, Self>
fn bright_cyan(&self) -> FgColorDisplay<'_, BrightCyan, Self>
Source§fn on_bright_cyan(&self) -> BgColorDisplay<'_, BrightCyan, Self>
fn on_bright_cyan(&self) -> BgColorDisplay<'_, BrightCyan, Self>
Source§fn bright_white(&self) -> FgColorDisplay<'_, BrightWhite, Self>
fn bright_white(&self) -> FgColorDisplay<'_, BrightWhite, Self>
Source§fn on_bright_white(&self) -> BgColorDisplay<'_, BrightWhite, Self>
fn on_bright_white(&self) -> BgColorDisplay<'_, BrightWhite, Self>
Source§fn bold(&self) -> BoldDisplay<'_, Self>
fn bold(&self) -> BoldDisplay<'_, Self>
Source§fn dimmed(&self) -> DimDisplay<'_, Self>
fn dimmed(&self) -> DimDisplay<'_, Self>
Source§fn italic(&self) -> ItalicDisplay<'_, Self>
fn italic(&self) -> ItalicDisplay<'_, Self>
Source§fn underline(&self) -> UnderlineDisplay<'_, Self>
fn underline(&self) -> UnderlineDisplay<'_, Self>
Source§fn blink(&self) -> BlinkDisplay<'_, Self>
fn blink(&self) -> BlinkDisplay<'_, Self>
Source§fn blink_fast(&self) -> BlinkFastDisplay<'_, Self>
fn blink_fast(&self) -> BlinkFastDisplay<'_, Self>
Source§fn reversed(&self) -> ReversedDisplay<'_, Self>
fn reversed(&self) -> ReversedDisplay<'_, Self>
Source§fn strikethrough(&self) -> StrikeThroughDisplay<'_, Self>
fn strikethrough(&self) -> StrikeThroughDisplay<'_, Self>
Source§fn color<Color>(&self, color: Color) -> FgDynColorDisplay<'_, Color, Self>where
Color: DynColor,
fn color<Color>(&self, color: Color) -> FgDynColorDisplay<'_, Color, Self>where
Color: DynColor,
OwoColorize::fg or
a color-specific method, such as OwoColorize::green, Read moreSource§fn on_color<Color>(&self, color: Color) -> BgDynColorDisplay<'_, Color, Self>where
Color: DynColor,
fn on_color<Color>(&self, color: Color) -> BgDynColorDisplay<'_, Color, Self>where
Color: DynColor,
OwoColorize::bg or
a color-specific method, such as OwoColorize::on_yellow, Read more