feat(nbstore): improve nbstore (#9512)

This commit is contained in:
EYHN
2025-01-06 09:38:03 +00:00
parent a2563d2180
commit 46c8c4a408
103 changed files with 3337 additions and 3423 deletions
+29 -22
View File
@@ -3,8 +3,7 @@ use std::ops::Deref;
use chrono::{DateTime, NaiveDateTime};
use sqlx::{QueryBuilder, Row};
use super::storage::{Result, SqliteDocStorage};
use super::{DocClock, DocRecord, DocUpdate};
use super::{error::Result, storage::SqliteDocStorage, DocClock, DocRecord, DocUpdate};
struct Meta {
space_id: String,
@@ -81,7 +80,7 @@ impl SqliteDocStorage {
Ok(()) => break,
Err(e) => {
if tried > 10 {
return Err(e);
return Err(e.into());
}
// Increment timestamp by 1ms and retry
@@ -126,13 +125,15 @@ impl SqliteDocStorage {
}
pub async fn get_doc_snapshot(&self, doc_id: String) -> Result<Option<DocRecord>> {
sqlx::query_as!(
let result = sqlx::query_as!(
DocRecord,
"SELECT doc_id, data, updated_at as timestamp FROM snapshots WHERE doc_id = ?",
"SELECT doc_id, data as bin, updated_at as timestamp FROM snapshots WHERE doc_id = ?",
doc_id
)
.fetch_optional(&self.pool)
.await
.await?;
Ok(result)
}
pub async fn set_doc_snapshot(&self, snapshot: DocRecord) -> Result<bool> {
@@ -145,7 +146,7 @@ impl SqliteDocStorage {
WHERE updated_at <= $3;"#,
)
.bind(snapshot.doc_id)
.bind(snapshot.data.deref())
.bind(snapshot.bin.deref())
.bind(snapshot.timestamp)
.execute(&self.pool)
.await?;
@@ -154,13 +155,15 @@ impl SqliteDocStorage {
}
pub async fn get_doc_updates(&self, doc_id: String) -> Result<Vec<DocUpdate>> {
sqlx::query_as!(
let result = sqlx::query_as!(
DocUpdate,
"SELECT doc_id, created_at, data FROM updates WHERE doc_id = ?",
"SELECT doc_id, created_at as timestamp, data as bin FROM updates WHERE doc_id = ?",
doc_id
)
.fetch_all(&self.pool)
.await
.await?;
Ok(result)
}
pub async fn mark_updates_merged(
@@ -204,7 +207,9 @@ impl SqliteDocStorage {
.execute(&mut *tx)
.await?;
tx.commit().await
tx.commit().await?;
Ok(())
}
pub async fn get_doc_clocks(&self, after: Option<NaiveDateTime>) -> Result<Vec<DocClock>> {
@@ -228,13 +233,15 @@ impl SqliteDocStorage {
}
pub async fn get_doc_clock(&self, doc_id: String) -> Result<Option<DocClock>> {
sqlx::query_as!(
let result = sqlx::query_as!(
DocClock,
"SELECT doc_id, timestamp FROM clocks WHERE doc_id = ?",
doc_id
)
.fetch_optional(&self.pool)
.await
.await?;
Ok(result)
}
}
@@ -286,7 +293,7 @@ mod tests {
storage
.set_doc_snapshot(DocRecord {
doc_id: "test".to_string(),
data: vec![0, 0].into(),
bin: vec![0, 0].into(),
timestamp: Utc::now().naive_utc(),
})
.await
@@ -350,7 +357,7 @@ mod tests {
assert_eq!(result.len(), 4);
assert_eq!(
result.iter().map(|u| u.data.as_ref()).collect::<Vec<_>>(),
result.iter().map(|u| u.bin.as_ref()).collect::<Vec<_>>(),
updates
);
}
@@ -365,7 +372,7 @@ mod tests {
let snapshot = DocRecord {
doc_id: "test".to_string(),
data: vec![0, 0].into(),
bin: vec![0, 0].into(),
timestamp: Utc::now().naive_utc(),
};
@@ -374,7 +381,7 @@ mod tests {
let result = storage.get_doc_snapshot("test".to_string()).await.unwrap();
assert!(result.is_some());
assert_eq!(result.unwrap().data.as_ref(), vec![0, 0]);
assert_eq!(result.unwrap().bin.as_ref(), vec![0, 0]);
}
#[tokio::test]
@@ -383,7 +390,7 @@ mod tests {
let snapshot = DocRecord {
doc_id: "test".to_string(),
data: vec![0, 0].into(),
bin: vec![0, 0].into(),
timestamp: Utc::now().naive_utc(),
};
@@ -392,11 +399,11 @@ mod tests {
let result = storage.get_doc_snapshot("test".to_string()).await.unwrap();
assert!(result.is_some());
assert_eq!(result.unwrap().data.as_ref(), vec![0, 0]);
assert_eq!(result.unwrap().bin.as_ref(), vec![0, 0]);
let snapshot = DocRecord {
doc_id: "test".to_string(),
data: vec![0, 1].into(),
bin: vec![0, 1].into(),
timestamp: DateTime::from_timestamp_millis(Utc::now().timestamp_millis() - 1000)
.unwrap()
.naive_utc(),
@@ -408,7 +415,7 @@ mod tests {
let result = storage.get_doc_snapshot("test".to_string()).await.unwrap();
assert!(result.is_some());
assert_eq!(result.unwrap().data.as_ref(), vec![0, 0]);
assert_eq!(result.unwrap().bin.as_ref(), vec![0, 0]);
}
#[tokio::test]
@@ -468,7 +475,7 @@ mod tests {
updates
.iter()
.skip(1)
.map(|u| u.created_at)
.map(|u| u.timestamp)
.collect::<Vec<_>>(),
)
.await