Skip to content

Commit 692b509

Browse files
committed
feat: add database constraints support and restructure schema parsing
- Add PrimaryKey, ForeignKey, and Index message types to protobuf schema - Extend Table message with constraint fields (primary_key, foreign_keys, indexes) - Refactor Database to CatalogBuilder with plugin::Catalog integration - Add merge_catalog functionality for combining schema definitions - Update schema parsing to populate constraint information from SQL DDL - Migrate from HashMap-based storage to Vec-based plugin types - Add runtime schema processing with CatalogBuilder integration BREAKING CHANGE: Database struct replaced with CatalogBuilder, changes public API Signed-off-by: Svetlin Ralchev <iamralch@users.noreply.github.com>
1 parent 931b841 commit 692b509

File tree

4 files changed

+670
-743
lines changed

4 files changed

+670
-743
lines changed

proto/codegen.proto

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,10 +69,33 @@ message Enum {
6969
string comment = 3;
7070
}
7171

72+
message PrimaryKey {
73+
string name = 1 [json_name = "name"];
74+
repeated string columns = 2 [json_name = "columns"];
75+
}
76+
77+
message ForeignKey {
78+
string name = 1 [json_name = "name"];
79+
repeated string columns = 2 [json_name = "columns"];
80+
string referenced_table = 3 [json_name = "referenced_table"];
81+
repeated string referenced_columns = 4 [json_name = "referenced_columns"];
82+
string on_delete = 5 [json_name = "on_delete"];
83+
string on_update = 6 [json_name = "on_update"];
84+
}
85+
86+
message Index {
87+
string name = 1 [json_name = "name"];
88+
repeated string columns = 2 [json_name = "columns"];
89+
bool unique = 3 [json_name = "unique"];
90+
}
91+
7292
message Table {
7393
Identifier rel = 1;
7494
repeated Column columns = 2;
7595
string comment = 3;
96+
PrimaryKey primary_key = 4 [json_name = "primary_key"];
97+
repeated ForeignKey foreign_keys = 5 [json_name = "foreign_keys"];
98+
repeated Index indexes = 6 [json_name = "indexes"];
7699
}
77100

78101
message Identifier {

src/plugin.rs

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,37 @@ pub struct Enum {
8989
#[prost(string, tag = "3")]
9090
pub comment: ::prost::alloc::string::String,
9191
}
92+
#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
93+
pub struct PrimaryKey {
94+
#[prost(string, tag = "1")]
95+
pub name: ::prost::alloc::string::String,
96+
#[prost(string, repeated, tag = "2")]
97+
pub columns: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
98+
}
99+
#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
100+
pub struct ForeignKey {
101+
#[prost(string, tag = "1")]
102+
pub name: ::prost::alloc::string::String,
103+
#[prost(string, repeated, tag = "2")]
104+
pub columns: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
105+
#[prost(string, tag = "3")]
106+
pub referenced_table: ::prost::alloc::string::String,
107+
#[prost(string, repeated, tag = "4")]
108+
pub referenced_columns: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
109+
#[prost(string, tag = "5")]
110+
pub on_delete: ::prost::alloc::string::String,
111+
#[prost(string, tag = "6")]
112+
pub on_update: ::prost::alloc::string::String,
113+
}
114+
#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
115+
pub struct Index {
116+
#[prost(string, tag = "1")]
117+
pub name: ::prost::alloc::string::String,
118+
#[prost(string, repeated, tag = "2")]
119+
pub columns: ::prost::alloc::vec::Vec<::prost::alloc::string::String>,
120+
#[prost(bool, tag = "3")]
121+
pub unique: bool,
122+
}
92123
#[derive(Clone, PartialEq, ::prost::Message)]
93124
pub struct Table {
94125
#[prost(message, optional, tag = "1")]
@@ -97,6 +128,12 @@ pub struct Table {
97128
pub columns: ::prost::alloc::vec::Vec<Column>,
98129
#[prost(string, tag = "3")]
99130
pub comment: ::prost::alloc::string::String,
131+
#[prost(message, optional, tag = "4")]
132+
pub primary_key: ::core::option::Option<PrimaryKey>,
133+
#[prost(message, repeated, tag = "5")]
134+
pub foreign_keys: ::prost::alloc::vec::Vec<ForeignKey>,
135+
#[prost(message, repeated, tag = "6")]
136+
pub indexes: ::prost::alloc::vec::Vec<Index>,
100137
}
101138
#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)]
102139
pub struct Identifier {

src/runtime.rs

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
//! ```
3434
3535
use crate::plugin::{GenerateRequest, GenerateResponse};
36+
use crate::schema::CatalogBuilder;
3637
use prost::Message;
3738
use std::error::Error;
3839
use std::io::{Read, Write};
@@ -156,9 +157,26 @@ where
156157
let mut input = Vec::new();
157158
reader.read_to_end(&mut input)?;
158159

159-
let request = GenerateRequest::decode(&input[..])?;
160-
let response = process(request)?;
160+
let mut request = GenerateRequest::decode(&input[..])?;
161+
162+
if let Some(settings) = &request.settings {
163+
if !settings.schema.is_empty() {
164+
let mut builder = CatalogBuilder::new(settings.engine.as_str());
165+
166+
for item in &settings.schema {
167+
let schema = std::fs::read_to_string(item)?;
168+
builder.parse_sql(&schema)?;
169+
}
170+
171+
if let Some(catalog) = request.catalog.take() {
172+
builder.merge_catalog(catalog);
173+
}
161174

175+
request.catalog = Some(builder.build());
176+
}
177+
}
178+
179+
let response = process(request)?;
162180
let mut output = Vec::new();
163181
response.encode(&mut output)?;
164182

0 commit comments

Comments
 (0)