From 3c09185b5e781a62cc2c96b736c6e326fbbb4da3 Mon Sep 17 00:00:00 2001 From: sulphur Date: Mon, 15 Oct 2018 10:59:09 +0200 Subject: [PATCH 1/3] fix update and delete caluses to use only ID and not all record values in where clause. It fix the bug when updating rows in tables with float columns. --- src/texas_pgsql.erl | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/texas_pgsql.erl b/src/texas_pgsql.erl index 0e3f392..86283d2 100644 --- a/src/texas_pgsql.erl +++ b/src/texas_pgsql.erl @@ -165,13 +165,13 @@ update(Conn, Table, Record, UpdateData) -> SQLCmd = "UPDATE " ++ texas_sql:sql_field(Table, ?MODULE) ++ texas_sql:set_clause(UpdateData, ?MODULE) ++ - texas_sql:where_clause(Record, ?MODULE), + texas_sql:where_clause(texas_sql:clause(where, [{where, [{id, Record:id()}]}]), ?MODULE), case exec(SQLCmd, Conn) of {ok, _} -> UpdateRecord = lists:foldl(fun({Field, Value}, Rec) -> Rec:Field(Value) end, Record, UpdateData), - select(Conn, Table, all, [{where, UpdateRecord}]); + select(Conn, Table, all, [{where, [{id, UpdateRecord:id()}]}]); E -> E end. @@ -179,7 +179,7 @@ update(Conn, Table, Record, UpdateData) -> delete(Conn, Table, Record) -> SQLCmd = "DELETE FROM " ++ texas_sql:sql_field(Table, ?MODULE) ++ - texas_sql:where_clause(Record, ?MODULE), + texas_sql:where_clause([{id, Record:id()}], ?MODULE), case exec(SQLCmd, Conn) of {ok, _} -> ok; E -> E From dddfeec1341b79d7540777b3051f06bae04c4dbc Mon Sep 17 00:00:00 2001 From: sulphur Date: Mon, 15 Oct 2018 11:40:47 +0200 Subject: [PATCH 2/3] add fallback for when there is no id column present --- src/texas_pgsql.erl | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/texas_pgsql.erl b/src/texas_pgsql.erl index 86283d2..1b0355e 100644 --- a/src/texas_pgsql.erl +++ b/src/texas_pgsql.erl @@ -165,7 +165,7 @@ update(Conn, Table, Record, UpdateData) -> SQLCmd = "UPDATE " ++ texas_sql:sql_field(Table, ?MODULE) ++ texas_sql:set_clause(UpdateData, ?MODULE) ++ - texas_sql:where_clause(texas_sql:clause(where, [{where, [{id, Record:id()}]}]), ?MODULE), + where_for_update(Record), case exec(SQLCmd, Conn) of {ok, _} -> UpdateRecord = lists:foldl(fun({Field, Value}, Rec) -> @@ -179,7 +179,7 @@ update(Conn, Table, Record, UpdateData) -> delete(Conn, Table, Record) -> SQLCmd = "DELETE FROM " ++ texas_sql:sql_field(Table, ?MODULE) ++ - texas_sql:where_clause([{id, Record:id()}], ?MODULE), + where_for_update(Record), case exec(SQLCmd, Conn) of {ok, _} -> ok; E -> E @@ -234,3 +234,10 @@ sql(column_def, Name, Type, Len, Autoincrement, NotNull, Unique, Default) -> sql(notnull, {ok, true}) -> " NOT NULL"; sql(unique, {ok, true}) -> " UNIQUE"; sql(_, _) -> "". + +where_for_update(Record) -> + case Record:id() of + undefined -> texas_sql:where_clause(Record, ?MODULE); + _ -> texas_sql:where_clause(texas_sql:clause(where, [{where, [{id, Record:id()}]}]), ?MODULE) + end. + From e9ad831a77a9c2222bbce29218695bb8f8dc3e27 Mon Sep 17 00:00:00 2001 From: sulphur Date: Mon, 15 Oct 2018 12:20:14 +0200 Subject: [PATCH 3/3] add fallback for update when no id is present --- src/texas_pgsql.erl | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/texas_pgsql.erl b/src/texas_pgsql.erl index 1b0355e..715c223 100644 --- a/src/texas_pgsql.erl +++ b/src/texas_pgsql.erl @@ -171,7 +171,11 @@ update(Conn, Table, Record, UpdateData) -> UpdateRecord = lists:foldl(fun({Field, Value}, Rec) -> Rec:Field(Value) end, Record, UpdateData), - select(Conn, Table, all, [{where, [{id, UpdateRecord:id()}]}]); + WhereClause = case UpdateRecord:id() of + undefined -> UpdateRecord; + _ -> [{id, UpdateRecord:id()}] + end, + select(Conn, Table, all, [{where, WhereClause}]); E -> E end.