use rusqlite::params;
use crate::error::Result;
use super::Store;
use crate::types::{Target, ValueType};
impl Store {
pub fn insert_promised(
&self,
target: &Target,
key: &str,
value_type: &ValueType,
) -> Result<bool> {
let target_type_str = target.target_type().as_str();
let target_value = target.value().unwrap_or("");
let rows = self.conn.execute(
"INSERT OR IGNORE INTO metadata (target_type, target_value, key, value, value_type, last_timestamp, is_git_ref, is_promised)
VALUES (?1, ?2, ?3, '', ?4, 0, 0, 1)",
params![target_type_str, target_value, key, value_type.as_str()],
)?;
Ok(rows > 0)
}
#[cfg(feature = "internal")]
pub fn resolve_promised(
&self,
target: &Target,
key: &str,
value: &str,
value_type: &ValueType,
is_git_ref: bool,
) -> Result<()> {
let target_type_str = target.target_type().as_str();
let target_value = target.value().unwrap_or("");
let git_ref_val: i64 = if is_git_ref { 1 } else { 0 };
self.conn.execute(
"UPDATE metadata SET value = ?4, value_type = ?5, is_git_ref = ?6, is_promised = 0
WHERE target_type = ?1 AND target_value = ?2 AND key = ?3 AND is_promised = 1",
params![
target_type_str,
target_value,
key,
value,
value_type.as_str(),
git_ref_val
],
)?;
Ok(())
}
#[cfg(feature = "internal")]
pub fn delete_promised(&self, target: &Target, key: &str) -> Result<()> {
let target_type_str = target.target_type().as_str();
let target_value = target.value().unwrap_or("");
self.conn.execute(
"DELETE FROM metadata WHERE target_type = ?1 AND target_value = ?2 AND key = ?3 AND is_promised = 1",
params![target_type_str, target_value, key],
)?;
Ok(())
}
#[cfg(feature = "internal")]
pub fn count_promised_keys(&self) -> Result<Vec<(String, u64)>> {
let mut stmt = self.conn.prepare(
"SELECT target_type, COUNT(*) FROM metadata WHERE is_promised = 1 GROUP BY target_type ORDER BY target_type",
)?;
let rows = stmt.query_map([], |row| {
Ok((row.get::<_, String>(0)?, row.get::<_, i64>(1)? as u64))
})?;
let mut results = Vec::new();
for row in rows {
results.push(row?);
}
Ok(results)
}
#[cfg(feature = "internal")]
pub fn get_promised_keys(&self) -> Result<Vec<(String, String, String)>> {
let mut stmt = self.conn.prepare(
"SELECT target_type, target_value, key FROM metadata WHERE is_promised = 1 ORDER BY target_type, target_value, key",
)?;
let rows = stmt.query_map([], |row| {
Ok((
row.get::<_, String>(0)?,
row.get::<_, String>(1)?,
row.get::<_, String>(2)?,
))
})?;
let mut results = Vec::new();
for row in rows {
results.push(row?);
}
Ok(results)
}
}