|
@@ -1,13 +1,53 @@
|
|
-use super::{EntityPart, EntityPartList, EntityPartVisitor};
|
|
|
|
|
|
+use crate::{db::DBConnection, schema::AssocData, DBResult};
|
|
|
|
+
|
|
|
|
+use super::{Entity, EntityDatum, EntityPart, EntityPartList, EntityPartVisitor};
|
|
|
|
+
|
|
|
|
+macro_rules! build_datum {
|
|
|
|
+ ($conn:ident, $ctx:ident, $base_rowid:ident,$stmt:ident,$idx:ident,$d:ident,$t:ident) => {
|
|
|
|
+ let ($d, $idx) = <$t::Datum as EntityDatum>::build_from(
|
|
|
|
+ AssocData {
|
|
|
|
+ conn: $conn.clone(),
|
|
|
|
+ ctx: $ctx,
|
|
|
|
+ base_name: <$t::Entity as Entity>::entity_name(),
|
|
|
|
+ part_name: $t::part_name(),
|
|
|
|
+ base_rowid: $base_rowid,
|
|
|
|
+ },
|
|
|
|
+ $stmt,
|
|
|
|
+ $idx,
|
|
|
|
+ )?;
|
|
|
|
+ };
|
|
|
|
+}
|
|
|
|
|
|
impl EntityPartList for () {
|
|
impl EntityPartList for () {
|
|
type DatumList = ();
|
|
type DatumList = ();
|
|
|
|
+
|
|
|
|
+ fn build_datum_list(
|
|
|
|
+ _conn: &DBConnection,
|
|
|
|
+ _ctx: &'static str,
|
|
|
|
+ _stmt: &mut sqlite::Statement<'static>,
|
|
|
|
+ ) -> DBResult<Self::DatumList> {
|
|
|
|
+ Ok(())
|
|
|
|
+ }
|
|
|
|
+
|
|
fn accept_part_visitor(_: &mut impl EntityPartVisitor) {}
|
|
fn accept_part_visitor(_: &mut impl EntityPartVisitor) {}
|
|
fn accept_part_visitor_ref(_: &Self::DatumList, _: &mut impl EntityPartVisitor) {}
|
|
fn accept_part_visitor_ref(_: &Self::DatumList, _: &mut impl EntityPartVisitor) {}
|
|
}
|
|
}
|
|
|
|
|
|
impl<P0: EntityPart> EntityPartList for P0 {
|
|
impl<P0: EntityPart> EntityPartList for P0 {
|
|
type DatumList = P0::Datum;
|
|
type DatumList = P0::Datum;
|
|
|
|
+
|
|
|
|
+ fn build_datum_list(
|
|
|
|
+ conn: &DBConnection,
|
|
|
|
+ ctx: &'static str,
|
|
|
|
+ stmt: &mut sqlite::Statement<'static>,
|
|
|
|
+ ) -> DBResult<Self::DatumList> {
|
|
|
|
+ let base_rowid: i64 = stmt.read(0)?;
|
|
|
|
+ let idx = 1; // starting index is 1 since index 0 is the ID
|
|
|
|
+ build_datum!(conn, ctx, base_rowid, stmt, idx, d0, P0);
|
|
|
|
+
|
|
|
|
+ Ok(d0)
|
|
|
|
+ }
|
|
|
|
+
|
|
fn accept_part_visitor(v: &mut impl EntityPartVisitor) {
|
|
fn accept_part_visitor(v: &mut impl EntityPartVisitor) {
|
|
v.visit::<P0>();
|
|
v.visit::<P0>();
|
|
}
|
|
}
|
|
@@ -18,6 +58,15 @@ impl<P0: EntityPart> EntityPartList for P0 {
|
|
|
|
|
|
impl<P0: EntityPart> EntityPartList for (P0,) {
|
|
impl<P0: EntityPart> EntityPartList for (P0,) {
|
|
type DatumList = P0::Datum;
|
|
type DatumList = P0::Datum;
|
|
|
|
+
|
|
|
|
+ fn build_datum_list(
|
|
|
|
+ conn: &DBConnection,
|
|
|
|
+ ctx: &'static str,
|
|
|
|
+ stmt: &mut sqlite::Statement<'static>,
|
|
|
|
+ ) -> DBResult<Self::DatumList> {
|
|
|
|
+ <P0 as EntityPartList>::build_datum_list(conn, ctx, stmt)
|
|
|
|
+ }
|
|
|
|
+
|
|
fn accept_part_visitor(v: &mut impl EntityPartVisitor) {
|
|
fn accept_part_visitor(v: &mut impl EntityPartVisitor) {
|
|
v.visit::<P0>();
|
|
v.visit::<P0>();
|
|
}
|
|
}
|
|
@@ -28,6 +77,20 @@ impl<P0: EntityPart> EntityPartList for (P0,) {
|
|
|
|
|
|
impl<P0: EntityPart, P1: EntityPart> EntityPartList for (P0, P1) {
|
|
impl<P0: EntityPart, P1: EntityPart> EntityPartList for (P0, P1) {
|
|
type DatumList = (P0::Datum, P1::Datum);
|
|
type DatumList = (P0::Datum, P1::Datum);
|
|
|
|
+
|
|
|
|
+ fn build_datum_list(
|
|
|
|
+ conn: &DBConnection,
|
|
|
|
+ ctx: &'static str,
|
|
|
|
+ stmt: &mut sqlite::Statement<'static>,
|
|
|
|
+ ) -> DBResult<Self::DatumList> {
|
|
|
|
+ let base_rowid: i64 = stmt.read(0)?;
|
|
|
|
+ let idx = 1; // starting index is 1 since index 0 is the ID
|
|
|
|
+ build_datum!(conn, ctx, base_rowid, stmt, idx, d0, P0);
|
|
|
|
+ build_datum!(conn, ctx, base_rowid, stmt, idx, d1, P1);
|
|
|
|
+
|
|
|
|
+ Ok((d0, d1))
|
|
|
|
+ }
|
|
|
|
+
|
|
fn accept_part_visitor(v: &mut impl EntityPartVisitor) {
|
|
fn accept_part_visitor(v: &mut impl EntityPartVisitor) {
|
|
v.visit::<P0>();
|
|
v.visit::<P0>();
|
|
v.visit::<P1>();
|
|
v.visit::<P1>();
|
|
@@ -40,6 +103,21 @@ impl<P0: EntityPart, P1: EntityPart> EntityPartList for (P0, P1) {
|
|
|
|
|
|
impl<P0: EntityPart, P1: EntityPart, P2: EntityPart> EntityPartList for (P0, P1, P2) {
|
|
impl<P0: EntityPart, P1: EntityPart, P2: EntityPart> EntityPartList for (P0, P1, P2) {
|
|
type DatumList = (P0::Datum, P1::Datum, P2::Datum);
|
|
type DatumList = (P0::Datum, P1::Datum, P2::Datum);
|
|
|
|
+
|
|
|
|
+ fn build_datum_list(
|
|
|
|
+ conn: &DBConnection,
|
|
|
|
+ ctx: &'static str,
|
|
|
|
+ stmt: &mut sqlite::Statement<'static>,
|
|
|
|
+ ) -> DBResult<Self::DatumList> {
|
|
|
|
+ let base_rowid: i64 = stmt.read(0)?;
|
|
|
|
+ let idx = 1; // starting index is 1 since index 0 is the ID
|
|
|
|
+ build_datum!(conn, ctx, base_rowid, stmt, idx, d0, P0);
|
|
|
|
+ build_datum!(conn, ctx, base_rowid, stmt, idx, d1, P1);
|
|
|
|
+ build_datum!(conn, ctx, base_rowid, stmt, idx, d2, P2);
|
|
|
|
+
|
|
|
|
+ Ok((d0, d1, d2))
|
|
|
|
+ }
|
|
|
|
+
|
|
fn accept_part_visitor(v: &mut impl EntityPartVisitor) {
|
|
fn accept_part_visitor(v: &mut impl EntityPartVisitor) {
|
|
v.visit::<P0>();
|
|
v.visit::<P0>();
|
|
v.visit::<P1>();
|
|
v.visit::<P1>();
|
|
@@ -56,6 +134,22 @@ impl<P0: EntityPart, P1: EntityPart, P2: EntityPart, P3: EntityPart> EntityPartL
|
|
for (P0, P1, P2, P3)
|
|
for (P0, P1, P2, P3)
|
|
{
|
|
{
|
|
type DatumList = (P0::Datum, P1::Datum, P2::Datum, P3::Datum);
|
|
type DatumList = (P0::Datum, P1::Datum, P2::Datum, P3::Datum);
|
|
|
|
+
|
|
|
|
+ fn build_datum_list(
|
|
|
|
+ conn: &DBConnection,
|
|
|
|
+ ctx: &'static str,
|
|
|
|
+ stmt: &mut sqlite::Statement<'static>,
|
|
|
|
+ ) -> DBResult<Self::DatumList> {
|
|
|
|
+ let base_rowid: i64 = stmt.read(0)?;
|
|
|
|
+ let idx = 1; // starting index is 1 since index 0 is the ID
|
|
|
|
+ build_datum!(conn, ctx, base_rowid, stmt, idx, d0, P0);
|
|
|
|
+ build_datum!(conn, ctx, base_rowid, stmt, idx, d1, P1);
|
|
|
|
+ build_datum!(conn, ctx, base_rowid, stmt, idx, d2, P2);
|
|
|
|
+ build_datum!(conn, ctx, base_rowid, stmt, idx, d3, P3);
|
|
|
|
+
|
|
|
|
+ Ok((d0, d1, d2, d3))
|
|
|
|
+ }
|
|
|
|
+
|
|
fn accept_part_visitor(v: &mut impl EntityPartVisitor) {
|
|
fn accept_part_visitor(v: &mut impl EntityPartVisitor) {
|
|
v.visit::<P0>();
|
|
v.visit::<P0>();
|
|
v.visit::<P1>();
|
|
v.visit::<P1>();
|