public void DeserializingSerializedStringRegeneratesSingleInt()
        {
            object[] parameters = new object[] { 123 };
            string   xml        = CallParametersSerializer.Serialize(parameters);

            object[] parameters2 = CallParametersSerializer.Deserialize(xml);
            Assert.IsNotNull(parameters2);
            Assert.AreEqual(1, parameters2.Length);
            Assert.AreEqual(123, parameters2[0]);
            Assert.IsTrue(typeof(int).IsAssignableFrom(parameters2[0].GetType()));
        }
        private static Request GetRequestFromReader(IDataReader reader)
        {
            Request request = new Request();

            request.Behavior   = new OfflineBehavior();
            request.RequestId  = (Guid)reader["RequestId"];
            request.Endpoint   = (string)reader["Endpoint"];
            request.MethodName = (string)reader["MethodName"];
            request.Behavior.ProxyFactoryType = Type.GetType((string)reader["ProxyFactoryType"]);
            request.OnlineProxyType           = Type.GetType((string)reader["OnlineProxyType"]);

            request.Behavior.Stamps = (ushort)(int)reader["Stamps"];
            if (!(reader["Tag"] is DBNull))
            {
                request.Behavior.Tag = (string)reader["Tag"];
            }
            if (!(reader["ReturnTargetType"] is DBNull))
            {
                request.Behavior.ReturnCallback =
                    GetCallbackFrom(reader, "ReturnTargetType", "ReturnMethodName");
            }
            if (!(reader["ExceptionTargetType"] is DBNull))
            {
                request.Behavior.ExceptionCallback =
                    GetCallbackFrom(reader, "ExceptionTargetType", "ExceptionMethodName");
            }
            if (!(reader["MaxRetries"] is DBNull))
            {
                request.Behavior.MaxRetries =
                    Convert.ToInt32(reader["MaxRetries"], CultureInfo.InvariantCulture);
            }
            if (!(reader["CallParameters"] is DBNull))
            {
                string serializedParameters = (string)reader["CallParameters"];
                request.CallParameters = CallParametersSerializer.Deserialize(serializedParameters);
            }
            request.Behavior.QueuedDate = (DateTime)reader["QueuedDate"];
            if (!(reader["MessageId"] is DBNull))
            {
                request.Behavior.MessageId = (Guid)reader["MessageId"];
            }
            if (!(reader["Expiration"] is DBNull))
            {
                request.Behavior.Expiration = (DateTime)reader["Expiration"];
            }

            return(request);
        }
        /// <summary>
        /// Adds a request to the queue.
        /// </summary>
        /// <param name="request">The Request to add to the queue.</param>
        /// <exception cref="RequestManagerException" />
        public void Enqueue(Request request)
        {
            Guard.ArgumentNotNull(request, "request");
            Guard.ArgumentNotNull(request.Behavior, "request.Behavior");
            Guard.ArgumentNotNull(request.MethodName, "request.MethodName");
            Guard.ArgumentNotNull(request.Behavior.ProxyFactoryType,
                                  "request.Behavior.ProxyFactoryType");
            Guard.ArgumentNotNull(request.OnlineProxyType, "request.OnlineProxyType");
            Guard.ArgumentNotNull(request.Endpoint, "request.Endpoint");

            request.Behavior.QueuedDate = DateTime.Now;

            string serializedParameters = String.Empty;

            if (request.CallParameters != null)
            {
                serializedParameters = CallParametersSerializer.Serialize(request.CallParameters);
            }

            string crLf = Environment.NewLine;

            StringBuilder sqlSb = new StringBuilder();

            sqlSb.AppendFormat("Insert {0}{1} ", tableName, crLf);
            sqlSb.AppendLine("          (");
            sqlSb.AppendLine("              RequestId,");
            sqlSb.AppendLine("              Endpoint,");
            sqlSb.AppendLine("              ProxyFactoryType,");
            sqlSb.AppendLine("              OnlineProxyType,");
            sqlSb.AppendLine("              MethodName,");
            sqlSb.AppendLine("              Tag,");
            sqlSb.AppendLine("              Stamps,");
            sqlSb.AppendLine("              ReturnTargetType,");
            sqlSb.AppendLine("              ReturnMethodName,");
            sqlSb.AppendLine("              ExceptionTargetType,");
            sqlSb.AppendLine("              ExceptionMethodName,");
            sqlSb.AppendLine("              MaxRetries,");
            sqlSb.AppendLine("              CallParameters,");
            sqlSb.AppendLine("              QueuedDate,");
            sqlSb.AppendLine("              MessageID,");
            sqlSb.AppendLine("              Expiration)");
            sqlSb.AppendLine("          VALUES(");
            sqlSb.AppendFormat("                {0},{1}", database.BuildParameterName("RequestId"), crLf);
            sqlSb.AppendFormat("                {0},{1}", database.BuildParameterName("Endpoint"), crLf);
            sqlSb.AppendFormat("                {0},{1}", database.BuildParameterName("ProxyFactoryType"), crLf);
            sqlSb.AppendFormat("                {0},{1}", database.BuildParameterName("OnlineProxyType"), crLf);
            sqlSb.AppendFormat("                {0},{1}", database.BuildParameterName("MethodName"), crLf);
            sqlSb.AppendFormat("                {0},{1}", database.BuildParameterName("Tag"), crLf);
            sqlSb.AppendFormat("                {0},{1}", database.BuildParameterName("Stamps"), crLf);
            sqlSb.AppendFormat("                {0},{1}", database.BuildParameterName("ReturnTargetType"), crLf);
            sqlSb.AppendFormat("                {0},{1}", database.BuildParameterName("ReturnMethodName"), crLf);
            sqlSb.AppendFormat("                {0},{1}", database.BuildParameterName("ExceptionTargetType"), crLf);
            sqlSb.AppendFormat("                {0},{1}", database.BuildParameterName("ExceptionMethodName"), crLf);
            sqlSb.AppendFormat("                {0},{1}", database.BuildParameterName("MaxRetries"), crLf);
            sqlSb.AppendFormat("                {0},{1}", database.BuildParameterName("CallParameters"), crLf);
            sqlSb.AppendFormat("                {0},{1}", database.BuildParameterName("QueuedDate"), crLf);
            sqlSb.AppendFormat("                {0},{1}", database.BuildParameterName("MessageID"), crLf);
            sqlSb.AppendFormat("                {0}{1}", database.BuildParameterName("Expiration"), crLf);
            sqlSb.AppendLine("          )");

            string sql = sqlSb.ToString();
            string returnTargetType    = null;
            string returnMethodName    = null;
            string exceptionTargetType = null;
            string exceptionMethodName = null;

            if (request.Behavior.ReturnCallback != null)
            {
                returnTargetType = request.Behavior.ReturnCallback.TargetType.AssemblyQualifiedName;
                returnMethodName = request.Behavior.ReturnCallback.TargetMethodName;
            }
            if (request.Behavior.ExceptionCallback != null)
            {
                exceptionTargetType =
                    request.Behavior.ExceptionCallback.TargetType.AssemblyQualifiedName;
                exceptionMethodName = request.Behavior.ExceptionCallback.TargetMethodName;
            }

            DbParameter[] parameters = new DbParameter[]
            {
                // Due to the limitation that limits DbType.String to 255 characters,
                // the SqlDbType.NText is used on all string fields with a length greater
                // than 250.
                database.CreateParameter("RequestId", DbType.Guid, 1, request.RequestId),
                database.CreateParameter("Endpoint", SqlDbType.NText, 300, request.Endpoint),
                database.CreateParameter("ProxyFactoryType", SqlDbType.NText, 1000,
                                         request.Behavior.ProxyFactoryType.AssemblyQualifiedName),
                database.CreateParameter("OnlineProxyType", SqlDbType.NText, 1000,
                                         request.OnlineProxyType.AssemblyQualifiedName),
                database.CreateParameter("MethodName", DbType.String, 200, request.MethodName),
                database.CreateParameter("Tag", SqlDbType.NText, 300, request.Behavior.Tag),
                database.CreateParameter("Stamps", DbType.Int16, 1, request.Behavior.Stamps),
                database.CreateParameter("ReturnTargetType", SqlDbType.NText, 1000,
                                         returnTargetType),
                database.CreateParameter("ReturnMethodName", DbType.String, 200,
                                         returnMethodName),
                database.CreateParameter("ExceptionTargetType", SqlDbType.NText, 1000,
                                         exceptionTargetType),
                database.CreateParameter("ExceptionMethodName", DbType.String, 200,
                                         exceptionMethodName),
                database.CreateParameter("MaxRetries", DbType.Int16, 1,
                                         request.Behavior.MaxRetries),
                database.CreateParameter("CallParameters", SqlDbType.NText,
                                         serializedParameters.Length + 1, serializedParameters),
                database.CreateParameter("QueuedDate", DbType.DateTime, 0,
                                         request.Behavior.QueuedDate),
                database.CreateParameter("MessageID", DbType.Guid, 0, request.Behavior.MessageId)
                ,
                database.CreateParameter("Expiration", DbType.DateTime, 0,
                                         request.Behavior.Expiration)
            };

            try
            {
                database.ExecuteNonQuery(sql, parameters);
            }
            catch (SqlCeException ex)
            {
                throw new RequestManagerException(
                          String.Format(CultureInfo.CurrentCulture, ex.Message,
                                        request.RequestId), ex);
            }

            if (RequestEnqueued != null)
            {
                RequestEnqueued(this, new RequestEnqueuedEventArgs(request));
            }
        }
 public void DeserializingNullStringThrows()
 {
     object[] parameters = CallParametersSerializer.Deserialize(null);
 }
 public void DeserializingEmptyStringReturnsEmptyArray()
 {
     object[] parameters = CallParametersSerializer.Deserialize(String.Empty);
     Assert.IsNotNull(parameters);
     Assert.AreEqual(0, parameters.Length);
 }
        public void SerializingEmptyArrayReturnsEmptyString()
        {
            string xml = CallParametersSerializer.Serialize(new object[0]);

            Assert.AreEqual(String.Empty, xml);
        }
        public void SerializingNullArrayReturnsEmptyString()
        {
            string xml = CallParametersSerializer.Serialize(null);

            Assert.AreEqual(String.Empty, xml);
        }