unobtanium 3.0.0

Opinioated Web search engine library with crawler and viewer companion.
Documentation
use log::trace;

use crate::content::InformationSource;
use crate::content::RedirectData;
use crate::crawling::CrawlOutputMetadata;
use crate::crawling::Redirect;
use crate::database::crawler::structs::CrawlerDatabase;
use crate::database::crawler::structs::CrawlerDatabaseTransaction;
use crate::database::id::NumericDatabseId;
use crate::database::id::RedirectId;
use crate::database::DatabaseError;
use crate::database::error::SmuggleDatabaseErrorExtension;
use crate::database::sqlite_helper::*;


impl CrawlerDatabase {
	
	pub fn get_redirect(&self, id: RedirectId) -> Result<Redirect, DatabaseError> {
		trace!("crawler_db.get_redirect()");
		return self.connection().query_row(
			"SELECT
				crawl_log_id,
				request_id,
				url_id,
				last_modified_unix_utc,
				to_url_id,
				information_source,
				is_permanent,
				by_security_policy,
				to_url_fragment
			FROM redirect
			WHERE redirect_id = ?
			", (id,),
			|row| {
				Ok(Redirect {
					meta: CrawlOutputMetadata {
						crawl_log_entry: row.get(0)?,
						request_id: row.get(1)?,
						url: self.base().get_url_by_id(row.get(2)?)
							.smuggle_through_rusqlite()?,
						last_modified: from_unix_timestamp_opt(row.get(3)?),
					},
					data: RedirectData {
						to_url: url_with_fragment_from_row(self.base(), row, 4, 8)
							.smuggle_through_rusqlite()?,
						information_source: InformationSource::from_number(row.get(5)?),
						is_permanent: row.get(6)?,
						by_security_policy: row.get(7)?,
					}
				})
			}
		).map_err(Into::into);
	}
	
}

impl CrawlerDatabaseTransaction<'_> {
	pub fn store_redirect(
		&mut self,
		redirect: &Redirect
	) -> Result<RedirectId, DatabaseError> {
		self.base_transaction.assert_writable("store_redirect")?;
		
		trace!("crawler_db_transaction.store_redirect()");
		let url_id = self.base_transaction.get_url_id(&redirect.meta.url, true)?;
		let to_url_id = self.base_transaction.get_url_id(&redirect.data.to_url.clone().into(), true)?;
		self.store_crawler_found_link_by_id(to_url_id)?;
		self.connection().execute(
			"INSERT INTO redirect (
				crawl_log_id,
				request_id,
				url_id,
				last_modified_unix_utc,
				to_url_id,
				information_source,
				is_permanent,
				by_security_policy
			) Values (?,?,?,?, ?,?,?,?)
			",(
				redirect.meta.crawl_log_entry,
				redirect.meta.request_id,
				url_id,
				to_unix_timestamp_opt(redirect.meta.last_modified),
				to_url_id,
				redirect.data.information_source.to_number(),
				redirect.data.is_permanent,
				redirect.data.by_security_policy,
		))?;
		return Ok(RedirectId::new(self.connection().last_insert_rowid()));
	}

}