public static ArraySegment <byte>[] SerializePropertyBag(IDictionary <XName, InstanceValue> properties, InstanceEncodingOption encodingOption) { ArraySegment <byte>[] dataArrays = new ArraySegment <byte> [4]; if (properties.Count > 0) { IObjectSerializer serializer = ObjectSerializerFactory.GetObjectSerializer(encodingOption); XmlPropertyBag primitiveProperties = new XmlPropertyBag(); XmlPropertyBag primitiveWriteOnlyProperties = new XmlPropertyBag(); Dictionary <XName, object> complexProperties = new Dictionary <XName, object>(); Dictionary <XName, object> complexWriteOnlyProperties = new Dictionary <XName, object>(); Dictionary <XName, object>[] propertyBags = new Dictionary <XName, object>[] { primitiveProperties, complexProperties, primitiveWriteOnlyProperties, complexWriteOnlyProperties }; foreach (KeyValuePair <XName, InstanceValue> property in properties) { bool isComplex = (XmlPropertyBag.GetPrimitiveType(property.Value.Value) == PrimitiveType.Unavailable); bool isWriteOnly = (property.Value.Options & InstanceValueOptions.WriteOnly) == InstanceValueOptions.WriteOnly; int index = (isWriteOnly ? 2 : 0) + (isComplex ? 1 : 0); propertyBags[index].Add(property.Key, property.Value.Value); } // Remove the properties that are already stored as individual columns from the serialized blob primitiveWriteOnlyProperties.Remove(SqlWorkflowInstanceStoreConstants.StatusPropertyName); primitiveWriteOnlyProperties.Remove(SqlWorkflowInstanceStoreConstants.LastUpdatePropertyName); primitiveWriteOnlyProperties.Remove(SqlWorkflowInstanceStoreConstants.PendingTimerExpirationPropertyName); complexWriteOnlyProperties.Remove(SqlWorkflowInstanceStoreConstants.BinaryBlockingBookmarksPropertyName); for (int i = 0; i < propertyBags.Length; i++) { if (propertyBags[i].Count > 0) { if (propertyBags[i] is XmlPropertyBag) { dataArrays[i] = serializer.SerializeValue(propertyBags[i]); } else { dataArrays[i] = serializer.SerializePropertyBag(propertyBags[i]); } } } } return(dataArrays); }
public static ArraySegment <byte>[] SerializePropertyBag(IDictionary <XName, InstanceValue> properties, InstanceEncodingOption encodingOption) { ArraySegment <byte>[] segmentArray = new ArraySegment <byte> [4]; if (properties.Count > 0) { IObjectSerializer objectSerializer = ObjectSerializerFactory.GetObjectSerializer(encodingOption); XmlPropertyBag bag = new XmlPropertyBag(); XmlPropertyBag bag2 = new XmlPropertyBag(); Dictionary <XName, object> dictionary = new Dictionary <XName, object>(); Dictionary <XName, object> dictionary2 = new Dictionary <XName, object>(); Dictionary <XName, object>[] dictionaryArray = new Dictionary <XName, object>[] { bag, dictionary, bag2, dictionary2 }; foreach (KeyValuePair <XName, InstanceValue> pair in properties) { bool flag = XmlPropertyBag.GetPrimitiveType(pair.Value.Value) == PrimitiveType.Unavailable; int index = (((pair.Value.Options & InstanceValueOptions.WriteOnly) == InstanceValueOptions.WriteOnly) ? 2 : 0) + (flag ? 1 : 0); dictionaryArray[index].Add(pair.Key, pair.Value.Value); } bag2.Remove(SqlWorkflowInstanceStoreConstants.StatusPropertyName); bag2.Remove(SqlWorkflowInstanceStoreConstants.LastUpdatePropertyName); bag2.Remove(SqlWorkflowInstanceStoreConstants.PendingTimerExpirationPropertyName); dictionary2.Remove(SqlWorkflowInstanceStoreConstants.BinaryBlockingBookmarksPropertyName); for (int i = 0; i < dictionaryArray.Length; i++) { if (dictionaryArray[i].Count > 0) { if (dictionaryArray[i] is XmlPropertyBag) { segmentArray[i] = objectSerializer.SerializeValue(dictionaryArray[i]); } else { segmentArray[i] = objectSerializer.SerializePropertyBag(dictionaryArray[i]); } } } } return(segmentArray); }
private void SerializePromotedProperties(SqlParameterCollection parameters, StringBuilder commandTextBuilder, SaveWorkflowCommand saveWorkflowCommand) { int num = 0; foreach (KeyValuePair <string, Tuple <List <XName>, List <XName> > > pair in base.Store.Promotions) { StringBuilder builder = new StringBuilder(0x200); int num2 = 1; bool flag = false; string str = string.Format(CultureInfo.InvariantCulture, "@promotionName{0}", new object[] { num }); string str2 = string.Format(CultureInfo.InvariantCulture, "@instanceId{0}", new object[] { num }); builder.Append(string.Format(CultureInfo.InvariantCulture, "exec {0}.[InsertPromotedProperties] ", new object[] { "[System.Activities.DurableInstancing]" })); builder.Append("@promotionName="); builder.Append(str); builder.Append(","); builder.Append("@instanceId="); builder.Append(str2); foreach (XName name in pair.Value.Item1) { InstanceValue value2; if (saveWorkflowCommand.InstanceData.TryGetValue(name, out value2)) { if (!SerializationUtilities.IsPropertyTypeSqlVariantCompatible(value2)) { throw FxTrace.Exception.AsError(new InstancePersistenceException(System.Activities.DurableInstancing.SR.CannotPromoteAsSqlVariant(value2.Value.GetType().ToString(), name.ToString()))); } string str3 = string.Format(CultureInfo.InvariantCulture, "@value{0}=", new object[] { num2 }); string str4 = string.Format(CultureInfo.InvariantCulture, "@value{0}_promotion{1}", new object[] { num2, num }); SqlParameter parameter = new SqlParameter { SqlDbType = SqlDbType.Variant, ParameterName = str4, Value = value2.Value ?? DBNull.Value }; parameters.Add(parameter); builder.Append(", "); builder.Append(str3); builder.Append(str4); flag = true; } num2++; } num2 = 0x21; foreach (XName name2 in pair.Value.Item2) { InstanceValue value3; IObjectSerializer objectSerializer = ObjectSerializerFactory.GetObjectSerializer(base.Store.InstanceEncodingOption); if (saveWorkflowCommand.InstanceData.TryGetValue(name2, out value3)) { string str5 = string.Format(CultureInfo.InvariantCulture, "@value{0}=", new object[] { num2 }); string parameterName = string.Format(CultureInfo.InvariantCulture, "@value{0}_promotion{1}", new object[] { num2, num }); AddSerializedProperty(objectSerializer.SerializeValue(value3.Value), parameters, parameterName); builder.Append(", "); builder.Append(str5); builder.Append(parameterName); flag = true; } num2++; } if (flag) { SqlParameter parameter2 = new SqlParameter { SqlDbType = SqlDbType.NVarChar, Size = 400, ParameterName = str, Value = pair.Key }; parameters.Add(parameter2); SqlParameter parameter3 = new SqlParameter { SqlDbType = SqlDbType.UniqueIdentifier, ParameterName = str2, Value = base.InstancePersistenceContext.InstanceView.InstanceId }; parameters.Add(parameter3); builder.Append(";"); commandTextBuilder.AppendLine(builder.ToString()); num++; } } }
void SerializePromotedProperties(SqlParameterCollection parameters, StringBuilder commandTextBuilder, SaveWorkflowCommand saveWorkflowCommand) { const int SqlVariantStartColumn = 1; const string promotionNameParameter = "@promotionName="; const string instanceIdParameter = "@instanceId="; int promotionNumber = 0; foreach (KeyValuePair <string, Tuple <List <XName>, List <XName> > > promotion in base.Store.Promotions) { StringBuilder storedProcInvocationBuilder = new StringBuilder(SqlWorkflowInstanceStoreConstants.DefaultStringBuilderCapacity); int column = SqlVariantStartColumn; bool addPromotion = false; string promotionNameArgument = string.Format(CultureInfo.InvariantCulture, "@promotionName{0}", promotionNumber); string instanceIdArgument = string.Format(CultureInfo.InvariantCulture, "@instanceId{0}", promotionNumber); storedProcInvocationBuilder.Append(string.Format(CultureInfo.InvariantCulture, "exec {0}.[InsertPromotedProperties] ", SqlWorkflowInstanceStoreConstants.DefaultSchema)); storedProcInvocationBuilder.Append(promotionNameParameter); storedProcInvocationBuilder.Append(promotionNameArgument); storedProcInvocationBuilder.Append(","); storedProcInvocationBuilder.Append(instanceIdParameter); storedProcInvocationBuilder.Append(instanceIdArgument); foreach (XName name in promotion.Value.Item1) { InstanceValue propertyValue; if (saveWorkflowCommand.InstanceData.TryGetValue(name, out propertyValue)) { if (!SerializationUtilities.IsPropertyTypeSqlVariantCompatible(propertyValue)) { throw FxTrace.Exception.AsError(new InstancePersistenceException(SR.CannotPromoteAsSqlVariant(propertyValue.Value.GetType().ToString(), name.ToString()))); } string parameterName = string.Format(CultureInfo.InvariantCulture, "@value{0}=", column); string argumentName = string.Format(CultureInfo.InvariantCulture, "@value{0}_promotion{1}", column, promotionNumber); parameters.Add(new SqlParameter() { SqlDbType = SqlDbType.Variant, ParameterName = argumentName, Value = propertyValue.Value ?? DBNull.Value }); storedProcInvocationBuilder.Append(", "); storedProcInvocationBuilder.Append(parameterName); storedProcInvocationBuilder.Append(argumentName); addPromotion = true; } column++; } column = SqlVariantStartColumn + SqlWorkflowInstanceStoreConstants.MaximumPropertiesPerPromotion; foreach (XName name in promotion.Value.Item2) { InstanceValue propertyValue; IObjectSerializer serializer = ObjectSerializerFactory.GetObjectSerializer(base.Store.InstanceEncodingOption); if (saveWorkflowCommand.InstanceData.TryGetValue(name, out propertyValue)) { string parameterName = string.Format(CultureInfo.InvariantCulture, "@value{0}=", column); string argumentName = string.Format(CultureInfo.InvariantCulture, "@value{0}_promotion{1}", column, promotionNumber); SaveWorkflowAsyncResult.AddSerializedProperty(serializer.SerializeValue(propertyValue.Value), parameters, argumentName); storedProcInvocationBuilder.Append(", "); storedProcInvocationBuilder.Append(parameterName); storedProcInvocationBuilder.Append(argumentName); addPromotion = true; } column++; } if (addPromotion) { parameters.Add(new SqlParameter() { SqlDbType = SqlDbType.NVarChar, Size = 400, ParameterName = promotionNameArgument, Value = promotion.Key }); parameters.Add(new SqlParameter() { SqlDbType = SqlDbType.UniqueIdentifier, ParameterName = instanceIdArgument, Value = base.InstancePersistenceContext.InstanceView.InstanceId }); storedProcInvocationBuilder.Append(";"); commandTextBuilder.AppendLine(storedProcInvocationBuilder.ToString()); promotionNumber++; } } }