Example #1
0
        public void TestEncodeDictionary1()
        {
            //Test1
            DictNode dict1   = new DictNode();
            string   source1 = BEncode.StringEncode(dict1);

            Assert.AreEqual(source1, "[]");

            //Test2
            DictNode dict2 = new DictNode();

            dict2.Add("age", 25);
            dict2.Add("eyes", "blue");
            string source2 = BEncode.StringEncode(dict2);

            Assert.AreEqual(source2, "[3:agei25e4:eyes4:blue]");


            //Test3
            DictNode dh31 = new DictNode();

            dh31.Add(Encoding.Default.GetBytes("author"), "Alice");
            dh31.Add("length", 1048576);
            DictNode dict3 = new DictNode();

            dict3.Add("spam.mp3", dh31);
            string source3 = BEncode.StringEncode(dict3);

            Assert.AreEqual(source3, "[8:spam.mp3[6:author5:Alice6:lengthi1048576e]]");
            Assert.AreEqual(dict3.ToString(), "[8:spam.mp3[6:author5:Alice6:lengthi1048576e]]");
        }
Example #2
0
        public void TestEncodeDictionary1()
        {
            //Test1
            DictNode dict1   = new DictNode();
            string   source1 = BEncodingFactory.StringEncode(dict1);

            Assert.AreEqual(source1, "de");

            //Test2
            DictNode dict2 = new DictNode();

            dict2.Add("age", 25);
            dict2.Add("eyes", "blue");
            string source2 = BEncodingFactory.StringEncode(dict2);

            Assert.AreEqual(source2, "d3:agei25e4:eyes4:bluee");


            //Test3
            DictNode dh31 = new DictNode();

            dh31.Add("author", "Alice");
            dh31.Add("length", 1048576);
            DictNode dict3 = new DictNode();

            dict3.Add("spam.mp3", dh31);
            string source3 = BEncodingFactory.StringEncode(dict3);

            Assert.AreEqual(source3, "d8:spam.mp3d6:author5:Alice6:lengthi1048576eee");
            Assert.AreEqual(dict3.ToString(), "d8:spam.mp3d6:author5:Alice6:lengthi1048576eee");
        }
Example #3
0
        /// <summary>
        /// 处理Scalar函数
        /// </summary>
        /// <param name="cmd">数据库命令</param>
        public DictNode HandleScalar(DbCommand cmd)
        {
            object obj;

            using (DbConnection conn = new SqlConnection(connectionString))
            {
                conn.Open();
                cmd.Connection = conn;
                obj            = cmd.ExecuteScalar();
            }

            DictNode result = new DictNode();

            result.Add("code", 3);
            BEncodedNode itemNode = CreateItemNode(obj);

            result.Add("item", itemNode);

            ListNode parmlistNode = CreateParmListNode(cmd);

            if (parmlistNode.Count != 0)
            {
                result.Add("parmlist", parmlistNode);
            }
            return(result);
        }
Example #4
0
        private ListNode CreateParmListNode(DbCommand cmd)
        {
            ListNode result = new ListNode();

            foreach (DbParameter para in cmd.Parameters)
            {
                switch (para.Direction)
                {
                case ParameterDirection.InputOutput:
                case ParameterDirection.Output:
                case ParameterDirection.ReturnValue:
                    DictNode parmNode = new DictNode();
                    parmNode.Add("name", para.ParameterName);
                    parmNode.Add("type", para.Value.GetType().ToString());
                    if (para.Value == DBNull.Value)
                    {
                        parmNode.Add("value", BytesNode.NullBytesNode);
                    }
                    else if (para.DbType == DbType.Binary)
                    {
                        parmNode.Add("value", (byte[])para.Value);
                    }
                    else
                    {
                        parmNode.Add("value", para.Value.ToString());
                    }
                    result.Add(parmNode);
                    break;
                }
            }
            cmd.Parameters.Clear();
            cmd.Dispose();
            return(result);
        }
Example #5
0
        /// <summary>
        /// 创建异常数据
        /// </summary>
        /// <param name="e">异常数据</param>
        /// <returns>返回异常数据节点</returns>
        static DictNode CreateExceptionNode(Exception e)
        {
            DictNode result = new DictNode();

            result.Add("code", 4);
            result.Add("message", string.Format("{0}: {1}", e.GetType(), e.Message));
            return(result);
        }
Example #6
0
        /// <summary>
        /// 新建握手数据包
        /// </summary>
        /// <param name="key">密钥</param>
        /// <param name="iv">初始化向量</param>
        /// <returns>返回握手数据包</returns>
        public static byte[] BuildHandshake(byte[] key, byte[] iv)
        {
            DictNode node = new DictNode();

            node.Add("key", key);
            node.Add("iv", iv);
            return(BEncode.ByteArrayEncode(node));
        }
