Skip to content
This repository was archived by the owner on Dec 24, 2022. It is now read-only.

Commit 006d9ab

Browse files
committed
Create a postgresql execute function that uses parameters.
1 parent 9e85cad commit 006d9ab

File tree

2 files changed

+34
-8
lines changed

2 files changed

+34
-8
lines changed

src/ServiceStack.OrmLite.PostgreSQL.Tests/OrmLiteExecuteProcedureTests.cs

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using NUnit.Framework;
22
using ServiceStack.DataAnnotations;
33
using ServiceStack.OrmLite.Tests;
4+
using ServiceStack.Text;
45

56
namespace ServiceStack.OrmLite.PostgreSQL.Tests
67
{
@@ -11,8 +12,8 @@ public OrmLiteExecuteProcedureTests() : base(Dialect.PostgreSql) { }
1112

1213
private const string Create = @"
1314
CREATE OR REPLACE FUNCTION f_service_stack(
14-
v_string_values CHARACTER VARYING[],
15-
v_integer_values INTEGER[]
15+
v_string_values text[],
16+
v_integer_values integer[]
1617
) RETURNS BOOLEAN AS
1718
$BODY$
1819
BEGIN
@@ -37,12 +38,14 @@ IF v_integer_values[3] <> 3 THEN
3738
LANGUAGE plpgsql VOLATILE COST 100;
3839
";
3940

40-
private const string Drop = "DROP FUNCTION f_service_stack(CHARACTER VARYING[], INTEGER[]);";
41+
private const string Drop = "DROP FUNCTION f_service_stack(text[], integer[]);";
4142

4243
[Alias("f_service_stack")]
4344
public class ServiceStackFunction
4445
{
46+
[CustomField("text[]")]
4547
public string[] StringValues { get; set; }
48+
[CustomField("integer[]")]
4649
public int[] IntegerValues { get; set; }
4750
}
4851

@@ -52,12 +55,15 @@ public void Can_execute_stored_procedure_with_array_arguments()
5255
using (var db = OpenDbConnection())
5356
{
5457
db.ExecuteSql(Create);
58+
db.GetLastSql().Print();
5559

56-
db.ExecuteProcedure(new ServiceStackFunction
57-
{
58-
StringValues = new[] { "ServiceStack", "Thoughtfully Architected" },
59-
IntegerValues = new[] { 1, 2, 3 }
60-
});
60+
var command = db.CreateCommand();
61+
var dialect = command.GetDialectProvider();
62+
((PostgreSQLDialectProvider)dialect).ExecuteFunction(command, new ServiceStackFunction
63+
{
64+
StringValues = new[] { "ServiceStack", "Thoughtfully Architected" },
65+
IntegerValues = new[] { 1, 2, 3 }
66+
});
6167
db.ExecuteSql(Drop);
6268
}
6369
}

src/ServiceStack.OrmLite.PostgreSQL/PostgreSQLDialectProvider.cs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -370,5 +370,25 @@ protected override object GetValue<T>(FieldDefinition fieldDef, object obj)
370370
}
371371
return base.GetValue<T>(fieldDef, obj);
372372
}
373+
374+
public void ExecuteFunction<T>(IDbCommand dbCommand, T obj)
375+
{
376+
var tableType = obj.GetType();
377+
var modelDef = GetModel(tableType);
378+
379+
dbCommand.CommandText = GetQuotedTableName(modelDef);
380+
dbCommand.CommandType = CommandType.StoredProcedure;
381+
382+
foreach (var fieldDef in modelDef.FieldDefinitions)
383+
{
384+
var p = dbCommand.CreateParameter();
385+
SetParameter(fieldDef, p);
386+
dbCommand.Parameters.Add(p);
387+
}
388+
389+
SetParameterValues<T>(dbCommand, obj);
390+
391+
dbCommand.ExecuteNonQuery();
392+
}
373393
}
374394
}

0 commit comments

Comments
 (0)