Add relay view to faster load controller_uid
This commit is contained in:
		
							parent
							
								
									277b159200
								
							
						
					
					
						commit
						d4ff664f74
					
				
					 16 changed files with 146 additions and 81 deletions
				
			
		| 
						 | 
				
			
			@ -1,6 +1,6 @@
 | 
			
		|||
{
 | 
			
		||||
  "db_name": "SQLite",
 | 
			
		||||
  "query": "SELECT * FROM relays WHERE controller_id = ?",
 | 
			
		||||
  "query": "SELECT * FROM v_relays WHERE id = ?",
 | 
			
		||||
  "describe": {
 | 
			
		||||
    "columns": [
 | 
			
		||||
      {
 | 
			
		||||
| 
						 | 
				
			
			@ -22,6 +22,11 @@
 | 
			
		|||
        "name": "controller_id",
 | 
			
		||||
        "ordinal": 3,
 | 
			
		||||
        "type_info": "Int64"
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        "name": "controller_uid",
 | 
			
		||||
        "ordinal": 4,
 | 
			
		||||
        "type_info": "Blob"
 | 
			
		||||
      }
 | 
			
		||||
    ],
 | 
			
		||||
    "parameters": {
 | 
			
		||||
| 
						 | 
				
			
			@ -31,8 +36,9 @@
 | 
			
		|||
      false,
 | 
			
		||||
      false,
 | 
			
		||||
      false,
 | 
			
		||||
      false,
 | 
			
		||||
      false
 | 
			
		||||
    ]
 | 
			
		||||
  },
 | 
			
		||||
  "hash": "c9437ff0c3014b269dcb21304fbad12237b9cb69ea6aa4686df6d5262065faa2"
 | 
			
		||||
  "hash": "2b5ac2227f48be1483f4097da6f890be8091daa97b0af548b6ebf60cdc03dfba"
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1,6 +1,6 @@
 | 
			
		|||
{
 | 
			
		||||
  "db_name": "SQLite",
 | 
			
		||||
  "query": "SELECT relays.* FROM relays INNER JOIN junction_relay_schedule\n\t\t\tON junction_relay_schedule.relay_id = relays.id\n\t\t\tWHERE junction_relay_schedule.schedule_id = ?\n\t\t\tORDER BY junction_relay_schedule.weekday",
 | 
			
		||||
  "query": "SELECT v_relays.* FROM v_relays INNER JOIN junction_tag ON junction_tag.relay_id = v_relays.id WHERE junction_tag.tag_id = ?",
 | 
			
		||||
  "describe": {
 | 
			
		||||
    "columns": [
 | 
			
		||||
      {
 | 
			
		||||
| 
						 | 
				
			
			@ -22,6 +22,11 @@
 | 
			
		|||
        "name": "controller_id",
 | 
			
		||||
        "ordinal": 3,
 | 
			
		||||
        "type_info": "Int64"
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        "name": "controller_uid",
 | 
			
		||||
        "ordinal": 4,
 | 
			
		||||
        "type_info": "Blob"
 | 
			
		||||
      }
 | 
			
		||||
    ],
 | 
			
		||||
    "parameters": {
 | 
			
		||||
| 
						 | 
				
			
			@ -31,8 +36,9 @@
 | 
			
		|||
      false,
 | 
			
		||||
      false,
 | 
			
		||||
      false,
 | 
			
		||||
      false,
 | 
			
		||||
      false
 | 
			
		||||
    ]
 | 
			
		||||
  },
 | 
			
		||||
  "hash": "2551c285e3e223311cff8e32022d8b11e95d56b2f166326301a0b6722fc1fd44"
 | 
			
		||||
  "hash": "493ad91be9ce523e9d0f03f5caa9b3255a5426d54901f4f3aa96ad152b05ffd0"
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1,6 +1,6 @@
 | 
			
		|||
{
 | 
			
		||||
  "db_name": "SQLite",
 | 
			
		||||
  "query": "SELECT relay.* FROM relays AS relay INNER JOIN junction_tag ON junction_tag.relay_id = relay.id WHERE junction_tag.tag_id = ?",
 | 
			
		||||
  "query": "SELECT * FROM v_relays WHERE v_relays.controller_id = ?",
 | 
			
		||||
  "describe": {
 | 
			
		||||
    "columns": [
 | 
			
		||||
      {
 | 
			
		||||
| 
						 | 
				
			
			@ -22,6 +22,11 @@
 | 
			
		|||
        "name": "controller_id",
 | 
			
		||||
        "ordinal": 3,
 | 
			
		||||
        "type_info": "Int64"
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        "name": "controller_uid",
 | 
			
		||||
        "ordinal": 4,
 | 
			
		||||
        "type_info": "Blob"
 | 
			
		||||
      }
 | 
			
		||||
    ],
 | 
			
		||||
    "parameters": {
 | 
			
		||||
| 
						 | 
				
			
			@ -31,8 +36,9 @@
 | 
			
		|||
      false,
 | 
			
		||||
      false,
 | 
			
		||||
      false,
 | 
			
		||||
      false,
 | 
			
		||||
      false
 | 
			
		||||
    ]
 | 
			
		||||
  },
 | 
			
		||||
  "hash": "e94ef5bc8b267d493375bb371dcfb7b09f6355ecbc8b6e1085d5f2f9a08cac3f"
 | 
			
		||||
  "hash": "4a99db9678cf8d1bdb082c4a13a1f5cdd699bfe7600389e37ca980b6fad12bb5"
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1,6 +1,6 @@
 | 
			
		|||
{
 | 
			
		||||
  "db_name": "SQLite",
 | 
			
		||||
  "query": "SELECT * FROM relays",
 | 
			
		||||
  "query": "SELECT * FROM v_relays",
 | 
			
		||||
  "describe": {
 | 
			
		||||
    "columns": [
 | 
			
		||||
      {
 | 
			
		||||
| 
						 | 
				
			
			@ -22,6 +22,11 @@
 | 
			
		|||
        "name": "controller_id",
 | 
			
		||||
        "ordinal": 3,
 | 
			
		||||
        "type_info": "Int64"
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        "name": "controller_uid",
 | 
			
		||||
        "ordinal": 4,
 | 
			
		||||
        "type_info": "Blob"
 | 
			
		||||
      }
 | 
			
		||||
    ],
 | 
			
		||||
    "parameters": {
 | 
			
		||||
| 
						 | 
				
			
			@ -31,8 +36,9 @@
 | 
			
		|||
      false,
 | 
			
		||||
      false,
 | 
			
		||||
      false,
 | 
			
		||||
      false,
 | 
			
		||||
      false
 | 
			
		||||
    ]
 | 
			
		||||
  },
 | 
			
		||||
  "hash": "ee7da56331bece2efe21b55dbd5f420d3abb08358a1abe301dc7e08693fbef4d"
 | 
			
		||||
  "hash": "5056b625241d9cbe63d98e00ac39085677c09be8be903804120c2d52579afdbb"
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1,38 +0,0 @@
 | 
			
		|||
{
 | 
			
		||||
  "db_name": "SQLite",
 | 
			
		||||
  "query": "INSERT INTO relays (name, number, controller_id) VALUES (?, ?, ?) RETURNING *",
 | 
			
		||||
  "describe": {
 | 
			
		||||
    "columns": [
 | 
			
		||||
      {
 | 
			
		||||
        "name": "id",
 | 
			
		||||
        "ordinal": 0,
 | 
			
		||||
        "type_info": "Int64"
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        "name": "name",
 | 
			
		||||
        "ordinal": 1,
 | 
			
		||||
        "type_info": "Text"
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        "name": "number",
 | 
			
		||||
        "ordinal": 2,
 | 
			
		||||
        "type_info": "Int64"
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        "name": "controller_id",
 | 
			
		||||
        "ordinal": 3,
 | 
			
		||||
        "type_info": "Int64"
 | 
			
		||||
      }
 | 
			
		||||
    ],
 | 
			
		||||
    "parameters": {
 | 
			
		||||
      "Right": 3
 | 
			
		||||
    },
 | 
			
		||||
    "nullable": [
 | 
			
		||||
      false,
 | 
			
		||||
      false,
 | 
			
		||||
      false,
 | 
			
		||||
      false
 | 
			
		||||
    ]
 | 
			
		||||
  },
 | 
			
		||||
  "hash": "5865f27b97487b6dfd956a3d260b9bbb0e6c203b721d29cf9149f60bfdd93465"
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1,6 +1,6 @@
 | 
			
		|||
{
 | 
			
		||||
  "db_name": "SQLite",
 | 
			
		||||
  "query": "SELECT * FROM relays WHERE controller_id = ? AND number = ?",
 | 
			
		||||
  "query": "SELECT * FROM v_relays WHERE v_relays.controller_id = ? AND v_relays.number = ?",
 | 
			
		||||
  "describe": {
 | 
			
		||||
    "columns": [
 | 
			
		||||
      {
 | 
			
		||||
| 
						 | 
				
			
			@ -22,6 +22,11 @@
 | 
			
		|||
        "name": "controller_id",
 | 
			
		||||
        "ordinal": 3,
 | 
			
		||||
        "type_info": "Int64"
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        "name": "controller_uid",
 | 
			
		||||
        "ordinal": 4,
 | 
			
		||||
        "type_info": "Blob"
 | 
			
		||||
      }
 | 
			
		||||
    ],
 | 
			
		||||
    "parameters": {
 | 
			
		||||
| 
						 | 
				
			
			@ -31,8 +36,9 @@
 | 
			
		|||
      false,
 | 
			
		||||
      false,
 | 
			
		||||
      false,
 | 
			
		||||
      false,
 | 
			
		||||
      false
 | 
			
		||||
    ]
 | 
			
		||||
  },
 | 
			
		||||
  "hash": "b41855e635ac409559fa63cba4c1285034c573b86e3193da3995606dee412153"
 | 
			
		||||
  "hash": "9224ad423f2c86f3d95f2b0b7d99a27f690020f89958dfc8dd6044a31afdb31d"
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										44
									
								
								.sqlx/query-adbce2c94ac0b54d0826b28f99fe63322d3bb1579e52d0f053307e24bd039ef9.json
									
										
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								.sqlx/query-adbce2c94ac0b54d0826b28f99fe63322d3bb1579e52d0f053307e24bd039ef9.json
									
										
									
										generated
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,44 @@
 | 
			
		|||
{
 | 
			
		||||
  "db_name": "SQLite",
 | 
			
		||||
  "query": "SELECT v_relays.* FROM v_relays INNER JOIN junction_relay_schedule\n\t\t\tON junction_relay_schedule.relay_id = v_relays.id\n\t\t\tWHERE junction_relay_schedule.schedule_id = ?\n\t\t\tORDER BY junction_relay_schedule.weekday",
 | 
			
		||||
  "describe": {
 | 
			
		||||
    "columns": [
 | 
			
		||||
      {
 | 
			
		||||
        "name": "id",
 | 
			
		||||
        "ordinal": 0,
 | 
			
		||||
        "type_info": "Int64"
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        "name": "name",
 | 
			
		||||
        "ordinal": 1,
 | 
			
		||||
        "type_info": "Text"
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        "name": "number",
 | 
			
		||||
        "ordinal": 2,
 | 
			
		||||
        "type_info": "Int64"
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        "name": "controller_id",
 | 
			
		||||
        "ordinal": 3,
 | 
			
		||||
        "type_info": "Int64"
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        "name": "controller_uid",
 | 
			
		||||
        "ordinal": 4,
 | 
			
		||||
        "type_info": "Blob"
 | 
			
		||||
      }
 | 
			
		||||
    ],
 | 
			
		||||
    "parameters": {
 | 
			
		||||
      "Right": 1
 | 
			
		||||
    },
 | 
			
		||||
    "nullable": [
 | 
			
		||||
      false,
 | 
			
		||||
      false,
 | 
			
		||||
      false,
 | 
			
		||||
      false,
 | 
			
		||||
      false
 | 
			
		||||
    ]
 | 
			
		||||
  },
 | 
			
		||||
  "hash": "adbce2c94ac0b54d0826b28f99fe63322d3bb1579e52d0f053307e24bd039ef9"
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1,6 +1,6 @@
 | 
			
		|||
{
 | 
			
		||||
  "db_name": "SQLite",
 | 
			
		||||
  "query": "SELECT * FROM relays WHERE id = ?",
 | 
			
		||||
  "query": "SELECT * FROM v_relays WHERE v_relays.id = ?",
 | 
			
		||||
  "describe": {
 | 
			
		||||
    "columns": [
 | 
			
		||||
      {
 | 
			
		||||
| 
						 | 
				
			
			@ -22,6 +22,11 @@
 | 
			
		|||
        "name": "controller_id",
 | 
			
		||||
        "ordinal": 3,
 | 
			
		||||
        "type_info": "Int64"
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        "name": "controller_uid",
 | 
			
		||||
        "ordinal": 4,
 | 
			
		||||
        "type_info": "Blob"
 | 
			
		||||
      }
 | 
			
		||||
    ],
 | 
			
		||||
    "parameters": {
 | 
			
		||||
| 
						 | 
				
			
			@ -31,8 +36,9 @@
 | 
			
		|||
      false,
 | 
			
		||||
      false,
 | 
			
		||||
      false,
 | 
			
		||||
      false,
 | 
			
		||||
      false
 | 
			
		||||
    ]
 | 
			
		||||
  },
 | 
			
		||||
  "hash": "4f5408e64f5e6a8dd923c3b147f993ce9e4cafc90204b06977481130ec06d111"
 | 
			
		||||
  "hash": "d57c388bf6c26fe6cadad35d0f254ca2ef93958f9975c585c6de3c437782995d"
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										12
									
								
								.sqlx/query-f85f0a96bb98d20e47677b0679d552812362c3141738b60bc63d673a7f552506.json
									
										
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								.sqlx/query-f85f0a96bb98d20e47677b0679d552812362c3141738b60bc63d673a7f552506.json
									
										
									
										generated
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,12 @@
 | 
			
		|||
{
 | 
			
		||||
  "db_name": "SQLite",
 | 
			
		||||
  "query": "INSERT INTO relays (name, number, controller_id) VALUES (?, ?, ?)",
 | 
			
		||||
  "describe": {
 | 
			
		||||
    "columns": [],
 | 
			
		||||
    "parameters": {
 | 
			
		||||
      "Right": 3
 | 
			
		||||
    },
 | 
			
		||||
    "nullable": []
 | 
			
		||||
  },
 | 
			
		||||
  "hash": "f85f0a96bb98d20e47677b0679d552812362c3141738b60bc63d673a7f552506"
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										1
									
								
								migrations/20240611000000_add_relays_view.down.sql
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								migrations/20240611000000_add_relays_view.down.sql
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1 @@
 | 
			
		|||
DROP VIEW v_relays;
 | 
			
		||||
							
								
								
									
										8
									
								
								migrations/20240611000000_add_relays_view.up.sql
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								migrations/20240611000000_add_relays_view.up.sql
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,8 @@
 | 
			
		|||
CREATE VIEW v_relays
 | 
			
		||||
AS
 | 
			
		||||
SELECT
 | 
			
		||||
	relays.*,
 | 
			
		||||
	controllers.uid AS controller_uid
 | 
			
		||||
FROM
 | 
			
		||||
	relays
 | 
			
		||||
INNER JOIN controllers ON controllers.id = relays.controller_id;
 | 
			
		||||
| 
						 | 
				
			
			@ -158,7 +158,7 @@ impl DbController {
 | 
			
		|||
	) -> Result<Vec<DbRelay>, DatabaseError> {
 | 
			
		||||
		sqlx::query_as!(
 | 
			
		||||
			DbRelay,
 | 
			
		||||
			"SELECT * FROM relays WHERE controller_id = ?",
 | 
			
		||||
			"SELECT * FROM v_relays WHERE v_relays.controller_id = ?",
 | 
			
		||||
			self.id
 | 
			
		||||
		)
 | 
			
		||||
		.fetch_all(conn.deref_mut())
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -50,8 +50,8 @@ impl DbJunctionRelaySchedule {
 | 
			
		|||
	) -> Result<Vec<DbRelay>, DatabaseError> {
 | 
			
		||||
		sqlx::query_as!(
 | 
			
		||||
			DbRelay,
 | 
			
		||||
			r#"SELECT relays.* FROM relays INNER JOIN junction_relay_schedule
 | 
			
		||||
			ON junction_relay_schedule.relay_id = relays.id
 | 
			
		||||
			r#"SELECT v_relays.* FROM v_relays INNER JOIN junction_relay_schedule
 | 
			
		||||
			ON junction_relay_schedule.relay_id = v_relays.id
 | 
			
		||||
			WHERE junction_relay_schedule.schedule_id = ?
 | 
			
		||||
			ORDER BY junction_relay_schedule.weekday"#,
 | 
			
		||||
			schedule.id
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -6,6 +6,7 @@ use sqlx::Sqlite;
 | 
			
		|||
 | 
			
		||||
use crate::db::{DbController, DbJunctionTag, DbTag};
 | 
			
		||||
use crate::errors::DatabaseError;
 | 
			
		||||
use crate::types::EmgauwaUid;
 | 
			
		||||
 | 
			
		||||
#[derive(Debug, Clone, Serialize, Deserialize)]
 | 
			
		||||
pub struct DbRelay {
 | 
			
		||||
| 
						 | 
				
			
			@ -13,13 +14,15 @@ pub struct DbRelay {
 | 
			
		|||
	pub id: i64,
 | 
			
		||||
	pub name: String,
 | 
			
		||||
	pub number: i64,
 | 
			
		||||
	#[serde(rename = "controller_id")]
 | 
			
		||||
	pub controller_uid: EmgauwaUid,
 | 
			
		||||
	#[serde(skip)]
 | 
			
		||||
	pub controller_id: i64,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl DbRelay {
 | 
			
		||||
	pub async fn get_all(conn: &mut PoolConnection<Sqlite>) -> Result<Vec<DbRelay>, DatabaseError> {
 | 
			
		||||
		sqlx::query_as!(DbRelay, "SELECT * FROM relays")
 | 
			
		||||
		sqlx::query_as!(DbRelay, "SELECT * FROM v_relays")
 | 
			
		||||
			.fetch_all(conn.deref_mut())
 | 
			
		||||
			.await
 | 
			
		||||
			.map_err(DatabaseError::from)
 | 
			
		||||
| 
						 | 
				
			
			@ -29,7 +32,7 @@ impl DbRelay {
 | 
			
		|||
		conn: &mut PoolConnection<Sqlite>,
 | 
			
		||||
		id: i64,
 | 
			
		||||
	) -> Result<Option<DbRelay>, DatabaseError> {
 | 
			
		||||
		sqlx::query_as!(DbRelay, "SELECT * FROM relays WHERE id = ?", id)
 | 
			
		||||
		sqlx::query_as!(DbRelay, "SELECT * FROM v_relays WHERE v_relays.id = ?", id)
 | 
			
		||||
			.fetch_optional(conn.deref_mut())
 | 
			
		||||
			.await
 | 
			
		||||
			.map_err(DatabaseError::from)
 | 
			
		||||
| 
						 | 
				
			
			@ -42,7 +45,7 @@ impl DbRelay {
 | 
			
		|||
	) -> Result<Option<DbRelay>, DatabaseError> {
 | 
			
		||||
		sqlx::query_as!(
 | 
			
		||||
			DbRelay,
 | 
			
		||||
			"SELECT * FROM relays WHERE controller_id = ? AND number = ?",
 | 
			
		||||
			"SELECT * FROM v_relays WHERE v_relays.controller_id = ? AND v_relays.number = ?",
 | 
			
		||||
			controller.id,
 | 
			
		||||
			number
 | 
			
		||||
		)
 | 
			
		||||
| 
						 | 
				
			
			@ -70,7 +73,7 @@ impl DbRelay {
 | 
			
		|||
		conn: &mut PoolConnection<Sqlite>,
 | 
			
		||||
		tag: &DbTag,
 | 
			
		||||
	) -> Result<Vec<DbRelay>, DatabaseError> {
 | 
			
		||||
		sqlx::query_as!(DbRelay, "SELECT relay.* FROM relays AS relay INNER JOIN junction_tag ON junction_tag.relay_id = relay.id WHERE junction_tag.tag_id = ?", tag.id)
 | 
			
		||||
		sqlx::query_as!(DbRelay, "SELECT v_relays.* FROM v_relays INNER JOIN junction_tag ON junction_tag.relay_id = v_relays.id WHERE junction_tag.tag_id = ?", tag.id)
 | 
			
		||||
			.fetch_all(conn.deref_mut())
 | 
			
		||||
			.await
 | 
			
		||||
			.map_err(DatabaseError::from)
 | 
			
		||||
| 
						 | 
				
			
			@ -82,16 +85,25 @@ impl DbRelay {
 | 
			
		|||
		new_number: i64,
 | 
			
		||||
		new_controller: &DbController,
 | 
			
		||||
	) -> Result<DbRelay, DatabaseError> {
 | 
			
		||||
		sqlx::query_as!(
 | 
			
		||||
			DbRelay,
 | 
			
		||||
			"INSERT INTO relays (name, number, controller_id) VALUES (?, ?, ?) RETURNING *",
 | 
			
		||||
		let result = sqlx::query!(
 | 
			
		||||
			"INSERT INTO relays (name, number, controller_id) VALUES (?, ?, ?)",
 | 
			
		||||
			new_name,
 | 
			
		||||
			new_number,
 | 
			
		||||
			new_controller.id,
 | 
			
		||||
		)
 | 
			
		||||
		.fetch_optional(conn.deref_mut())
 | 
			
		||||
		.await?
 | 
			
		||||
		.ok_or(DatabaseError::InsertGetError)
 | 
			
		||||
			.execute(conn.deref_mut())
 | 
			
		||||
			.await?;
 | 
			
		||||
 | 
			
		||||
		let last_insert_id = result.last_insert_rowid();
 | 
			
		||||
 | 
			
		||||
		sqlx::query_as!(
 | 
			
		||||
			DbRelay,
 | 
			
		||||
			"SELECT * FROM v_relays WHERE id = ?",
 | 
			
		||||
			last_insert_id
 | 
			
		||||
		)
 | 
			
		||||
			.fetch_one(conn.deref_mut())
 | 
			
		||||
			.await
 | 
			
		||||
			.map_err(DatabaseError::from)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	pub async fn delete(&self, conn: &mut PoolConnection<Sqlite>) -> Result<(), DatabaseError> {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -9,7 +9,7 @@ use sqlx::Sqlite;
 | 
			
		|||
 | 
			
		||||
use crate::db::DbController;
 | 
			
		||||
use crate::errors::{DatabaseError, EmgauwaError};
 | 
			
		||||
use crate::models::{convert_db_list_cache, FromDbModel, Relay};
 | 
			
		||||
use crate::models::{convert_db_list, FromDbModel, Relay};
 | 
			
		||||
use crate::types::{EmgauwaNow, RelayState, RelayStates};
 | 
			
		||||
 | 
			
		||||
#[derive(Serialize, Deserialize, Debug, Clone, MessageResponse)]
 | 
			
		||||
| 
						 | 
				
			
			@ -28,7 +28,7 @@ impl FromDbModel for Controller {
 | 
			
		|||
		db_model: Self::DbModel,
 | 
			
		||||
	) -> Result<Self, DatabaseError> {
 | 
			
		||||
		let relays_db = block_on(db_model.get_relays(conn))?;
 | 
			
		||||
		let cache = convert_db_list_cache(conn, relays_db, db_model.clone())?;
 | 
			
		||||
		let cache = convert_db_list(conn, relays_db)?;
 | 
			
		||||
		Self::from_db_model_cache(conn, db_model, cache)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -6,18 +6,16 @@ use serde_derive::{Deserialize, Serialize};
 | 
			
		|||
use sqlx::pool::PoolConnection;
 | 
			
		||||
use sqlx::Sqlite;
 | 
			
		||||
 | 
			
		||||
use crate::db::{DbController, DbJunctionRelaySchedule, DbRelay, DbSchedule};
 | 
			
		||||
use crate::db::{DbJunctionRelaySchedule, DbRelay, DbSchedule};
 | 
			
		||||
use crate::errors::DatabaseError;
 | 
			
		||||
use crate::models::FromDbModel;
 | 
			
		||||
use crate::types::{EmgauwaUid, RelayState};
 | 
			
		||||
use crate::types::RelayState;
 | 
			
		||||
use crate::utils;
 | 
			
		||||
 | 
			
		||||
#[derive(Serialize, Deserialize, Debug, Clone)]
 | 
			
		||||
pub struct Relay {
 | 
			
		||||
	#[serde(flatten)]
 | 
			
		||||
	pub r: DbRelay,
 | 
			
		||||
	pub controller: DbController,
 | 
			
		||||
	pub controller_id: EmgauwaUid,
 | 
			
		||||
	pub schedules: Vec<DbSchedule>,
 | 
			
		||||
	pub active_schedule: Option<DbSchedule>,
 | 
			
		||||
	pub override_schedule: Option<DbSchedule>,
 | 
			
		||||
| 
						 | 
				
			
			@ -27,32 +25,27 @@ pub struct Relay {
 | 
			
		|||
	// for internal use only.
 | 
			
		||||
	#[serde(skip)]
 | 
			
		||||
	pub pulsing: Option<Instant>,
 | 
			
		||||
	#[serde(
 | 
			
		||||
		skip,
 | 
			
		||||
		default = "utils::default_weekday",
 | 
			
		||||
	)]
 | 
			
		||||
	#[serde(skip, default = "utils::default_weekday")]
 | 
			
		||||
	pub override_schedule_weekday: Weekday,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
impl FromDbModel for Relay {
 | 
			
		||||
	type DbModel = DbRelay;
 | 
			
		||||
	type DbModelCache = DbController;
 | 
			
		||||
	type DbModelCache = ();
 | 
			
		||||
 | 
			
		||||
	fn from_db_model(
 | 
			
		||||
		conn: &mut PoolConnection<Sqlite>,
 | 
			
		||||
		db_model: Self::DbModel,
 | 
			
		||||
	) -> Result<Self, DatabaseError> {
 | 
			
		||||
		let cache = block_on(db_model.get_controller(conn))?;
 | 
			
		||||
		Self::from_db_model_cache(conn, db_model, cache)
 | 
			
		||||
		Self::from_db_model_cache(conn, db_model, ())
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	fn from_db_model_cache(
 | 
			
		||||
		conn: &mut PoolConnection<Sqlite>,
 | 
			
		||||
		db_model: Self::DbModel,
 | 
			
		||||
		cache: Self::DbModelCache,
 | 
			
		||||
		_cache: Self::DbModelCache,
 | 
			
		||||
	) -> Result<Self, DatabaseError> {
 | 
			
		||||
		let tags = block_on(db_model.get_tags(conn))?;
 | 
			
		||||
		let controller_id = cache.uid.clone();
 | 
			
		||||
 | 
			
		||||
		let schedules = block_on(DbJunctionRelaySchedule::get_schedules(conn, &db_model))?;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -60,8 +53,6 @@ impl FromDbModel for Relay {
 | 
			
		|||
 | 
			
		||||
		Ok(Relay {
 | 
			
		||||
			r: db_model,
 | 
			
		||||
			controller: cache,
 | 
			
		||||
			controller_id,
 | 
			
		||||
			schedules,
 | 
			
		||||
			active_schedule: None,
 | 
			
		||||
			override_schedule: None,
 | 
			
		||||
| 
						 | 
				
			
			@ -136,5 +127,4 @@ impl Relay {
 | 
			
		|||
			self.apply_state(&stated_relay.into());
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue