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

Commit eafcc5e

Browse files
committed
Merge pull request #292 from jeffgabhart/pgsql/func-array-arg
Support PostgreSQL functions with integer and string array arguments.
2 parents 476e980 + c47a962 commit eafcc5e

File tree

3 files changed

+86
-0
lines changed

3 files changed

+86
-0
lines changed
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
using System.Collections.Generic;
2+
using NUnit.Framework;
3+
using ServiceStack.DataAnnotations;
4+
using ServiceStack.OrmLite.Tests;
5+
6+
namespace ServiceStack.OrmLite.PostgreSQL.Tests
7+
{
8+
[TestFixture]
9+
public class OrmLiteExecuteProcedureTests : OrmLiteTestBase
10+
{
11+
private const string Create = @"
12+
CREATE OR REPLACE FUNCTION f_service_stack(
13+
v_string_values CHARACTER VARYING[],
14+
v_integer_values INTEGER[]
15+
) RETURNS BOOLEAN AS
16+
$BODY$
17+
BEGIN
18+
IF v_string_values[1] <> 'ServiceStack' THEN
19+
RAISE EXCEPTION 'Unexpected value in string array[1] %', v_string_values[1];
20+
END IF;
21+
IF v_string_values[2] <> 'Thoughtfully Architected' THEN
22+
RAISE EXCEPTION 'Unexpected value in string array[2] %', v_string_values[2];
23+
END IF;
24+
IF v_integer_values[1] <> 1 THEN
25+
RAISE EXCEPTION 'Unexpected value in integer array[1] %', v_integer_values[1];
26+
END IF;
27+
IF v_integer_values[2] <> 2 THEN
28+
RAISE EXCEPTION 'Unexpected value in integer array[2] %', v_integer_values[2];
29+
END IF;
30+
IF v_integer_values[3] <> 3 THEN
31+
RAISE EXCEPTION 'Unexpected value in integer array[3] %', v_integer_values[3];
32+
END IF;
33+
RETURN TRUE;
34+
END;
35+
$BODY$
36+
LANGUAGE plpgsql VOLATILE COST 100;
37+
";
38+
39+
private const string Drop = "DROP FUNCTION f_service_stack(CHARACTER VARYING[], INTEGER[]);";
40+
41+
[Alias("f_service_stack")]
42+
public class ServiceStackFunction
43+
{
44+
public string[] StringValues { get; set; }
45+
public int[] IntegerValues { get; set; }
46+
}
47+
48+
[Test]
49+
public void Can_execute_stored_procedure_with_array_arguments()
50+
{
51+
using (var db = ConnectionString.OpenDbConnection())
52+
{
53+
db.ExecuteSql(Create);
54+
55+
db.ExecuteProcedure(new ServiceStackFunction
56+
{
57+
StringValues = new[] { "ServiceStack", "Thoughtfully Architected" },
58+
IntegerValues = new[] { 1, 2, 3 }
59+
});
60+
db.ExecuteSql(Drop);
61+
}
62+
}
63+
}
64+
}

src/ServiceStack.OrmLite.PostgreSQL.Tests/ServiceStack.OrmLite.PostgreSQL.Tests.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@
8989
<Compile Include="NorthwindPerfTests.cs" />
9090
<Compile Include="OrmLiteBasicPersistenceProviderTests.cs" />
9191
<Compile Include="OrmLiteCreateTableWithNamigStrategyTests.cs" />
92+
<Compile Include="OrmLiteExecuteProcedureTests.cs" />
9293
<Compile Include="OrmLiteInsertTests.cs" />
9394
<Compile Include="OrmLiteNorthwindTests.cs" />
9495
<Compile Include="OrmLiteSelectTests.cs" />

src/ServiceStack.OrmLite.PostgreSQL/PostgreSQLDialectProvider.cs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,16 @@ public override string GetQuotedValue(object value, Type fieldType)
127127
{
128128
return "E'" + ToBinary(value) + "'";
129129
}
130+
if (fieldType.IsArray && typeof(string).IsAssignableFrom(fieldType.GetElementType()))
131+
{
132+
var stringArray = (string[]) value;
133+
return ToArray(stringArray);
134+
}
135+
if (fieldType.IsArray && typeof(int).IsAssignableFrom(fieldType.GetElementType()))
136+
{
137+
var integerArray = (int[]) value;
138+
return ToArray(integerArray);
139+
}
130140

131141
return base.GetQuotedValue(value, fieldType);
132142
}
@@ -233,5 +243,16 @@ internal static String ToBinary(Object NativeData)
233243
.Append((char)('0' + (7 & b)));
234244
return res.ToString();
235245
}
246+
247+
internal string ToArray<T>(T[] source)
248+
{
249+
var values = new StringBuilder();
250+
foreach (var value in source)
251+
{
252+
if (values.Length > 0) values.Append(",");
253+
values.Append(base.GetQuotedValue(value, typeof(T)));
254+
}
255+
return "ARRAY[" + values + "]";
256+
}
236257
}
237258
}

0 commit comments

Comments
 (0)