Skip to content

Commit

Permalink
[NEW] added funtions to get abstract system coordinates (to help buil…
Browse files Browse the repository at this point in the history
…d the region schematic map)
  • Loading branch information
rafaga committed Apr 5, 2024
1 parent 0b7243f commit b8f2c00
Show file tree
Hide file tree
Showing 2 changed files with 126 additions and 45 deletions.
4 changes: 2 additions & 2 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -46,11 +46,11 @@ puffin = { version = "0.19.0", optional = true, default-features = false}

# Not Windows:
[target.'cfg(not(windows))'.dependencies]
rusqlite = { version = "0.31.0", features = ["bundled-sqlcipher", "backup", "blob"] }
rusqlite = { version = "0.31.0", features = ["bundled-sqlcipher", "backup", "blob", "array"] }

# Windows:
[target.'cfg(windows)'.dependencies]
rusqlite = { version = "0.31.0", features = ["bundled-sqlcipher-vendored-openssl", "backup", "blob"] }
rusqlite = { version = "0.31.0", features = ["bundled-sqlcipher-vendored-openssl", "backup", "blob", "array"] }

[dev-dependencies]
# tokio = { version = "1", features = ["tokio-macros", "rt", "rt-multi-thread", "macros"] }
Expand Down
167 changes: 124 additions & 43 deletions src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,10 @@
use crate::objects::{SdePoint, Universe};
use egui_map::map::objects::{MapLine, MapPoint, RawPoint};
use objects::EveRegionArea;
use rusqlite::{params, Connection, Error, OpenFlags};
use rusqlite::{params, vtab::array, Connection, Error, OpenFlags};
use std::collections::HashMap;
use std::path::Path;
use std::rc::Rc;