Example #7
0
        /// <summary>
        /// 建立失败打开数据包
        /// </summary>
        /// <param name="message">失败消息</param>
        /// <returns>返回数据包</returns>
        private byte[] BuildFailOpenPacket(string message)
        {
            DictNode result = new DictNode();

            result.Add("code", 6);
            result.Add("message", message);
            return(BEncode.ByteArrayEncode(result));
        }
Example #8
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="key"></param>
        /// <param name="iv"></param>
        /// <returns></returns>
        private byte[] BuildAckMessage(byte[] key, byte[] iv)
        {
            DictNode node = new DictNode();

            node.Add("key", key);
            node.Add("iv", iv);
            return(BEncode.ByteArrayEncode(node));
        }
Example #9
0
        /// <summary>
        /// 建立连接包
        /// </summary>
        /// <returns></returns>
        private byte[] BuildHandshakeMessage()
        {
            DictNode node = new DictNode();

            node.Add("port", clientPort);
            node.Add("key", key);
            node.Add("iv", iv);
            return(BEncode.ByteArrayEncode(node));
        }
Example #10
0
        /// <summary>
        /// 建立成功打开数据包
        /// </summary>
        /// <param name="key">密钥</param>
        /// <param name="iv">初始化向量</param>
        /// <returns>返回数据包</returns>
        private byte[] BuildSuccessOpenPacket(byte[] key, byte[] iv)
        {
            DictNode result = new DictNode();

            result.Add("code", 1);
            result.Add("key", key);
            result.Add("iv", iv);
            return(BEncode.ByteArrayEncode(result));
        }
Example #11
0
        /// <summary>
        /// 建立打开DB Proxy Server包
        /// </summary>
        /// <returns>返回数据包</returns>
        private byte[] BuildOpenPacket()
        {
            DictNode rootNode = new DictNode();

            rootNode.Add("action", 1);
            rootNode.Add("deviceid", deviceId);
            rootNode.Add("priority", priority);
            return(BEncode.ByteArrayEncode(rootNode));
        }
Example #12
0
        /// <summary>
        /// 记录数据包
        /// </summary>
        /// <param name="buffer">待记录的数据包</param>
        /// <param name="endPoint">IP端点</param>
        public override void Write(byte[] buffer, IPEndPoint endPoint)
        {
            DictNode node = new DictNode();

            node.Add("buffer", buffer);
            node.Add("endpoint", endPoint.ToString());
            byte[] sndMsg = BEncode.ByteArrayEncode(node);
            handler.SendNormalPacket(sndMsg);
        }
Example #13
0
        /// <summary>
        /// 创建类型节点
        /// </summary>
        /// <param name="rdr">数据库读取器</param>
        /// <returns>返回类型节点</returns>
        private ListNode CreateTypeListNode(IDataRecord rdr)
        {
            ListNode result = new ListNode();

            for (int i = 0; i < rdr.FieldCount; i++)
            {
                DictNode columnNode = new DictNode();
                columnNode.Add("name", rdr.GetName(i));
                columnNode.Add("type", rdr.GetDataTypeName(i));
                result.Add(columnNode);
            }
            return(result);
        }
Example #14
0
        /// <summary>
        /// 创建Scalar返回值节点
        /// </summary>
        /// <param name="obj">Scalar返回值</param>
        /// <returns>返回Scalar返回值节点</returns>
        private BEncodedNode CreateItemNode(object obj)
        {
            string typeName = obj != null?obj.GetType().ToString() : typeof(object).ToString();

            BytesNode valueNode = obj != null
                                      ? typeName != "System.Byte[]" ? new BytesNode(obj.ToString()) : (byte[])obj
                                      : BytesNode.NullBytesNode;
            DictNode result = new DictNode();

            result.Add("type", typeName);
            result.Add("value", valueNode);
            return(result);
        }
Example #15
0
        private byte[] BuildMessage(DictNode contentNode)
        {
            switch (commandType)
            {
            case CommandType.Text:
                contentNode.Add("type", TextNum);
                return(BuildTextMessage(contentNode));

            case CommandType.StoredProcedure:
                contentNode.Add("type", ProcNum);
                return(BuildProcMessage(contentNode));
            }
            throw new DbProxyException("建立传输数据出错!");
        }
