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); }
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); } } }
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); } }
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); } } }
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" }); }
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); }
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); }
private static void OnExecute(RedisRequest request) { request.TaskCompletion(); }