use diesel::prelude::*;
#[cfg(feature = "napi")]
use napi_derive::napi;
#[cfg(feature = "pyo3")]
use pyo3::prelude::*;
#[cfg(feature = "pyo3")]
use rbox_derives::PyMutableMapping;
use super::hot_cue_bank_list::HotCueBankListCue;
use super::schema::cue;
use crate::model_traits::{Model, ModelDelete, ModelUpdate};
#[cfg(feature = "pyo3")]
use crate::util::{PyItemsIter, PyObjectIter, PyStrIter};
#[derive(Debug, Clone, PartialEq, HasQuery, Identifiable, AsChangeset)]
#[diesel(table_name = cue)]
#[diesel(primary_key(id))]
#[diesel(check_for_backend(diesel::sqlite::Sqlite))]
#[cfg_attr(feature = "pyo3", pyclass(get_all, set_all, mapping))]
#[cfg_attr(feature = "pyo3", derive(PyMutableMapping))]
#[cfg_attr(feature = "napi", napi(object))]
pub struct Cue {
pub id: i32,
pub content_id: i32,
pub kind: Option<i32>,
pub color_table_index: Option<i32>,
pub cue_comment: Option<String>,
pub is_active_loop: Option<i32>,
pub beat_loop_numerator: Option<i32>,
pub beat_loop_denominator: Option<i32>,
pub in_usec: Option<i32>,
pub out_usec: Option<i32>,
pub in150_frame_per_sec: Option<i32>,
pub out150_frame_per_sec: Option<i32>,
pub in_mpeg_frame_number: Option<i32>,
pub out_mpeg_frame_number: Option<i32>,
pub in_mpeg_abs: Option<i32>,
pub out_mpeg_abs: Option<i32>,
pub in_decoding_start_frame_position: Option<i32>,
pub out_decoding_start_frame_position: Option<i32>,
pub in_file_offset_in_block: Option<i32>,
pub out_file_offset_in_block: Option<i32>,
pub in_number_of_sample_in_block: Option<i32>,
pub out_number_of_sample_in_block: Option<i32>,
}
impl Model for Cue {
type Id = i32;
fn all(conn: &mut SqliteConnection) -> QueryResult<Vec<Self>> {
Self::query().load(conn)
}
fn find(conn: &mut SqliteConnection, id: &Self::Id) -> QueryResult<Option<Self>> {
Self::query().find(id).first(conn).optional()
}
fn id_exists(conn: &mut SqliteConnection, id: &Self::Id) -> QueryResult<bool> {
diesel::dsl::select(diesel::dsl::exists(Self::query().find(id))).get_result(conn)
}
}
impl ModelUpdate for Cue {
fn update(self, conn: &mut SqliteConnection) -> QueryResult<Self> {
diesel::update(cue::table.find(self.id))
.set(self)
.get_result(conn)
}
}
impl ModelDelete for Cue {
fn delete(conn: &mut SqliteConnection, id: &Self::Id) -> QueryResult<usize> {
let mut result = diesel::delete(cue::table.find(id)).execute(conn)?;
result += HotCueBankListCue::delete_by_cue_id(conn, *id)?;
Ok(result)
}
fn delete_all(conn: &mut SqliteConnection, ids: Vec<&Self::Id>) -> QueryResult<usize> {
let mut result = diesel::delete(cue::table.filter(cue::id.eq_any(&ids))).execute(conn)?;
let ids: Vec<i32> = ids.iter().map(|&id| *id).collect();
result += HotCueBankListCue::delete_by_cue_ids(conn, &ids)?;
Ok(result)
}
}
impl Cue {
pub fn delete_by_content_id(conn: &mut SqliteConnection, id: i32) -> QueryResult<usize> {
let deleted_ids: Vec<i32> = diesel::delete(cue::table.filter(cue::content_id.eq(id)))
.returning(cue::id)
.get_results(conn)?;
let mut result = deleted_ids.len();
result += HotCueBankListCue::delete_by_cue_ids(conn, &deleted_ids)?;
Ok(result)
}
pub fn delete_by_content_ids(conn: &mut SqliteConnection, ids: &[i32]) -> QueryResult<usize> {
let deleted_ids: Vec<i32> = diesel::delete(cue::table.filter(cue::content_id.eq_any(ids)))
.returning(cue::id)
.get_results(conn)?;
let mut result = deleted_ids.len();
result += HotCueBankListCue::delete_by_cue_ids(conn, &deleted_ids)?;
Ok(result)
}
}