use log::trace;
use uuid::Uuid;
use std::collections::HashMap;
use crate::crawling::Agent;
use crate::database::crawler::structs::CrawlerDatabase;
use crate::database::DatabaseError;
use crate::database::id::{AgentId, NumericDatabseId};
use crate::database::sqlite_helper::*;
impl CrawlerDatabase {
pub fn add_agent(&mut self, agent: &Agent) -> Result<AgentId, DatabaseError> {
trace!("crawler_db.add_agent()");
self.connection().execute(
"INSERT INTO agent (
time_started_unix_utc,
time_finished_unix_utc,
agent_uuid,
name,
http_user_agent
) VALUES (
?,?,?,?,?
)", (
agent.time_started.timestamp(),
to_unix_timestamp_opt(agent.time_finished),
agent.uuid,
agent.name.clone(),
agent.http_user_agent.clone(),
)
)?;
return Ok(AgentId::new(self.connection().last_insert_rowid()));
}
pub fn mark_agent_finished_now(
&mut self,
id: AgentId
) -> Result<(), DatabaseError> {
trace!("crawler_db.mark_agent_finished_now()");
self.connection().execute(
"UPDATE agent
SET
time_started_unix_utc = strftime('%s')
WHERE
agent_id = ?
", (id,)
)?;
Ok(())
}
pub fn get_agent(&self, id: AgentId) -> Result<Agent, DatabaseError> {
trace!("crawler_db.get_agent()");
return self.connection().query_row(
"SELECT
time_started_unix_utc,
time_finished_unix_utc,
agent_uuid,
name,
http_user_agent
FROM agent
WHERE agent_id = ?
", (id,),
|row| Ok(Agent {
time_started: from_unix_timestamp_or_epoch(row.get(0)?),
time_finished: from_unix_timestamp_opt(row.get(1)?),
uuid: row.get(2)?,
name: row.get(3)?,
http_user_agent: row.get(4)?,
})
).map_err(Into::into);
}
pub fn get_all_agents_id_to_uuid(
&self
) -> Result<HashMap<AgentId,Uuid>, DatabaseError> {
trace!("crawler_db.get_all_agents_id_to_uuid()");
let mut statemnt = self.connection().prepare(
"SELECT agent_id, agent_uuid
FROM agent"
)?;
let mut map = HashMap::new();
for (id,uuid) in (statemnt.query_map((), |row| {
return Ok((row.get::<usize,AgentId>(0)?, row.get::<usize,Uuid>(1)?));
})?).flatten() {
map.insert(id, uuid);
}
return Ok(map);
}
}