예제 #1
0
        public async Task <Result> Execute(Command cmd, params Type[] types)
        {
            var host = cmd.Read ? Host.GetReadHost() : Host.GetWriteHost();

            if (host == null)
            {
                return(new Result()
                {
                    ResultType = ResultType.NetError, Messge = "redis server is not available"
                });
            }
            var client = await host.Pop();

            if (client == null)
            {
                return new Result()
                       {
                           ResultType = ResultType.NetError, Messge = "exceeding maximum number of connections"
                       }
            }
            ;
            var result = host.Connect(client);

            if (result.IsError)
            {
                host.Push(client);

                return(result);
            }
            RedisRequest request = new RedisRequest(host, client, cmd, types);

            result = await request.Execute();

            return(result);
        }
예제 #2
0
        public async Task <Result> Execute(Command cmd, params Type[] types)
        {
            var host = cmd.Read ? Host.GetReadHost() : Host.GetWriteHost();

            if (host == null)
            {
                return(new Result()
                {
                    ResultType = ResultType.NetError, Messge = "redis server is not available"
                });
            }
            var client = await host.Pop();

            if (client == null)
            {
                return new Result()
                       {
                           ResultType = ResultType.NetError, Messge = "exceeding maximum number of connections"
                       }
            }
            ;
            try
            {
                var result = host.Connect(client);

                if (result.IsError)
                {
                    return(result);
                }
                using (var tarck = CodeTrackFactory.Track(cmd.Name, CodeTrackLevel.Module, null, "Redis", client.Host))
                {
                    if (tarck.Enabled)
                    {
                        tarck.Activity?.AddTag("tag", "BeetleX Redis");
                    }
                    cmd.Activity = tarck.Activity;
                    RedisRequest request = new RedisRequest(host, client, cmd, types);
                    request.Activity = tarck.Activity;
                    result           = await request.Execute();

                    return(result);
                }
            }
            finally
            {
                if (client != null)
                {
                    host.Push(client);
                }
            }
        }
예제 #3
0
 public Result Receive(RedisRequest request, PipeStream stream)
 {
     if (mReader.Read(request, stream))
     {
         foreach (var item in mReader.Items)
         {
             mResult.Data.Add(new ResultItem {
                 Type = ResultType.Object, Data = item
             });
         }
         return(mResult);
     }
     else
     {
         return(null);
     }
 }
예제 #4
0
 public async void Ping()
 {
     if (System.Threading.Interlocked.CompareExchange(ref mPingStatus, 1, 0) == 0)
     {
         try
         {
             Connect(mPingClient);
             Commands.PING ping    = new Commands.PING(null);
             var           request = new RedisRequest(null, mPingClient, ping, typeof(string));
             var           result  = await request.Execute();
         }
         catch
         {
         }
         finally
         {
             System.Threading.Interlocked.Exchange(ref mPingStatus, 0);
         }
     }
 }
예제 #5
0
        public Result Connect(RedisClient client)
        {
            if (!client.TcpClient.IsConnected)
            {
                bool isNew;
                if (client.TcpClient.Connect(out isNew))
                {
                    this.Available = true;
                    if (!string.IsNullOrEmpty(Password))
                    {
                        Commands.AUTH auth    = new Commands.AUTH(Password);
                        RedisRequest  request = new RedisRequest(null, client, auth, typeof(string));
                        var           task    = request.Execute();
                        task.Wait();
                        if (task.Result.ResultType == ResultType.DataError ||
                            task.Result.ResultType == ResultType.Error ||
                            task.Result.ResultType == ResultType.NetError)
                        {
                            return(task.Result);
                        }
                    }

                    Commands.SELECT select = new Commands.SELECT(DB);
                    var             req    = new RedisRequest(null, client, select, typeof(string));
                    var             t      = req.Execute();
                    t.Wait();
                    return(t.Result);
                }
                else
                {
                    this.Available = false;
                    return(new Result {
                        ResultType = ResultType.NetError, Messge = client.TcpClient.LastError.Message
                    });
                }
            }
            return(new Result {
                ResultType = ResultType.Simple, Messge = "Connected"
            });
        }
예제 #6
0
        public bool Read(RedisRequest request, PipeStream stream)
        {
            string line;

            if (mCount == null)
            {
                if (stream.TryReadLine(out line))
                {
                    if (line[0] == '-')
                    {
                        throw new RedisException(line.Substring(1));
                    }
                    mCount = int.Parse(line.Substring(1));
                    if (mCount <= 0)
                    {
                        return(true);
                    }
                }
            }
ReRead:
            if (mStatus == ReadStatus.None)
            {
                if (stream.TryReadLine(out line))
                {
                    mStatus = ReadStatus.ReadStream;
                }
            }
            if (mStatus == ReadStatus.ReadStream)
            {
                if (stream.TryReadLine(out line))
                {
                    mName   = line;
                    mStatus = ReadStatus.ReadNameLength;
                }
            }
            if (mStatus == ReadStatus.ReadNameLength)
            {
                if (stream.TryReadLine(out line))
                {
                    mName   = line;
                    mStatus = ReadStatus.ReadName;
                }
            }
            if (mStatus == ReadStatus.ReadName)
            {
                if (mItem == null)
                {
                    mItem = new StreamDataItemReader <T>();
                }
                if (mItem.Read(request, stream))
                {
                    StreamData <T> item = new StreamData <T>();
                    item.Name  = mName;
                    item.Items = mItem.Items;
                    Items.Add(item);
                    mItem   = null;
                    mName   = null;
                    mStatus = ReadStatus.None;
                    if (mCount != null && Items.Count >= mCount.Value)
                    {
                        return(true);
                    }
                    goto ReRead;
                }
            }
            return(false);
        }
