Skip to content

Commit cdc6460

Browse files
committed
fixing StaleEntity issue when insert () output inserted.id is used in ecto query
1 parent 0bb00ef commit cdc6460

File tree

4 files changed

+34
-24
lines changed

4 files changed

+34
-24
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
# v1.0.3
2+
* BugFix
3+
* When insert is performed with output incorect row count is calucated. Causing tds_ecto and ecto to think it is StaleEntity
4+
15
# v0.5.4
26
* Enhancements
37
* Cleaned up code style for Elixir 1.2.0 warnings

lib/tds/tokens.ex

Lines changed: 28 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -176,40 +176,46 @@ defmodule Tds.Tokens do
176176
end
177177
## DONE
178178
defp decode_token(<<@tds_token_done, status::int16, cur_cmd::binary(2), row_count::little-size(8)-unit(8), _tail::binary>>, tokens) do
179-
case tokens do
180-
[done: done] ->
181-
182-
cond do
183-
row_count > done.rows -> {[done: %{status: status, cmd: cur_cmd, rows: row_count}] ++ tokens, nil}
184-
true -> {tokens, nil}
185-
end
179+
case Keyword.get(tokens, :done) do
180+
nil ->
181+
{Keyword.put(tokens, :done, %{status: status, cmd: cur_cmd, rows: row_count}), nil}
182+
%{rows: rows} when row_count > rows ->
183+
{Keyword.put(tokens, :done, %{status: status, cmd: cur_cmd, rows: row_count}), nil}
184+
_ ->
186185
{tokens, nil}
187-
_ -> {[done: %{status: status, cmd: cur_cmd, rows: row_count}] ++ tokens, nil}
188186
end
189187
end
190188
## DONEPROC
191189
defp decode_token(<<@tds_token_doneproc, status::int16, cur_cmd::binary(2), row_count::little-size(8)-unit(8), _tail::binary>>, tokens) do
192-
case tokens do
193-
[done: done] ->
194-
cond do
195-
row_count > done.rows -> {[done: %{status: status, cmd: cur_cmd, rows: row_count}] ++ tokens, nil}
196-
true -> {tokens, nil}
197-
end
190+
case Keyword.get(tokens, :done) do
191+
nil ->
192+
{Keyword.put(tokens, :done, %{status: status, cmd: cur_cmd, rows: row_count}), nil}
193+
%{rows: rows} when row_count > rows ->
194+
{Keyword.put(tokens, :done, %{status: status, cmd: cur_cmd, rows: row_count}), nil}
195+
_ ->
198196
{tokens, nil}
199-
_ -> {[done: %{status: status, cmd: cur_cmd, rows: row_count}] ++ tokens, nil}
200197
end
201198
end
202199
## DONEINPROC
203200
defp decode_token(<<@tds_token_doneinproc, status::int16, cur_cmd::binary(2), row_count::little-size(8)-unit(8), _something::binary-size(5), tail::binary>>, tokens) do
204-
case tokens do
205-
[done: done] ->
206-
cond do
207-
row_count > done.rows -> {[done: %{status: status, cmd: cur_cmd, rows: row_count}] ++ tokens, nil}
208-
true -> {tokens, tail}
209-
end
201+
case Keyword.get(tokens, :done) do
202+
nil ->
203+
{Keyword.put(tokens, :done, %{status: status, cmd: cur_cmd, rows: row_count}), tail}
204+
%{rows: rows} when row_count > rows ->
205+
{Keyword.put(tokens, :done, %{status: status, cmd: cur_cmd, rows: row_count}), nil}
206+
_ ->
210207
{tokens, nil}
211-
_ -> {[done: %{status: status, cmd: cur_cmd, rows: row_count}] ++ tokens, tail}
212208
end
209+
210+
# case tokens do
211+
# [done: done] ->
212+
# cond do
213+
# row_count > done.rows -> {[done: %{status: status, cmd: cur_cmd, rows: row_count}] ++ tokens, nil}
214+
# true -> {tokens, tail}
215+
# end
216+
# {tokens, nil}
217+
# _ -> {[done: %{status: status, cmd: cur_cmd, rows: row_count}] ++ tokens, tail}
218+
# end
213219
end
214220

215221
defp decode_column_order(<<tail::binary>>, n, columns) when n == 0 do

mix.exs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ defmodule Tds.Mixfile do
33

44
def project do
55
[ app: :tds,
6-
version: "1.0.2",
6+
version: "1.0.3",
77
elixir: "~> 1.0",
88
deps: deps(),
99
test_coverage: [tool: ExCoveralls],

test/rpc_test.exs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ defmodule RPCTest do
121121
query("DROP TABLE dbo.TestTable2", [])
122122
assert :ok = query("CREATE TABLE TestTable2 (text varbinary(max) NULL)", [])
123123
query("INSERT INTO TestTable2 VALUES (@1)",[%Parameter{name: "@1", value: "hello", type: :binary}])
124-
assert [["hello"]] = query("SELECT * FROM TestTable2 WHERE text IN ('x', 'y', @1)", [%Parameter{name: "@1", value: "hello"}])
124+
assert [["hello"]] = query("SELECT * FROM TestTable2 WHERE text IN ('x', 'y', @1)", [%Parameter{name: "@1", value: "hello", type: :binary}])
125125
end
126126

127127
test "Common Types Null", context do

0 commit comments

Comments
 (0)