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

Commit 3d5e8de

Browse files
committed
Fix RowVersion and Field Mapping tests for PostgreSql
1 parent 9e6ef47 commit 3d5e8de

File tree

4 files changed

+45
-12
lines changed

4 files changed

+45
-12
lines changed

src/ServiceStack.OrmLite.PostgreSQL/PostgreSQLDialectProvider.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,9 @@ public override string GetColumnDefinition(
122122
return sql.ToString();
123123
}
124124

125+
//Convert xmin into an integer so it can be used in comparisons
126+
public const string RowVersionFieldComparer = "int8in(xidout(xmin))";
127+
125128
public override string GetRowVersionColumnName(FieldDefinition field)
126129
{
127130
return "xmin as " + GetQuotedColumnName(field.FieldName);
@@ -130,7 +133,7 @@ public override string GetRowVersionColumnName(FieldDefinition field)
130133
public override void AppendFieldCondition(StringBuilder sqlFilter, FieldDefinition fieldDef, IDbCommand cmd)
131134
{
132135
var columnName = fieldDef.IsRowVersion
133-
? "int8in(xidout(xmin))" //Convert xmin into an integer so it can be used in comparisons
136+
? RowVersionFieldComparer
134137
: GetQuotedColumnName(fieldDef.FieldName);
135138

136139
sqlFilter
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,25 @@
1+
using System.Linq;
2+
13
namespace ServiceStack.OrmLite.PostgreSQL
24
{
35
public class PostgreSqlExpression<T> : SqlExpression<T>
46
{
57
public PostgreSqlExpression(IOrmLiteDialectProvider dialectProvider)
68
: base(dialectProvider) {}
9+
10+
protected override string GetQuotedColumnName(ModelDefinition tableDef, string memberName)
11+
{
12+
if (useFieldName)
13+
{
14+
var fd = tableDef.FieldDefinitions.FirstOrDefault(x => x.Name == memberName);
15+
if (fd != null && fd.IsRowVersion && !PrefixFieldWithTableName)
16+
{
17+
return PostgreSQLDialectProvider.RowVersionFieldComparer;
18+
}
19+
20+
return base.GetQuotedColumnName(tableDef, memberName);
21+
}
22+
return memberName;
23+
}
724
}
825
}

src/ServiceStack.OrmLite/Expressions/SqlExpression.Join.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,7 @@ public string SelectInto<TModel>()
168168
tableFieldDef.GetQuotedName(DialectProvider));
169169

170170
if (tableFieldDef.Alias != null)
171-
sbSelect.Append(" AS ").Append(fieldDef.Name);
171+
sbSelect.Append(" AS ").Append(DialectProvider.NamingStrategy.GetColumnName(fieldDef.Name));
172172

173173
break;
174174
}

src/ServiceStack.OrmLite/OrmLiteWriteExtensions.cs

Lines changed: 23 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -267,6 +267,27 @@ public static int GetColumnIndex(this IDataReader dataReader, string fieldName)
267267
}
268268
}
269269

270+
private static int FindColumnIndex(IDataReader dataReader, FieldDefinition fieldDef)
271+
{
272+
var index = NotFound;
273+
index = dataReader.GetColumnIndex(fieldDef.FieldName);
274+
if (index == NotFound)
275+
{
276+
index = TryGuessColumnIndex(fieldDef.FieldName, dataReader);
277+
}
278+
// Try fallback to original field name when overriden by alias
279+
if (index == NotFound && fieldDef.Alias != null && !OrmLiteConfig.DisableColumnGuessFallback)
280+
{
281+
index = dataReader.GetColumnIndex(fieldDef.Name);
282+
if (index == NotFound)
283+
{
284+
index = TryGuessColumnIndex(fieldDef.Name, dataReader);
285+
}
286+
}
287+
288+
return index;
289+
}
290+
270291
private const int NotFound = -1;
271292
public static T PopulateWithSqlReader<T>(this T objWithProperties, IDataReader dataReader, FieldDefinition[] fieldDefs, Dictionary<string, int> indexCache)
272293
{
@@ -281,22 +302,14 @@ public static T PopulateWithSqlReader<T>(this T objWithProperties, IDataReader d
281302
{
282303
if (!indexCache.TryGetValue(fieldDef.Name, out index))
283304
{
284-
index = dataReader.GetColumnIndex(fieldDef.FieldName);
285-
if (index == NotFound)
286-
{
287-
index = TryGuessColumnIndex(fieldDef.FieldName, dataReader);
288-
}
305+
index = FindColumnIndex(dataReader, fieldDef);
289306

290307
indexCache.Add(fieldDef.Name, index);
291308
}
292309
}
293310
else
294311
{
295-
index = dataReader.GetColumnIndex(fieldDef.FieldName);
296-
if (index == NotFound)
297-
{
298-
index = TryGuessColumnIndex(fieldDef.FieldName, dataReader);
299-
}
312+
index = FindColumnIndex(dataReader, fieldDef);
300313
}
301314

302315
dialectProvider.SetDbValue(fieldDef, dataReader, index, objWithProperties);

0 commit comments

Comments
 (0)