예제 #7
0
        public bool Read(RedisRequest request, PipeStream stream)
        {
            string line;

            if (mCount == null)
            {
                if (stream.TryReadLine(out line))
                {
                    if (line[0] == '-')
                    {
                        throw new RedisException(line.Substring(1));
                    }
                    mCount = int.Parse(line.Substring(1));
                    if (mCount <= 0)
                    {
                        return(true);
                    }
                }
            }
ReRead:
            if (mReadStatus == ItemReadStaus.None)
            {
                if (stream.TryReadLine(out line))
                {
                    mReadStatus = ItemReadStaus.ReadMessage;
                }
            }
            if (mReadStatus == ItemReadStaus.ReadMessage)
            {
                if (stream.TryReadLine(out line))
                {
                    mValueLength = int.Parse(line.Substring(1));
                    mReadStatus  = ItemReadStaus.ReadIdLength;
                }
            }
            if (mReadStatus == ItemReadStaus.ReadIdLength)
            {
                if (stream.TryReadLine(out line))
                {
                    mID         = line;
                    mReadStatus = ItemReadStaus.ReadIdValue;
                }
            }
            if (mReadStatus == ItemReadStaus.ReadIdValue)
            {
                if (stream.TryReadLine(out line))
                {
                    if (line == "*-1")
                    {
                        StreamDataItem <T> item = new StreamDataItem <T>();
                        item.ID   = mID;
                        item.Data = default(T);
                        Items.Add(item);
                        if (mCount != null && Items.Count >= mCount.Value)
                        {
                            return(true);
                        }
                        mID          = null;
                        mValueLength = null;
                        mFields      = null;
                        mReadStatus  = ItemReadStaus.None;
                        goto ReRead;
                    }
                    else
                    {
                        mFields = int.Parse(line.Substring(1)) / 2;
                    }
                    mReadStatus = ItemReadStaus.ReadBody;
                }
            }
ReReadProperty:
            if (mReadStatus == ItemReadStaus.ReadBody)
            {
                if (stream.TryReadLine(out line))
                {
                    mValueLength = int.Parse(line.Substring(1));
                    mReadStatus  = ItemReadStaus.ReadFieldLength;
                }
            }
            if (mReadStatus == ItemReadStaus.ReadFieldLength)
            {
                if (stream.TryReadLine(out line))
                {
                    mFieldName  = line;
                    mReadStatus = ItemReadStaus.ReadField;
                }
            }
            if (mReadStatus == ItemReadStaus.ReadField)
            {
                if (stream.TryReadLine(out line))
                {
                    mValueLength = int.Parse(line.Substring(1));
                    mReadStatus  = ItemReadStaus.ReadValueLength;
                }
            }
            if (mReadStatus == ItemReadStaus.ReadValueLength)
            {
                if (stream.Length >= (mValueLength.Value + 2))
                {
                    if (typeof(T) == typeof(Dictionary <string, string>))
                    {
                        if (mProperty == null)
                        {
                            mProperty = new Dictionary <string, string>();
                        }
                        mProperty[mFieldName] = stream.ReadLine();
                        if (mProperty.Count >= mFields)
                        {
                            StreamDataItem <T> item = new StreamDataItem <T>();
                            item.ID   = mID;
                            item.Data = (T)(object)mProperty;
                            Items.Add(item);
                            mProperty  = null;
                            mFieldName = null;
                            mFields    = null;
                        }
                        else
                        {
                            mReadStatus = ItemReadStaus.ReadBody;
                            goto ReReadProperty;
                        }
                    }
                    else
                    {
                        var data = request.Command.DataFormater.DeserializeObject(typeof(T), request.Client, stream, mValueLength.Value);
                        stream.ReadFree(2);
                        StreamDataItem <T> item = new StreamDataItem <T>();
                        item.ID   = mID;
                        item.Data = (T)data;
                        Items.Add(item);
                    }
                    if (mCount != null && Items.Count >= mCount.Value)
                    {
                        return(true);
                    }
                    mID          = null;
                    mValueLength = null;
                    mFields      = null;
                    mReadStatus  = ItemReadStaus.None;
                    goto ReRead;
                }
            }
            return(false);
        }
예제 #8
0
 private static void OnExecute(RedisRequest request)
 {
     request.TaskCompletion();
 }