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()));
}
}