unobtanium 3.0.0

Opinioated Web search engine library with crawler and viewer companion.
Documentation
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);
	}

}