Skip to main content

systemprompt_database/
extension.rs

1//! Extension registration for the database crate's own schema.
2//!
3//! Every systemprompt extension that owns DDL registers itself through the
4//! `inventory` framework. The database crate registers its own bookkeeping
5//! tables (`extension_migrations`) and shared SQL helper functions so that
6//! they install before any downstream extension runs.
7//!
8//! Copyright (c) systemprompt.io — Business Source License 1.1.
9//! See <https://systemprompt.io> for licensing details.
10
11use systemprompt_extension::prelude::*;
12
13#[derive(Debug, Clone, Copy, Default)]
14pub struct DatabaseExtension;
15
16impl Extension for DatabaseExtension {
17    fn metadata(&self) -> ExtensionMetadata {
18        ExtensionMetadata {
19            id: "database",
20            name: "Database",
21            version: env!("CARGO_PKG_VERSION"),
22        }
23    }
24
25    fn schemas(&self) -> Vec<SchemaDefinition> {
26        vec![
27            SchemaDefinition::new(
28                "extension_migrations",
29                include_str!("../schema/extension_migrations.sql"),
30            ),
31            SchemaDefinition::new(
32                "extension_migration_compat",
33                include_str!("../schema/extension_migration_compat.sql"),
34            ),
35            SchemaDefinition::new("services", include_str!("../schema/services.sql"))
36                .with_required_columns(vec!["name".into(), "module_name".into(), "status".into()]),
37            SchemaDefinition::new(
38                "projection_backlog",
39                include_str!("../schema/projection_backlog.sql"),
40            )
41            .with_required_columns(vec![
42                "projection".into(),
43                "key".into(),
44                "attempts".into(),
45            ]),
46            SchemaDefinition::new("trace_facts", include_str!("../schema/trace_facts.sql"))
47                .with_required_columns(vec!["trace_id".into(), "first_at".into(), "status".into()]),
48            SchemaDefinition::new(
49                "instance_leases",
50                include_str!("../schema/instance_leases.sql"),
51            )
52            .with_required_columns(vec![
53                "lease_key".into(),
54                "owner_instance_id".into(),
55                "expires_at".into(),
56            ]),
57            SchemaDefinition::new(
58                "instance_endpoints",
59                include_str!("../schema/instance_endpoints.sql"),
60            )
61            .with_required_columns(vec![
62                "instance_id".into(),
63                "advertise_url".into(),
64                "heartbeat_at".into(),
65            ]),
66            SchemaDefinition::new(
67                "instance_presence",
68                include_str!("../schema/instance_presence.sql"),
69            )
70            .with_required_columns(vec![
71                "instance_id".into(),
72                "role".into(),
73                "heartbeat_at".into(),
74            ]),
75            SchemaDefinition::new(
76                "release_stamps",
77                include_str!("../schema/release_stamps.sql"),
78            )
79            .with_required_columns(vec!["name".into(), "version".into()]),
80            SchemaDefinition::new(
81                "config_version",
82                include_str!("../schema/config_version.sql"),
83            )
84            .with_required_columns(vec!["id".into(), "version".into(), "plane".into()]),
85            SchemaDefinition::new(
86                "config_plane_applied",
87                include_str!("../schema/config_plane_applied.sql"),
88            )
89            .with_required_columns(vec!["plane".into(), "applied_at".into()]),
90            SchemaDefinition::sql_only(include_str!("../schema/functions.sql")),
91            SchemaDefinition::sql_only(include_str!("../schema/config_change_triggers.sql")),
92        ]
93    }
94
95    fn migrations(&self) -> Vec<Migration> {
96        extension_migrations!()
97    }
98
99    fn dependencies(&self) -> Vec<&'static str> {
100        vec![]
101    }
102
103    fn priority(&self) -> u32 {
104        0
105    }
106}
107
108register_extension!(DatabaseExtension);