2024-04-06 01:24:08 -07:00
|
|
|
use std::sync::Arc;
|
|
|
|
|
|
2024-10-29 00:08:41 +00:00
|
|
|
use crate::{Database, Engine};
|
2024-04-06 01:24:08 -07:00
|
|
|
|
2024-05-09 15:59:08 -07:00
|
|
|
pub struct Cork {
|
2025-09-09 18:12:38 +05:00
|
|
|
engine: Arc<Engine>,
|
2024-04-06 01:24:08 -07:00
|
|
|
flush: bool,
|
|
|
|
|
sync: bool,
|
|
|
|
|
}
|
|
|
|
|
|
2024-10-29 00:08:41 +00:00
|
|
|
impl Database {
|
|
|
|
|
#[inline]
|
|
|
|
|
#[must_use]
|
2025-09-09 18:12:38 +05:00
|
|
|
pub fn cork(&self) -> Cork { Cork::new(&self.engine, false, false) }
|
2024-10-29 00:08:41 +00:00
|
|
|
|
|
|
|
|
#[inline]
|
|
|
|
|
#[must_use]
|
2025-09-09 18:12:38 +05:00
|
|
|
pub fn cork_and_flush(&self) -> Cork { Cork::new(&self.engine, true, false) }
|
2024-10-29 00:08:41 +00:00
|
|
|
|
|
|
|
|
#[inline]
|
|
|
|
|
#[must_use]
|
2025-09-09 18:12:38 +05:00
|
|
|
pub fn cork_and_sync(&self) -> Cork { Cork::new(&self.engine, true, true) }
|
2024-10-29 00:08:41 +00:00
|
|
|
}
|
|
|
|
|
|
2024-04-06 01:24:08 -07:00
|
|
|
impl Cork {
|
2024-07-03 20:06:43 +00:00
|
|
|
#[inline]
|
2025-09-09 18:12:38 +05:00
|
|
|
pub(super) fn new(engine: &Arc<Engine>, flush: bool, sync: bool) -> Self {
|
|
|
|
|
engine.cork();
|
|
|
|
|
Self { engine: engine.clone(), flush, sync }
|
2024-04-06 01:24:08 -07:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
impl Drop for Cork {
|
|
|
|
|
fn drop(&mut self) {
|
2025-09-09 18:12:38 +05:00
|
|
|
self.engine.uncork();
|
2024-04-06 01:24:08 -07:00
|
|
|
if self.flush {
|
2025-09-09 18:12:38 +05:00
|
|
|
self.engine.flush().ok();
|
2024-04-06 01:24:08 -07:00
|
|
|
}
|
|
|
|
|
if self.sync {
|
2025-09-09 18:12:38 +05:00
|
|
|
self.engine.sync().ok();
|
2024-04-06 01:24:08 -07:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|