fix(ci): repair parking_lot migration regressions in PR #535
This commit is contained in:
parent
ee05d62ce4
commit
9e0958dee5
10 changed files with 51 additions and 115 deletions
|
|
@ -2,9 +2,9 @@ use super::sqlite::SqliteMemory;
|
|||
use super::traits::{Memory, MemoryCategory, MemoryEntry};
|
||||
use async_trait::async_trait;
|
||||
use chrono::Local;
|
||||
use parking_lot::Mutex;
|
||||
use std::collections::HashSet;
|
||||
use std::path::{Path, PathBuf};
|
||||
use parking_lot::Mutex;
|
||||
use std::time::{Duration, Instant};
|
||||
use tokio::process::Command;
|
||||
use tokio::time::timeout;
|
||||
|
|
@ -559,11 +559,12 @@ exit 1
|
|||
"local_note",
|
||||
"Local sqlite auth fallback note",
|
||||
MemoryCategory::Core,
|
||||
None,
|
||||
)
|
||||
.await
|
||||
.unwrap();
|
||||
|
||||
let entries = memory.recall("auth", 5).await.unwrap();
|
||||
let entries = memory.recall("auth", 5, None).await.unwrap();
|
||||
|
||||
assert!(entries
|
||||
.iter()
|
||||
|
|
|
|||
|
|
@ -7,10 +7,10 @@
|
|||
|
||||
use anyhow::Result;
|
||||
use chrono::{Duration, Local};
|
||||
use parking_lot::Mutex;
|
||||
use rusqlite::{params, Connection};
|
||||
use sha2::{Digest, Sha256};
|
||||
use std::path::{Path, PathBuf};
|
||||
use parking_lot::Mutex;
|
||||
|
||||
/// Response cache backed by a dedicated SQLite database.
|
||||
///
|
||||
|
|
|
|||
|
|
@ -3,9 +3,9 @@ use super::traits::{Memory, MemoryCategory, MemoryEntry};
|
|||
use super::vector;
|
||||
use async_trait::async_trait;
|
||||
use chrono::Local;
|
||||
use parking_lot::Mutex;
|
||||
use rusqlite::{params, Connection};
|
||||
use std::path::{Path, PathBuf};
|
||||
use parking_lot::Mutex;
|
||||
use std::sync::Arc;
|
||||
use uuid::Uuid;
|
||||
|
||||
|
|
@ -186,10 +186,7 @@ impl SqliteMemory {
|
|||
|
||||
// Check cache
|
||||
{
|
||||
let conn = self
|
||||
.conn
|
||||
.lock()
|
||||
.map_err(|e| anyhow::anyhow!("Lock error: {e}"))?;
|
||||
let conn = self.conn.lock();
|
||||
|
||||
let mut stmt =
|
||||
conn.prepare("SELECT embedding FROM embedding_cache WHERE content_hash = ?1")?;
|
||||
|
|
@ -211,10 +208,7 @@ impl SqliteMemory {
|
|||
|
||||
// Store in cache + LRU eviction
|
||||
{
|
||||
let conn = self
|
||||
.conn
|
||||
.lock()
|
||||
.map_err(|e| anyhow::anyhow!("Lock error: {e}"))?;
|
||||
let conn = self.conn.lock();
|
||||
|
||||
conn.execute(
|
||||
"INSERT OR REPLACE INTO embedding_cache (content_hash, embedding, created_at, accessed_at)
|
||||
|
|
@ -316,10 +310,7 @@ impl SqliteMemory {
|
|||
pub async fn reindex(&self) -> anyhow::Result<usize> {
|
||||
// Step 1: Rebuild FTS5
|
||||
{
|
||||
let conn = self
|
||||
.conn
|
||||
.lock()
|
||||
.map_err(|e| anyhow::anyhow!("Lock error: {e}"))?;
|
||||
let conn = self.conn.lock();
|
||||
|
||||
conn.execute_batch("INSERT INTO memories_fts(memories_fts) VALUES('rebuild');")?;
|
||||
}
|
||||
|
|
@ -330,10 +321,7 @@ impl SqliteMemory {
|
|||
}
|
||||
|
||||
let entries: Vec<(String, String)> = {
|
||||
let conn = self
|
||||
.conn
|
||||
.lock()
|
||||
.map_err(|e| anyhow::anyhow!("Lock error: {e}"))?;
|
||||
let conn = self.conn.lock();
|
||||
|
||||
let mut stmt =
|
||||
conn.prepare("SELECT id, content FROM memories WHERE embedding IS NULL")?;
|
||||
|
|
@ -347,10 +335,7 @@ impl SqliteMemory {
|
|||
for (id, content) in &entries {
|
||||
if let Ok(Some(emb)) = self.get_or_compute_embedding(content).await {
|
||||
let bytes = vector::vec_to_bytes(&emb);
|
||||
let conn = self
|
||||
.conn
|
||||
.lock()
|
||||
.map_err(|e| anyhow::anyhow!("Lock error: {e}"))?;
|
||||
let conn = self.conn.lock();
|
||||
conn.execute(
|
||||
"UPDATE memories SET embedding = ?1 WHERE id = ?2",
|
||||
params![bytes, id],
|
||||
|
|
@ -382,10 +367,7 @@ impl Memory for SqliteMemory {
|
|||
.await?
|
||||
.map(|emb| vector::vec_to_bytes(&emb));
|
||||
|
||||
let conn = self
|
||||
.conn
|
||||
.lock()
|
||||
.map_err(|e| anyhow::anyhow!("Lock error: {e}"))?;
|
||||
let conn = self.conn.lock();
|
||||
let now = Local::now().to_rfc3339();
|
||||
let cat = Self::category_to_str(&category);
|
||||
let id = Uuid::new_v4().to_string();
|
||||
|
|
@ -418,10 +400,7 @@ impl Memory for SqliteMemory {
|
|||
// Compute query embedding (async, before lock)
|
||||
let query_embedding = self.get_or_compute_embedding(query).await?;
|
||||
|
||||
let conn = self
|
||||
.conn
|
||||
.lock()
|
||||
.map_err(|e| anyhow::anyhow!("Lock error: {e}"))?;
|
||||
let conn = self.conn.lock();
|
||||
|
||||
// FTS5 BM25 keyword search
|
||||
let keyword_results = Self::fts5_search(&conn, query, limit * 2).unwrap_or_default();
|
||||
|
|
@ -540,10 +519,7 @@ impl Memory for SqliteMemory {
|
|||
}
|
||||
|
||||
async fn get(&self, key: &str) -> anyhow::Result<Option<MemoryEntry>> {
|
||||
let conn = self
|
||||
.conn
|
||||
.lock()
|
||||
.map_err(|e| anyhow::anyhow!("Lock error: {e}"))?;
|
||||
let conn = self.conn.lock();
|
||||
|
||||
let mut stmt = conn.prepare(
|
||||
"SELECT id, key, content, category, created_at, session_id FROM memories WHERE key = ?1",
|
||||
|
|
@ -572,10 +548,7 @@ impl Memory for SqliteMemory {
|
|||
category: Option<&MemoryCategory>,
|
||||
session_id: Option<&str>,
|
||||
) -> anyhow::Result<Vec<MemoryEntry>> {
|
||||
let conn = self
|
||||
.conn
|
||||
.lock()
|
||||
.map_err(|e| anyhow::anyhow!("Lock error: {e}"))?;
|
||||
let conn = self.conn.lock();
|
||||
|
||||
let mut results = Vec::new();
|
||||
|
||||
|
|
@ -628,29 +601,20 @@ impl Memory for SqliteMemory {
|
|||
}
|
||||
|
||||
async fn forget(&self, key: &str) -> anyhow::Result<bool> {
|
||||
let conn = self
|
||||
.conn
|
||||
.lock()
|
||||
.map_err(|e| anyhow::anyhow!("Lock error: {e}"))?;
|
||||
let conn = self.conn.lock();
|
||||
let affected = conn.execute("DELETE FROM memories WHERE key = ?1", params![key])?;
|
||||
Ok(affected > 0)
|
||||
}
|
||||
|
||||
async fn count(&self) -> anyhow::Result<usize> {
|
||||
let conn = self
|
||||
.conn
|
||||
.lock()
|
||||
.map_err(|e| anyhow::anyhow!("Lock error: {e}"))?;
|
||||
let conn = self.conn.lock();
|
||||
let count: i64 = conn.query_row("SELECT COUNT(*) FROM memories", [], |row| row.get(0))?;
|
||||
#[allow(clippy::cast_sign_loss, clippy::cast_possible_truncation)]
|
||||
Ok(count as usize)
|
||||
}
|
||||
|
||||
async fn health_check(&self) -> bool {
|
||||
self.conn
|
||||
.lock()
|
||||
.map(|c| c.execute_batch("SELECT 1").is_ok())
|
||||
.unwrap_or(false)
|
||||
self.conn.lock().execute_batch("SELECT 1").is_ok()
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue