diff --git a/src/jetquery/adapters.zig b/src/jetquery/adapters.zig index 444dc4e..19fd9d7 100644 --- a/src/jetquery/adapters.zig +++ b/src/jetquery/adapters.zig @@ -207,9 +207,10 @@ pub fn Adapter(comptime adapter_name: Name, AdaptedRepo: type) type { pub fn referenceSql( self: Self, comptime reference: jetquery.schema.Column.Reference, + comptime reference_options: ?jetquery.schema.Column.ReferenceOptions, ) []const u8 { return switch (self) { - inline else => |adapter| @TypeOf(adapter).referenceSql(reference), + inline else => |adapter| @TypeOf(adapter).referenceSql(reference, reference_options), }; } @@ -254,7 +255,7 @@ pub fn Adapter(comptime adapter_name: Name, AdaptedRepo: type) type { if (column.primary_key) self.primaryKeySql(column) else "", if (column.options.unique) self.uniqueColumnSql() else "", if (column.options.reference) |reference| - self.referenceSql(reference) + self.referenceSql(reference, column.options.reference_options) else "", }); diff --git a/src/jetquery/adapters/NullAdapter.zig b/src/jetquery/adapters/NullAdapter.zig index 3f72bdc..68830e7 100644 --- a/src/jetquery/adapters/NullAdapter.zig +++ b/src/jetquery/adapters/NullAdapter.zig @@ -138,8 +138,12 @@ pub fn uniqueColumnSql() []const u8 { return ""; } -pub fn referenceSql(comptime reference: jetquery.schema.Column.Reference) []const u8 { +pub fn referenceSql( + comptime reference: jetquery.schema.Column.Reference, + comptime reference_options: ?jetquery.schema.Column.ReferenceOptions, +) []const u8 { _ = reference; + _ = reference_options; return ""; } diff --git a/src/jetquery/adapters/PostgresqlAdapter.zig b/src/jetquery/adapters/PostgresqlAdapter.zig index 23fca53..f4f963d 100644 --- a/src/jetquery/adapters/PostgresqlAdapter.zig +++ b/src/jetquery/adapters/PostgresqlAdapter.zig @@ -626,11 +626,18 @@ pub fn uniqueColumnSql() []const u8 { return " UNIQUE"; } -pub fn referenceSql(comptime reference: jetquery.schema.Column.Reference) []const u8 { - return std.fmt.comptimePrint( +pub fn referenceSql( + comptime reference: jetquery.schema.Column.Reference, + comptime reference_options: ?jetquery.schema.Column.ReferenceOptions, +) []const u8 { + const reference_str = std.fmt.comptimePrint( " REFERENCES {s}({s})", .{ comptime identifier(reference[0]), comptime identifier(reference[1]) }, ); + if (reference_options) |reference_opts| { + return std.fmt.comptimePrint("{s} {s}", .{ reference_str, comptime deleteOption(reference_opts.on_delete) }); + } + return reference_str; } pub fn reflect( @@ -830,3 +837,14 @@ fn BindCoerce(T: type) type { else => T, }; } + +fn deleteOption(comptime delete_option: ?jetquery.schema.Column.OnDeleteOption) []const u8 { + if (delete_option) |option| { + switch (option) { + .DELETE => return "ON DELETE CASCADE", + .NULL => return "ON DELETE SET NULL", + } + } else { + return ""; + } +} diff --git a/src/jetquery/schema/Column.zig b/src/jetquery/schema/Column.zig index a6440c9..f8c64b4 100644 --- a/src/jetquery/schema/Column.zig +++ b/src/jetquery/schema/Column.zig @@ -21,13 +21,25 @@ pub const Type = enum { bigint, double_precision, }; + +pub const OnDeleteOption = enum { + CASCADE, + NULL, +}; + pub const Reference = [2][]const u8; + +pub const ReferenceOptions = struct { + on_delete: ?OnDeleteOption = null, +}; + pub const Options = struct { optional: bool = false, index: bool = false, index_name: ?[]const u8 = null, unique: bool = false, reference: ?Reference = null, + reference_options: ?ReferenceOptions = null, length: ?u16 = null, primary_key: bool = false, };