Skip to content

Commit 5c27cc0

Browse files
author
Simon Thörnqvist
committed
new proc function
Adds support for using a provided stored proc as procedure name instead of default :sp_execute
1 parent eeb9867 commit 5c27cc0

File tree

5 files changed

+29
-2
lines changed

5 files changed

+29
-2
lines changed

lib/tds.ex

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,12 @@ defmodule Tds do
1717
{:error, err} -> {:error, err}
1818
end
1919
end
20+
21+
def proc(pid, statement, params, opts \\ []) do
22+
opts = Keyword.put_new(opts, :proc, statement)
23+
query(pid, statement, params, opts)
24+
end
25+
2026
def query!(pid, statement, params, opts \\ []) do
2127
query = %Query{statement: statement}
2228
opts = Keyword.put_new(opts, :parameters, params)

lib/tds/messages.ex

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -362,6 +362,11 @@ defmodule Tds.Messages do
362362
defp encode_rpc(:sp_unprepare, params) do
363363
<<0xFF, 0xFF, @tds_sp_unprepare::little-size(2)-unit(8), 0x00, 0x00>> <> encode_rpc_params(params, "")
364364
end
365+
defp encode_rpc(proc, params) when is_binary(proc) do
366+
rpc_size = byte_size(proc)
367+
rpc_name = to_little_ucs2(proc)
368+
<<rpc_size::little-size(16)>> <> rpc_name <> <<0x00, 0x00>> <> encode_rpc_params(params, "")
369+
end
365370

366371
# Finished processing params
367372
defp encode_rpc_params([], ret), do: ret

lib/tds/protocol.ex

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ defmodule Tds.Protocol do
7979

8080
def handle_execute(%Query{statement: statement} = query, params, opts, %{sock: _sock} = s) do
8181
params = opts[:parameters] || params
82+
s = if opts[:proc], do: Map.put_new(s, :proc, opts[:proc]), else: s
8283

8384
if params != [] do
8485
send_param_query(query, params, s)
@@ -380,6 +381,21 @@ defmodule Tds.Protocol do
380381
# {:ok, %{s | statement: nil, state: :ready}}
381382
#end
382383

384+
def send_param_query(%Query{handle: handle} = _query, params, %{proc: proc} = s) do
385+
params = Tds.Parameter.prepare_params(params)
386+
# msg = msg_rpc(proc: :sp_executesql, params: params)
387+
msg = msg_rpc(proc: proc, params: params)
388+
389+
case msg_send(msg, s) do
390+
{:ok, %{result: result} = s} ->
391+
{:ok, result, %{s | state: :ready}}
392+
{:error, err, %{transaction: :started} = s} ->
393+
{:error, err, %{s | transaction: :failed}}
394+
err ->
395+
err
396+
end
397+
end
398+
383399
def send_param_query(%Query{handle: handle} = _query, params, %{transaction: :started} = s) do
384400
params = [
385401
%Tds.Parameter{name: "@handle", type: :integer, direction: :input, value: handle}

test/test_helper.exs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ defmodule Tds.TestHelper do
1616

1717
defmacro proc(proc, params, opts \\ []) do
1818
quote do
19-
case Tds.Connection.proc(var!(context)[:pid], unquote(proc),
19+
case Tds.proc(var!(context)[:pid], unquote(proc),
2020
unquote(params), unquote(opts)) do
2121
{:ok, %Tds.Result{rows: nil}} -> :ok
2222
{:ok, %Tds.Result{rows: []}} -> :ok

test/tvp_test.exs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,6 @@ defmodule TvpTest do
3131
%Parameter{name: "@tvp", value: %{name: "TvpTestType", columns: [%Parameter{name: "d", type: :integer, value: nil}], rows: [[1]]}, type: :tvp}
3232
]
3333

34-
assert {:ok, res} = query("__tvpTest @tvp", params)
34+
assert [[1]] = proc("__tvpTest", params)
3535
end
3636
end

0 commit comments

Comments
 (0)