/// <summary> /// Save a <see cref="CDP4Common.DTO.Thing"/> to a cache table /// </summary> /// <param name="transaction">The current transaction</param> /// <param name="partition">The database partition (schema) where the requested resource is stored.</param> /// <param name="thing">The revised <see cref="CDP4Common.DTO.Thing"/></param> public void Write(NpgsqlTransaction transaction, string partition, Thing thing) { var table = this.GetThingCacheTableName(thing); var columns = string.Format("(\"{0}\", \"{1}\", \"{2}\")", IidKey, RevisionColumnName, JsonColumnName); var values = "(:iid, :revisionnumber, :jsonb)"; var sqlQuery = string.Format("INSERT INTO \"{0}\".\"{1}\" {2} VALUES {3} ON CONFLICT (\"{4}\") DO UPDATE SET \"{5}\"=:revisionnumber, \"{6}\"=:jsonb;", partition, table, columns, values, IidKey, RevisionColumnName, JsonColumnName); using (var command = new NpgsqlCommand(sqlQuery, transaction.Connection, transaction)) { command.Parameters.Add("iid", NpgsqlDbType.Uuid).Value = thing.Iid; command.Parameters.Add("revisionnumber", NpgsqlDbType.Integer).Value = thing.RevisionNumber; command.Parameters.Add("jsonb", NpgsqlDbType.Jsonb).Value = thing.ToJsonObject().ToString(Formatting.None); // log the sql command command.ExecuteNonQuery(); } }