Example #16
0
        /// <summary>
        /// 处理Reader函数
        /// </summary>
        /// <param name="cmd">数据库命令</param>
        public DictNode HandleReader(DbCommand cmd)
        {
            DictNode result = new DictNode();

            using (DbConnection conn = new SqlConnection(connectionString))
            {
                conn.Open();
                cmd.Connection = conn;
                using (DbDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection))
                {
                    ListNode typeListNode = CreateTypeListNode(rdr);
                    result.Add("typelist", typeListNode);

                    ListNode itemsNode = new ListNode();
                    while (rdr.Read())
                    {
                        ListNode itemNode = new ListNode();
                        for (int i = 0; i < rdr.FieldCount; i++)
                        {
                            if (rdr.IsDBNull(i))
                            {
                                itemNode.Add(BytesNode.NullBytesNode);
                            }
                            else
                            {
                                if (IsBinaryType(rdr.GetDataTypeName(i)))
                                {
                                    itemNode.Add((byte[])rdr.GetValue(i));
                                }
                                else
                                {
                                    itemNode.Add(rdr.GetValue(i).ToString());
                                }
                            }
                        }
                        itemsNode.Add(itemNode);
                    }
                    result.Add("items", itemsNode);
                }
            }
            result.Add("code", 2);

            ListNode parmlistNode = CreateParmListNode(cmd);

            if (parmlistNode.Count != 0)
            {
                result.Add("parmlist", parmlistNode);
            }
            return(result);
        }
Example #17
0
        /// <summary>
        /// 生成存储过程发送的字节流
        /// </summary>
        /// <returns>返回发送的字节流</returns>
        private byte[] BuildProcMessage(DictNode contentNode)
        {
            contentNode.Add("text", commandText);

            //建立参数列表
            if (parameters.Count != 0)
            {
                ListNode parmsNode = new ListNode();
                foreach (DbProxyParameter para in parameters)
                {
                    DictNode parmNode = new DictNode();
                    parmNode.Add("name", para.ParameterName);
                    parmNode.Add("type", (int)para.DbType);

                    switch (para.Direction)
                    {
                    case ParameterDirection.Input:
                        parmNode.Add("value", NodeEncoder.GetValueNode(para));
                        break;

                    case ParameterDirection.Output:
                        parmNode.Add("direction", OutputNum);
                        break;

                    case ParameterDirection.InputOutput:
                        parmNode.Add("direction", InputOutputNum);
                        parmNode.Add("value", NodeEncoder.GetValueNode(para));
                        break;

                    case ParameterDirection.ReturnValue:
                        parmNode.Add("direction", ReturnValueNum);
                        break;
                    }


                    if (para.Size != 0)
                    {
                        parmNode.Add("size", para.Size);
                    }

                    parmsNode.Add(parmNode);
                }

                contentNode.Add("parms", parmsNode);
            }

            return(BEncode.ByteArrayEncode(contentNode));
        }
Example #18
0
        /// <summary>
        /// 创建关闭回应包
        /// </summary>
        /// <returns></returns>
        static DictNode CreateCloseNode()
        {
            DictNode result = new DictNode();

            result.Add("code", 1);
            return(result);
        }
Example #19
0
        public override object ExecuteScalar()
        {
            DictNode contentNode = new DictNode();

            contentNode.Add("action", 5);
            byte[] sendMsg = BuildMessage(contentNode);
            connection.SendPacket(sendMsg);
            byte[] rcvMsg = connection.ReceivePacket();
            return(DecodeScalar(rcvMsg));
        }
Example #20
0
        public override int ExecuteNonQuery()
        {
            DictNode contentNode = new DictNode();

            contentNode.Add("action", 3);
            byte[] sendMsg = BuildMessage(contentNode);
            connection.SendPacket(sendMsg);
            byte[] rcvMsg = connection.ReceivePacket();
            return(DecodeNonQuery(rcvMsg));
        }
Example #21
0
        public new DbProxyDataReader ExecuteReader()
        {
            DbProxyDataReader result = new DbProxyDataReader(this);

            DictNode contentNode = new DictNode();

            contentNode.Add("action", 4);
            byte[] sendMsg = BuildMessage(contentNode);
            connection.SendPacket(sendMsg);
            byte[] rcvMsg = connection.ReceivePacket();
            DecodeReader(rcvMsg, result.SchemaTable);
            return(result);
        }
Example #22
0
        /// <summary>
        /// 处理NonQuery函数
        /// </summary>
        /// <param name="cmd">数据库命令</param>
        public DictNode HandleNonQuery(DbCommand cmd)
        {
            int lineNum;

            using (DbConnection conn = new SqlConnection(connectionString))
            {
                conn.Open();
                cmd.Connection = conn;
                lineNum        = cmd.ExecuteNonQuery();
            }
            DictNode result = new DictNode();

            result.Add("code", 1);
            result.Add("linenum", lineNum);

            ListNode parmlistNode = CreateParmListNode(cmd);

            if (parmlistNode.Count != 0)
            {
                result.Add("parmlist", parmlistNode);
            }

            return(result);
        }
Example #23
0
 /// <summary>
 /// 生成SQL文本发送的字节流
 /// </summary>
 /// <returns>返回发送的字节流</returns>
 private byte[] BuildTextMessage(DictNode contentNode)
 {
     contentNode.Add("text", commandText);
     return(BEncode.ByteArrayEncode(contentNode));
 }