From 15eaabebc8437af75dee20ced8103ec283ddc3ef Mon Sep 17 00:00:00 2001 From: Noah Metz Date: Thu, 25 Jan 2024 22:20:50 -0700 Subject: [PATCH 1/2] Added foreign_key table constraint --- include/sqlite3.hrl | 2 +- src/sqlite3_lib.erl | 9 ++++++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/include/sqlite3.hrl b/include/sqlite3.hrl index c505b39..f560401 100644 --- a/include/sqlite3.hrl +++ b/include/sqlite3.hrl @@ -31,7 +31,7 @@ -type column_constraint() :: non_null | primary_key | {primary_key, pk_constraints()} | unique | {default, sql_value()}. -type column_constraints() :: column_constraint() | [column_constraint()]. --type table_constraint() :: {primary_key, [atom()]} | {unique, [atom()]}. +-type table_constraint() :: {primary_key, [atom()]} | {foreign_key, {[atom()], atom(), [atom()]}} | {unique, [atom()]}. -type table_constraints() :: table_constraint() | [table_constraint()]. -type table_info() :: [{column_id(), sql_type()} | {column_id(), sql_type(), column_constraints()}]. diff --git a/src/sqlite3_lib.erl b/src/sqlite3_lib.erl index 3244247..715d05a 100644 --- a/src/sqlite3_lib.erl +++ b/src/sqlite3_lib.erl @@ -376,7 +376,14 @@ table_constraint_sql(TableConstraint) -> {unique, Columns} -> ["UNIQUE(", map_intersperse(fun indexed_column_sql/1, Columns, ", "), ")"]; - %% TODO: foreign key + {foreign_key, {Columns, Parent, ParentColumns}} -> + ["FOREIGN KEY(", + map_intersperse(fun indexed_column_sql/1, Columns, ", "), + ") REFERENCES ", + atom_to_list(Parent), + "(", + map_intersperse(fun indexed_column_sql/1, ParentColumns, ", "), + ")"]; {raw, S} when is_list(S) -> S; _ when is_list(TableConstraint) -> map_intersperse(fun table_constraint_sql/1, TableConstraint, ", ") From 5703b047a8ff66450a4de13af37cee10dfe656d5 Mon Sep 17 00:00:00 2001 From: Noah Metz Date: Thu, 25 Jan 2024 22:38:32 -0700 Subject: [PATCH 2/2] Added additional string to configure update/delete actions --- include/sqlite3.hrl | 2 +- src/sqlite3_lib.erl | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/include/sqlite3.hrl b/include/sqlite3.hrl index f560401..0faf228 100644 --- a/include/sqlite3.hrl +++ b/include/sqlite3.hrl @@ -31,7 +31,7 @@ -type column_constraint() :: non_null | primary_key | {primary_key, pk_constraints()} | unique | {default, sql_value()}. -type column_constraints() :: column_constraint() | [column_constraint()]. --type table_constraint() :: {primary_key, [atom()]} | {foreign_key, {[atom()], atom(), [atom()]}} | {unique, [atom()]}. +-type table_constraint() :: {primary_key, [atom()]} | {foreign_key, {[atom()], atom(), [atom()], string()}} | {unique, [atom()]}. -type table_constraints() :: table_constraint() | [table_constraint()]. -type table_info() :: [{column_id(), sql_type()} | {column_id(), sql_type(), column_constraints()}]. diff --git a/src/sqlite3_lib.erl b/src/sqlite3_lib.erl index 715d05a..f8afa67 100644 --- a/src/sqlite3_lib.erl +++ b/src/sqlite3_lib.erl @@ -376,14 +376,15 @@ table_constraint_sql(TableConstraint) -> {unique, Columns} -> ["UNIQUE(", map_intersperse(fun indexed_column_sql/1, Columns, ", "), ")"]; - {foreign_key, {Columns, Parent, ParentColumns}} -> + {foreign_key, {Columns, Parent, ParentColumns, Action}} -> ["FOREIGN KEY(", map_intersperse(fun indexed_column_sql/1, Columns, ", "), ") REFERENCES ", atom_to_list(Parent), "(", map_intersperse(fun indexed_column_sql/1, ParentColumns, ", "), - ")"]; + ")", + Action]; {raw, S} when is_list(S) -> S; _ when is_list(TableConstraint) -> map_intersperse(fun table_constraint_sql/1, TableConstraint, ", ")