1use gen_core::traits::Capnp;
2use rusqlite::Row;
3
4use crate::{db::GraphConnection, gen_models_capnp::metadata, traits::*};
5
6#[derive(Clone, Debug, PartialEq)]
7pub struct Metadata {
8 pub db_uuid: String,
9}
10
11impl<'a> Capnp<'a> for Metadata {
12 type Builder = metadata::Builder<'a>;
13 type Reader = metadata::Reader<'a>;
14
15 fn write_capnp(&self, builder: &mut Self::Builder) {
16 builder.set_db_uuid(&self.db_uuid);
17 }
18
19 fn read_capnp(reader: Self::Reader) -> Self {
20 let db_uuid = reader.get_db_uuid().unwrap().to_string().unwrap();
21 Metadata { db_uuid }
22 }
23}
24
25impl Query for Metadata {
26 type Model = Metadata;
27
28 const TABLE_NAME: &'static str = "gen_metadata";
29
30 fn process_row(row: &Row) -> Self::Model {
31 Metadata {
32 db_uuid: row.get(0).unwrap(),
33 }
34 }
35}
36
37impl Metadata {
38 pub fn get_db_uuid(conn: &GraphConnection) -> String {
39 let metadata = Metadata::get(conn, "SELECT db_uuid FROM gen_metadata LIMIT 1", [])
40 .expect("Failed to get database UUID from metadata");
41 metadata.db_uuid
42 }
43
44 pub fn get_all(conn: &GraphConnection) -> Vec<Metadata> {
45 Metadata::query(conn, "SELECT db_uuid FROM gen_metadata", [])
46 }
47}
48
49pub fn get_db_uuid(conn: &GraphConnection) -> String {
51 Metadata::get_db_uuid(conn)
52}
53
54#[cfg(test)]
55mod tests {
56 use capnp::message::TypedBuilder;
58
59 use super::*;
60 use crate::test_helpers::get_connection;
61
62 #[test]
63 fn test_metadata_capnp_serialization() {
64 let metadata = Metadata {
65 db_uuid: "test-uuid-12345".to_string(),
66 };
67
68 let mut message = TypedBuilder::<metadata::Owned>::new_default();
69 let mut root = message.init_root();
70 metadata.write_capnp(&mut root);
71
72 let deserialized = Metadata::read_capnp(root.into_reader());
73 assert_eq!(metadata, deserialized);
74 }
75
76 #[test]
77 fn test_sets_uuid() {
78 let conn = get_connection(None).unwrap();
79 assert!(!get_db_uuid(&conn).is_empty());
80 }
81
82 #[test]
83 fn test_table_name_constants() {
84 use crate::{
85 accession::{Accession, AccessionEdge, AccessionPath},
86 annotations::Annotation,
87 block_group::BlockGroup,
88 block_group_edge::BlockGroupEdge,
89 collection::Collection,
90 edge::Edge,
91 files::GenDatabase,
92 metadata::Metadata,
93 node::Node,
94 operations::{Branch, FileAddition, Operation, OperationSummary},
95 path::Path,
96 path_edge::PathEdge,
97 sample::Sample,
98 };
99
100 assert_eq!(Node::table_name(), "nodes");
102 assert_eq!(Collection::table_name(), "collections");
103 assert_eq!(Sample::table_name(), "samples");
104
105 assert_eq!(Edge::table_name(), "edges");
107 assert_eq!(Path::table_name(), "paths");
108 assert_eq!(PathEdge::table_name(), "path_edges");
109 assert_eq!(BlockGroup::table_name(), "block_groups");
110 assert_eq!(BlockGroupEdge::table_name(), "block_group_edges");
111
112 assert_eq!(Accession::table_name(), "accessions");
114 assert_eq!(AccessionEdge::table_name(), "accession_edges");
115 assert_eq!(AccessionPath::table_name(), "accession_paths");
116 assert_eq!(Annotation::table_name(), "annotations");
117
118 assert_eq!(Operation::table_name(), "operations");
120 assert_eq!(FileAddition::table_name(), "file_additions");
121 assert_eq!(OperationSummary::table_name(), "operation_summaries");
122 assert_eq!(Branch::table_name(), "branches");
123
124 assert_eq!(GenDatabase::table_name(), "gen_databases");
126 assert_eq!(Metadata::table_name(), "gen_metadata");
127 }
128}