/// Module that has Data object abstractions to fill with the database data.
pub mod objects;
Expand Down Expand Up @@ -60,10 +61,7 @@ impl<'a> SdeManager<'a> {
#[cfg(feature = "puffin")]
puffin::profile_scope!("get_universe");

let mut flags = OpenFlags::default();
flags.set(OpenFlags::SQLITE_OPEN_NO_MUTEX, false);
flags.set(OpenFlags::SQLITE_OPEN_FULL_MUTEX, true);
let connection = Connection::open_with_flags(self.path, flags)?;
let connection = self.get_standart_connection()?;
//let connection = sqlite::Connection::open_with_full_mutex(self.path)?;
// Getting all regions in the main process because is not very intensive
let regions = self.universe.get_region(&connection, None)?;
Expand Down Expand Up @@ -110,10 +108,7 @@ impl<'a> SdeManager<'a> {
_ => None,
};

let mut flags = OpenFlags::default();
flags.set(OpenFlags::SQLITE_OPEN_NO_MUTEX, false);
flags.set(OpenFlags::SQLITE_OPEN_FULL_MUTEX, true);
let connection = Connection::open_with_flags(self.path, flags)?;
let connection = self.get_standart_connection()?;
let solar_systems =
self.universe
.get_solarsystem(connection, parent_ids, self.invert_coordinates)?;
Expand Down Expand Up @@ -141,13 +136,9 @@ impl<'a> SdeManager<'a> {
pub fn get_systempoints(&self) -> Result<HashMap<usize, MapPoint>, Error> {
#[cfg(feature = "puffin")]
puffin::profile_scope!("get_systempoints");
let connection = self.get_standart_connection()?;

let mut hash_map: HashMap<usize, MapPoint> = HashMap::new();
let mut flags = OpenFlags::default();
flags.set(OpenFlags::SQLITE_OPEN_NO_MUTEX, false);
flags.set(OpenFlags::SQLITE_OPEN_FULL_MUTEX, true);
let connection = Connection::open_with_flags(self.path, flags)?;

// centerX, centerY, centerZ,
let mut query = String::from("SELECT SolarSystemId, projX, projY, projZ, SolarSystemName ");
query += " FROM mapSolarSystems WHERE SolarSystemId BETWEEN ?1 AND ?2;";
Expand Down Expand Up @@ -183,10 +174,7 @@ impl<'a> SdeManager<'a> {
#[cfg(feature = "puffin")]
puffin::profile_scope!("get_system_connections");

let mut flags = OpenFlags::default();
flags.set(OpenFlags::SQLITE_OPEN_NO_MUTEX, false);
flags.set(OpenFlags::SQLITE_OPEN_FULL_MUTEX, true);
let connection = Connection::open_with_flags(self.path, flags)?;
let connection = self.get_standart_connection()?;

let mut query = String::from("SELECT systemConnectionId, ");
query += "systemA, systemB FROM mapSystemConnections;";
Expand Down Expand Up @@ -217,10 +205,8 @@ impl<'a> SdeManager<'a> {
pub fn get_region_coordinates(&self) -> Result<Vec<EveRegionArea>, Error> {
#[cfg(feature = "puffin")]
puffin::profile_scope!("get_region_coordinates");
let mut flags = OpenFlags::default();
flags.set(OpenFlags::SQLITE_OPEN_NO_MUTEX, false);
flags.set(OpenFlags::SQLITE_OPEN_FULL_MUTEX, true);
let connection = Connection::open_with_flags(self.path, flags)?;
let connection = self.get_standart_connection()?;

let mut query = String::from("SELECT reg.regionId, reg.regionName, ");
query += "AX(reg.max_x) AS region_max_x, MAX(reg.max_y) AS region_max_y, ";
query += "MAX(reg.max_z) AS region_max_z, MIN(reg.min_x) AS region_min_x, ";
Expand Down Expand Up @@ -264,10 +250,7 @@ impl<'a> SdeManager<'a> {
pub fn get_system_id(self, name: String) -> Result<Vec<(usize, String, usize, String)>, Error> {
#[cfg(feature = "puffin")]
puffin::profile_scope!("get_system_id");
let mut flags = OpenFlags::default();
flags.set(OpenFlags::SQLITE_OPEN_NO_MUTEX, false);
flags.set(OpenFlags::SQLITE_OPEN_FULL_MUTEX, true);
let connection = Connection::open_with_flags(self.path, flags)?;
let connection = self.get_standart_connection()?;

let mut query = String::from(
"SELECT mss.SolarSystemId, mss.SolarSystemName, mr.RegionId, mr.regionName ",
Expand All @@ -291,10 +274,7 @@ impl<'a> SdeManager<'a> {
pub fn get_system_coords(self, id_node: usize) -> Result<Option<SdePoint>, Error> {
#[cfg(feature = "puffin")]
puffin::profile_scope!("get_system_coords");
let mut flags = OpenFlags::default();
flags.set(OpenFlags::SQLITE_OPEN_NO_MUTEX, false);
flags.set(OpenFlags::SQLITE_OPEN_FULL_MUTEX, true);
let connection = Connection::open_with_flags(self.path, flags)?;
let connection = self.get_standart_connection()?;

let mut query = String::from("SELECT mss.ProjX, mss.ProjY, mss.ProjZ ");
query += "FROM mapSolarSystems AS mss WHERE mss.SolarSystemId = ?1; ";
Expand All @@ -321,10 +301,7 @@ impl<'a> SdeManager<'a> {
#[cfg(feature = "puffin")]
puffin::profile_scope!("get_connections");

let mut flags = OpenFlags::default();
flags.set(OpenFlags::SQLITE_OPEN_NO_MUTEX, false);
flags.set(OpenFlags::SQLITE_OPEN_FULL_MUTEX, true);
let connection = Connection::open_with_flags(self.path, flags)?;
let connection = self.get_standart_connection()?;

let mut query = String::from("SELECT msc.systemConnectionId, ");
query += "mssa.projX, mssa.projY, mssa.projZ, mssb.projX, mssb.projY, mssb.projZ ";
Expand Down Expand Up @@ -360,26 +337,31 @@ impl<'a> SdeManager<'a> {

pub fn get_abstract_systems(
self,
regions: Option<usize>,
regions: Vec<u32>,
) -> Result<HashMap<usize, MapPoint>, Error> {
#[cfg(feature = "puffin")]
puffin::profile_scope!("get_abstract_systems");

let mut flags = OpenFlags::default();
flags.set(OpenFlags::SQLITE_OPEN_NO_MUTEX, false);
flags.set(OpenFlags::SQLITE_OPEN_FULL_MUTEX, true);
let connection = Connection::open_with_flags(self.path, flags)?;
let connection = self.get_standart_connection()?;

let mut query = String::from("SELECT mas.solarSystemId, ");
query += "mas.x, mas.y, mas.regionId FROM mapAbstractSystems ";
query += " WHERE regionId = ?1;";
if !regions.is_empty() {
query += " WHERE regionId IN rarray(?1);";
}

let mut statement = connection.prepare(query.as_str())?;
let mut rows;
if regions.is_some() {
rows = statement.query([regions.unwrap()])?;
} else {
if regions.is_empty() {
rows = statement.query([])?;
} else {
let id_list: array::Array = Rc::new(
regions
.into_iter()
.map(rusqlite::types::Value::from)
.collect::<Vec<rusqlite::types::Value>>(),
);
rows = statement.query([id_list])?;
}
let mut hash_map: HashMap<usize, MapPoint> = HashMap::new();
while let Some(row) = rows.next()? {
Expand All @@ -391,4 +373,103 @@ impl<'a> SdeManager<'a> {
}
Ok(hash_map)
}

pub fn get_abstract_system_connections(
self,
mut hash_map: HashMap<usize, MapPoint>,
regions: Vec<u32>,
) -> Result<HashMap<usize, MapPoint>, Error> {
#[cfg(feature = "puffin")]
puffin::profile_scope!("get_abstract_system_connections");

let connection = self.get_standart_connection()?;

let mut query =
String::from("SELECT mas.solarSystemId, mas.regionId, msc.systemConnectionId ");
query += " FROM mapAbstractSystems AS mas INNER JOIN mapSystemConnections AS msc ";
query += " ON(msc.systemA = mas.solarSystemId OR msc.systemB = mas.solarSystemId) ";
if !regions.is_empty() {
query += " WHERE mas.regionId IN rarray(?1);";
}

let mut statement = connection.prepare(query.as_str())?;
let mut rows;
if regions.is_empty() {
rows = statement.query([])?;
} else {
let id_list: array::Array = Rc::new(
regions
.into_iter()
.map(rusqlite::types::Value::from)
.collect::<Vec<rusqlite::types::Value>>(),
);
rows = statement.query([id_list])?;
}
while let Some(row) = rows.next()? {
hash_map
.entry(row.get::<usize, usize>(0)?)
.and_modify(|map_point| {
if let Ok(hash) = row.get::<usize, String>(2) {
map_point.connections.push(hash);
}
});
}
Ok(hash_map)
}

pub fn get_abstract_connections(
self,
regions: Vec<u32>,
) -> Result<HashMap<String, MapLine>, Error> {
#[cfg(feature = "puffin")]
puffin::profile_scope!("get_abstract_connections");

let connection = self.get_standart_connection()?;

let mut query = String::from("SELECT msc.systemConnectionId, ");
query += "masa.x, masa.y, masb.x, masb.y ";
query += "FROM mapSystemConnections AS msc INNER JOIN mapAbstractSystems AS masa ";
query += "ON(msc.systemA = masa.solarSystemId) INNER JOIN mapAbstractSystems AS masb ";
query += "ON(msc.systemB = masb.solarSystemId);";
if !regions.is_empty() {
query += " WHERE masa.regionId IN rarray(?1) OR masb.regionId IN rarray(?2);";
}

let mut statement = connection.prepare(query.as_str())?;
let mut rows;
if regions.is_empty() {
rows = statement.query([])?;
} else {
let id_list: array::Array = Rc::new(
regions
.into_iter()
.map(rusqlite::types::Value::from)
.collect::<Vec<rusqlite::types::Value>>(),
);
rows = statement.query([id_list.clone(), id_list])?;
}

let mut hash_map: HashMap<String, MapLine> = HashMap::new();
while let Some(row) = rows.next()? {
let mut line = MapLine::new(
RawPoint::new(row.get::<usize, f32>(1)?, row.get::<usize, f32>(2)?),
RawPoint::new(row.get::<usize, f32>(3)?, row.get::<usize, f32>(4)?),
);
line.id = Some(row.get::<usize, String>(0)?);
hash_map.entry(row.get::<usize, String>(0)?).or_insert(line);
}

Ok(hash_map)
}

fn get_standart_connection(&self) -> Result<Connection, Error> {
let mut flags = OpenFlags::default();
flags.set(OpenFlags::SQLITE_OPEN_NO_MUTEX, false);
flags.set(OpenFlags::SQLITE_OPEN_FULL_MUTEX, true);
let connection = Connection::open_with_flags(self.path, flags)?;

// we add the carray module disguised as rarray in rusqlite
array::load_module(&connection)?;
Ok(connection)
}
}

0 comments on commit b8f2c00

Please sign in to comment.