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

Commit 8c86a42

Browse files
committed
Add support for RowVersion to PostgreSql by leveraging system column xmin
1 parent 3c0ff14 commit 8c86a42

File tree

1 file changed

+36
-2
lines changed

1 file changed

+36
-2
lines changed

src/ServiceStack.OrmLite.PostgreSQL/PostgreSQLDialectProvider.cs

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,9 @@ public override string GetColumnDefinition(
6464
string defaultValue,
6565
string customFieldDefinition)
6666
{
67+
if (isRowVersion)
68+
return null;
69+
6770
string fieldDefinition = null;
6871
if (customFieldDefinition != null)
6972
{
@@ -119,6 +122,37 @@ public override string GetColumnDefinition(
119122
return sql.ToString();
120123
}
121124

125+
public override string GetColumnNames(ModelDefinition modelDef)
126+
{
127+
var sqlColumns = new StringBuilder();
128+
foreach (var field in modelDef.FieldDefinitions)
129+
{
130+
if (sqlColumns.Length > 0)
131+
sqlColumns.Append(", ");
132+
133+
if (field.IsRowVersion)
134+
sqlColumns.Append("xmin as " + GetQuotedColumnName(field.FieldName));
135+
else
136+
sqlColumns.Append(GetQuotedColumnName(field.FieldName));
137+
}
138+
139+
return sqlColumns.ToString();
140+
}
141+
142+
public override void AppendFieldCondition(StringBuilder sqlFilter, FieldDefinition fieldDef, IDbCommand cmd)
143+
{
144+
var columnName = fieldDef.IsRowVersion
145+
? "int8in(xidout(xmin))" //Convert xmin into an integer so it can be used in comparisons
146+
: GetQuotedColumnName(fieldDef.FieldName);
147+
148+
sqlFilter
149+
.Append(columnName)
150+
.Append("=")
151+
.Append(this.GetParam(SanitizeFieldNameForParamName(fieldDef.FieldName)));
152+
153+
AddParameter(cmd, fieldDef);
154+
}
155+
122156
public override string GetQuotedValue(string paramValue)
123157
{
124158
return "'" + paramValue.Replace("'", @"''") + "'";
@@ -248,8 +282,8 @@ public override string GetQuotedTableName(ModelDefinition modelDef)
248282
/// <returns></returns>
249283
internal static String ToBinary(Object NativeData)
250284
{
251-
Byte[] byteArray = (Byte[])NativeData;
252-
StringBuilder res = new StringBuilder(byteArray.Length * 5);
285+
var byteArray = (Byte[])NativeData;
286+
var res = new StringBuilder(byteArray.Length * 5);
253287
foreach (byte b in byteArray)
254288
if (b >= 0x20 && b < 0x7F && b != 0x27 && b != 0x5C)
255289
res.Append((char)b);

0 commit comments

Comments
 (0)