public async Task OnSnapshot_CreateKeyIterator(NetMessage msgRecv, byte[] id)
        {
            var msg = NetMessage.Create("__db.snapshot.newiterator.back");

            msg.Params["_id"] = id;
            try
            {
                UInt64 snapheight = BitConverter.ToUInt64(msgRecv.Params["snapheight"]);
                var    snap       = peerSnapshots[snapheight];

                //这里缺一个给唯一ID的方式,采用顺序编号是个临时方法
                var   beginkey = msgRecv.Params?["beginkey"];
                var   endkey   = msgRecv.Params?["endkey"];
                var   iter     = snap.CreateKeyIterator(msgRecv.Params["tableid"], beginkey, endkey);
                ulong index    = (UInt64)this.peerItertors.Count;
                this.peerItertors[index] = iter;

                msg.Params["iteratorid"] = BitConverter.GetBytes(index);
            }
            catch (Exception err)
            {
                msg.Params["_error"] = err.Message.ToBytes_UTF8Encode();
            }
            //这个完全可以不要等待呀
            SendToClient(msg);
        }
        public async Task OnDB_UseSnapShot(NetMessage msgRecv, byte[] id)
        {
            var msg = NetMessage.Create("_db.usesnapshot.back");

            msg.Params["_id"] = id;
            try
            {
                UInt64?wantheight = msgRecv.Params.ContainsKey("snapheight") ? (UInt64?)BitConverter.ToUInt64(msgRecv.Params["snapheight"], 0) : null;
                if (wantheight == null)
                {
                    var snapshot = Program.storage.maindb.UseSnapShot();
                    wantheight = snapshot.DataHeight;
                    peerSnapshots[snapshot.DataHeight] = snapshot;
                }
                else
                {
                    if (peerSnapshots.ContainsKey(wantheight.Value) == false)
                    {
                        msg.Params["_error"] = "do not have that snapheight".ToBytes_UTF8Encode();
                    }
                }
                if (msg.Params.ContainsKey("_error") == false)
                {
                    msg.Params["snapheight"] = BitConverter.GetBytes(wantheight.Value);
                }
            }
            catch (Exception err)
            {
                msg.Params["_error"] = err.Message.ToBytes_UTF8Encode();
            }
            SendToClient(msg);
        }
        public async Task OnSnapshotEXT_GetWriter(NetMessage msgRecv, byte[] id)
        {
            var msg = NetMessage.Create("_db.snapshot.getwriter.back");

            msg.Params["_id"] = id;
            try
            {
                UInt64 snapheight = BitConverter.ToUInt64(msgRecv.Params["snapheight"]);
                var    snap       = peerSnapshots[snapheight];
                var    allwriter  = snap.CreateKeyFinder(StorageService.tableID_Writer);
                int    n          = 0;
                foreach (var wkey in allwriter)
                {
                    var v = snap.GetValue(StorageService.tableID_Writer, wkey);
                    if (v.AsBool() == true)
                    {
                        msg.Params["writer" + n] = wkey;
                        n++;
                    }
                }
            }
            catch (Exception err)
            {
                msg.Params["_error"] = err.Message.ToBytes_UTF8Encode();
            }
            //这个完全可以不要等待呀
            SendToClient(msg);
        }
        public async Task OnPing(NetMessage msgRecv, byte[] id)
        {
            var msg = NetMessage.Create("_ping.back");

            msg.Params["_id"] = id;
            SendToClient(msg);
        }
Пример #5
0
	void OnUpdateDuration (SocketIOEvent e) {

			Response.Duration msg = e.Deserialize<Response.Duration> ();
			Debug.Log("OnUpdateDuration:  " + msg.duration);

			if(messageReceived != null)
				messageReceived (NetMessage.Create ("UpdateDuration", msg.duration));
		
	}
Пример #6
0
	/**
	 *	Events
	 */

	void OnMessage (SocketIOEvent e) {

		Response.Message msg = e.Deserialize<Response.Message> ();

		if (msg.key == "InstanceDataLoaded") { // Special case
			Models.InstanceData ins = e.Deserialize<Models.InstanceData> ();
			msg.str1 = JsonWriter.Serialize (ins);
		}

		if (messageReceived != null) {
			messageReceived (NetMessage.Create (msg.key, msg.str1, msg.str2, msg.val));
		}
	}
        public async Task OnSnapshotDataHeight(NetMessage msgRecv, byte[] id)
        {
            var msg = NetMessage.Create("_db.snapshot.dataheight.back");

            msg.Params["_id"] = id;
            try
            {
                UInt64 snapheight = BitConverter.ToUInt64(msgRecv.Params["snapheight"]);
                var    snap       = peerSnapshots[snapheight];
                msg.Params["dataheight"] = BitConverter.GetBytes(snap.DataHeight);
            }
            catch (Exception err)
            {
                msg.Params["_error"] = err.Message.ToBytes_UTF8Encode();
            }
            SendToClient(msg);
        }
        public async Task OnDB_State(NetMessage msgRecv, byte[] id)
        {
            var msg = NetMessage.Create("_db.state.back");

            msg.Params["_id"]    = id;
            msg.Params["dbopen"] = new byte[] { (byte)(Program.storage.state_DBOpen ? 1 : 0) };
            if (Program.storage.state_DBOpen)
            {
                try
                {
                    using (var snap = Program.storage.maindb.UseSnapShot())
                    {
                        msg.Params["height"] = BitConverter.GetBytes(snap.DataHeight);
                        //Console.WriteLine("dataheight=" + snap.DataHeight);
                        var value = snap.GetValue(AllpetDB.systemtable_info, "_magic_".ToBytes_UTF8Encode());
                        if (value != null)
                        {
                            msg.Params["magic"] = value.value;
                        }

                        var keys = snap.CreateKeyFinder(StorageService.tableID_Writer);
                        var i    = 0;
                        foreach (byte[] keybin in keys)
                        {
                            //var key = keybin.ToString_UTF8Decode();
                            var iswriter = snap.GetValue(StorageService.tableID_Writer, keybin).AsBool();
                            if (iswriter)
                            {
                                i++;
                                msg.Params["writer" + i] = keybin;
                                //Console.WriteLine("writer:" + key);
                            }
                        }
                    }
                }
                catch (Exception err)
                {
                    msg.Params["_error"] = err.Message.ToBytes_UTF8Encode();
                }
            }
            else
            {
                msg.Params["_error"] = "db not open.".ToBytes_UTF8Encode();
            }
            SendToClient(msg);
        }
        public async Task OnSnapshotEXT_GetBlockHash(NetMessage msgRecv, byte[] id)
        {
            var msg = NetMessage.Create("_db.snapshot.getblockhash.back");

            msg.Params["_id"] = id;
            try
            {
                UInt64 snapheight = BitConverter.ToUInt64(msgRecv.Params["snapheight"]);
                var    snap       = peerSnapshots[snapheight];
                byte[] data       = snap.GetValueData(StorageService.tableID_BlockID2Hash, msgRecv.Params["blockid"]);
                msg.Params["data"] = data;
            }
            catch (Exception err)
            {
                msg.Params["_error"] = err.Message.ToBytes_UTF8Encode();
            }
            //这个完全可以不要等待呀
            SendToClient(msg);
        }
        public async Task OnSnapshot_IteratorReset(NetMessage msgRecv, byte[] id)
        {
            var msg = NetMessage.Create("_db.iterator.reset.back");

            msg.Params["_id"] = id;
            try
            {
                UInt64 iteratorid = BitConverter.ToUInt64(msgRecv.Params["iteratorid"]);
                var    it         = peerItertors[iteratorid];

                it.Reset();
            }
            catch (Exception err)
            {
                msg.Params["_error"] = err.Message.ToBytes_UTF8Encode();
            }
            //这个完全可以不要等待呀
            SendToClient(msg);
        }
        public async Task OnSnapshot_GetTableCount(NetMessage msgRecv, byte[] id)
        {
            var msg = NetMessage.Create("_db.snapshot.gettablecount.back");

            msg.Params["_id"] = id;
            try
            {
                UInt64 snapheight = BitConverter.ToUInt64(msgRecv.Params["snapheight"]);
                var    snap       = peerSnapshots[snapheight];
                byte[] data       = BitConverter.GetBytes(snap.GetTableCount(msgRecv.Params["tableid"]));
                msg.Params["count"] = data;
            }
            catch (Exception err)
            {
                msg.Params["_error"] = err.Message.ToBytes_UTF8Encode();
            }
            //这个完全可以不要等待呀
            SendToClient(msg);
        }
        public async Task OnDB_UnuseSnapShot(NetMessage msgRecv, byte[] id)
        {
            var msg = NetMessage.Create("_db.unusesnapshot.back");

            msg.Params["_id"] = id;
            try
            {
                UInt64 snapheight = BitConverter.ToUInt64(msgRecv.Params["snapheight"]);
                bool   b          = peerSnapshots.TryRemove(snapheight, out ISnapShot value);
                if (b)
                {
                    value.Dispose();
                }
                msg.Params["remove"] = new byte[] { (byte)(b ? 1 : 0) };
            }
            catch (Exception err)
            {
                msg.Params["_error"] = err.Message.ToBytes_UTF8Encode();
            }
            SendToClient(msg);
        }
        public async Task OnSnapshot_GetTableInfo(NetMessage msgRecv, byte[] id)
        {
            var msg = NetMessage.Create("_db.snapshot.gettableinfo.back");

            msg.Params["_id"] = id;
            try
            {
                UInt64 snapheight = BitConverter.ToUInt64(msgRecv.Params["snapheight"]);
                var    snap       = peerSnapshots[snapheight];

                //此处可以优化,增加一个GetTableInfoData,不要转一次
                byte[] data = snap.GetTableInfo(msgRecv.Params["tableid"]).ToBytes();
                msg.Params["info"] = data;
            }
            catch (Exception err)
            {
                msg.Params["_error"] = err.Message.ToBytes_UTF8Encode();
            }
            //这个完全可以不要等待呀
            SendToClient(msg);
        }
        public async Task OnSnapshot_IteratorNext(NetMessage msgRecv, byte[] id)
        {
            var msg = NetMessage.Create("_db.iterator.next.back");

            msg.Params["_id"] = id;

            try
            {
                UInt64 iteratorid = BitConverter.ToUInt64(msgRecv.Params["iteratorid"]);
                var    it         = peerItertors[iteratorid];

                var b = it.MoveNext();
                msg.Params["movenext"] = new byte[] { (byte)(b ? 1 : 0) };
                var data = it.Current;
                msg.Params["data"] = data;
            }
            catch (Exception err)
            {
                msg.Params["_error"] = err.Message.ToBytes_UTF8Encode();
            }
            //这个完全可以不要等待呀
            SendToClient(msg);
        }
Пример #15
0
 /// <summary>
 /// Sends a message to all clients
 /// </summary>
 /// <param name="id">The message id</param>
 /// <param name="str1">String information to include in the message</param>
 /// <param name="str2">String information to include in the message</param>
 public void ScheduleMessage(string id, string str1, string str2)
 {
     ScheduleMessage(NetMessage.Create(id, str1, str2));
 }
Пример #16
0
    // -- Public methods

    /// <summary>
    /// Sends a message to all clients
    /// </summary>
    /// <param name="id">The message id</param>
    public void ScheduleMessage(string id)
    {
        ScheduleMessage(NetMessage.Create(id));
    }
Пример #17
0
 /// <summary>
 /// Sends a message to all clients
 /// </summary>
 /// <param name="id">The message id</param>
 /// <param name="str1">String information to include in the message</param>
 /// <param name="str2">String information to include in the message</param>
 /// <param name="val">Integer information to include in the message</param>
 public void ScheduleMessage(string id, string str1, int val)
 {
     ScheduleMessage(NetMessage.Create(id, str1, "", val));
 }
Пример #18
0
        public NetMessage Process(UInt64 peerid, byte[] data)
        {
            using (MemoryStream ms = new MemoryStream(data))
            {
                NetMessage netMsg = NetMessage.Unpack(ms);
                string     cmd    = netMsg.Cmd;
                string     id     = netMsg.ID;
                NetMessage netMsgBack;
                try
                {
                    switch (cmd)
                    {
                    case "_db.usesnapshot":
                    {
                        var snapshot = StorageService.maindb.UseSnapShot();
                        peerSnapshots[snapshot.DataHeight] = StorageService.maindb.UseSnapShot();
                        var p = new Param()
                        {
                            result = true, snapid = snapshot.DataHeight
                        };
                        netMsgBack = NetMessage.Create(cmd, p, id);
                        return(netMsgBack);
                    }

                    case "_db.disposeSnapshot":
                    {
                        ISnapShot snapshot;
                        peerSnapshots.TryRemove(netMsg.Param.snapid, out snapshot);
                        snapshot.Dispose();
                        var p = new Param()
                        {
                            result = true
                        };
                        netMsgBack = NetMessage.Create(cmd, p, id);
                        return(netMsgBack);
                    }

                    case "_db.CreateWriteBatch":
                    {
                        var wb = StorageService.maindb.CreateWriteBatch();
                        peerWriteBatch[wb.Wbid] = wb;
                        var p = new Param()
                        {
                            result = true, wbid = wb.Wbid
                        };
                        netMsgBack = NetMessage.Create(cmd, p, id);
                        return(netMsgBack);
                    }

                    case "_db.put":
                    {
                        IWriteBatch writeBatch = peerWriteBatch[netMsg.Param.wbid];
                        writeBatch.Put(netMsg.Param.tableid, netMsg.Param.key, netMsg.Param.value);
                        var p = new Param()
                        {
                            result = true
                        };
                        netMsgBack = NetMessage.Create(cmd, p, id);
                        return(netMsgBack);
                    }

                    case "_db.delete":
                    {
                        IWriteBatch writeBatch = peerWriteBatch[netMsg.Param.wbid];
                        writeBatch.Delete(netMsg.Param.tableid, netMsg.Param.key);
                        var p = new Param()
                        {
                            result = true
                        };
                        netMsgBack = NetMessage.Create(cmd, p, id);
                        return(netMsgBack);
                    }

                    case "_db.write":
                    {
                        IWriteBatch writeBatch = peerWriteBatch[netMsg.Param.wbid];
                        var         p          = new Param()
                        {
                            result = false
                        };
                        if (writeBatch.wbcount > 0)
                        {
                            StorageService.maindb.WriteBatch(writeBatch);
                            peerWriteBatch.Remove(netMsg.Param.wbid, out writeBatch);
                            p = new Param()
                            {
                                result = true
                            };
                        }
                        netMsgBack = NetMessage.Create(cmd, p, id);
                        return(netMsgBack);
                    }

                    case "_db.getvalue":    //使用最新的snapshot 基本就是给apiserver用的
                    {
                        ISnapShot snapshot = StorageService.maindb.UseSnapShot();
                        var       tableid  = netMsg.Param.tableid;
                        var       key      = netMsg.Param.key;
                        var       value    = snapshot.GetValueData(tableid, key);
                        Param     param    = new Param();
                        param.snapid  = snapshot.DataHeight;
                        param.result  = true;
                        param.value   = value;
                        param.key     = key;
                        param.tableid = tableid;
                        netMsgBack    = NetMessage.Create(cmd, param, id);
                        return(netMsgBack);
                    }

                    case "_db.snapshot.getvalue":
                    {
                        ISnapShot snapshot = peerSnapshots[netMsg.Param.snapid];
                        var       tableid  = netMsg.Param.tableid;
                        var       key      = netMsg.Param.key;
                        var       value    = snapshot.GetValueData(tableid, key);
                        Param     param    = new Param();
                        param.snapid  = snapshot.DataHeight;
                        param.result  = true;
                        param.value   = value;
                        param.key     = key;
                        param.tableid = tableid;
                        netMsgBack    = NetMessage.Create(cmd, param, id);
                        return(netMsgBack);
                    }

                    case "_db.snapshot.newiterator":
                    {
                        ISnapShot snapshot = peerSnapshots[netMsg.Param.snapid];
                        var       beginKey = netMsg.Param.key;
                        var       endKey   = netMsg.Param.value;
                        var       tableid  = netMsg.Param.tableid;
                        var       iter     = snapshot.CreateKeyIterator(tableid, beginKey, endKey);
                        var       itid     = iter.HandleID;
                        peerKeyIterator[itid] = iter;
                        var p = new Param()
                        {
                            result = true, itid = itid, snapid = netMsg.Param.snapid
                        };
                        netMsgBack = NetMessage.Create(cmd, p, id);
                        return(netMsgBack);
                    }

                    case "_db.iterator.current":
                    {
                        IKeyIterator keyIterator = peerKeyIterator[netMsg.Param.itid];
                        var          cur         = keyIterator.Current;
                        Param        param       = new Param();
                        param.itid   = netMsg.Param.itid;
                        param.result = true;
                        param.value  = cur;
                        netMsgBack   = NetMessage.Create(cmd, param, id);
                        return(netMsgBack);
                    }

                    case "_db.iterator.next":
                    {
                        IKeyIterator keyIterator = peerKeyIterator[netMsg.Param.itid];
                        var          result      = keyIterator.MoveNext();
                        Param        param       = new Param();
                        param.itid   = netMsg.Param.itid;
                        param.result = result;
                        netMsgBack   = NetMessage.Create(cmd, param, id);
                        return(netMsgBack);
                    }

                    case "_db.iterator.seektofirst":
                    {
                        IKeyIterator keyIterator = peerKeyIterator[netMsg.Param.itid];
                        keyIterator.SeekToFirst();
                        var p = new Param()
                        {
                            result = true, itid = netMsg.Param.itid
                        };
                        netMsgBack = NetMessage.Create(cmd, p, id);
                        return(netMsgBack);
                    }

                    case "_db.iterator.reset":
                    {
                        IKeyIterator keyIterator = peerKeyIterator[netMsg.Param.itid];
                        keyIterator.Reset();
                        Param param = new Param();
                        param.result = true;
                        param.itid   = netMsg.Param.itid;
                        netMsgBack   = NetMessage.Create(cmd, param, id);
                        return(netMsgBack);
                    }

                    default:
                        throw new Exception("unknown msg cmd:" + netMsg.Cmd);
                    }
                }
                catch (Exception e)
                {
                    netMsgBack = NetMessage.Create(cmd, new Param()
                    {
                        error = Encoding.UTF8.GetBytes(e.Message)
                    }, id);
                    return(netMsgBack);
                }
            }
        }
Пример #19
0
        public async Task OnDB_Write(NetMessage msgRecv, byte[] id)
        {
            var msg = NetMessage.Create("_db.write.back");

            msg.Params["_id"] = id;
            try
            {
                var data      = msgRecv.Params["taskdata"];
                var signdata  = msgRecv.Params["signdata"];
                var writetask = WriteTask.FromRaw(data);
                if (writetask.extData?.ContainsKey("lasthash") == true)
                {
                    var lastblockhashRecv = writetask.extData["lasthash"];
                    lock (dblock)
                    {
                        using (var snap = Program.storage.maindb.UseSnapShot())
                        {
                            var blockidlast = BitConverter.GetBytes((UInt64)(snap.DataHeight - 1));

                            byte[] taskhash = Helper.CalcHash256(data);//.Sha256.ComputeHash(data);
                            //不够用,还需要block高度
                            var lasthashFind = snap.GetValue(StorageService.tableID_BlockID2Hash, blockidlast).value;

                            if (Helper.BytesEquals(lastblockhashRecv, lasthashFind))
                            {
                                //数据追加处理
                                Action <WriteTask, byte[], IWriteBatch> afterparser = (_task, _data, _wb) =>
                                {
                                    if (_wb.snapshot.DataHeight != snap.DataHeight)
                                    {
                                        throw new Exception("sync problem,diff snap found.");
                                    }
                                    _wb.Put(StorageService.tableID_BlockID2Hash, snap.DataHeightBuf, DBValue.FromValue(DBValue.Type.Bytes, taskhash));
                                };
                                //写入数据
                                Program.storage.maindb.Write(writetask, afterparser);

                                //进表
                                msg.Params["blockid"]   = snap.DataHeightBuf;
                                msg.Params["blockhash"] = taskhash;
                            }
                            else
                            {
                                msg.Params["_error"] = "block hash is error".ToBytes_UTF8Encode();
                            }
                        }
                    }
                }
                else
                {
                    msg.Params["_error"] = "no last block hash.".ToBytes_UTF8Encode();
                }
            }
            catch (Exception err)
            {
                msg.Params["_error"] = err.Message.ToBytes_UTF8Encode();
            }

            //这个完全可以不要等待呀
            SendToClient(msg);
        }
Пример #20
0
 /// <summary>
 /// Sends a message to all clients
 /// </summary>
 /// <param name="id">The message id</param>
 /// <param name="val">Integer information to include in the message</param>
 /// <param name="bytes">byte[] information to include in the message</param>
 public void ScheduleMessage(string id, int val, byte[] bytes)
 {
     ScheduleMessage(NetMessage.Create(id, "", "", val, bytes));
 }
Пример #21
0
    void GotoView(NetMessage msg)
    {
        Co.YieldWhileTrue(() => { return(Animating); }, () => {
            Co.WaitForSeconds(0.5f, () => {
                switch (msg.str1)
                {
                case "deck":
                    if (Hosting)
                    {
                        PressRadioButton("deck_list", "Civic");
                    }
                    break;

                case "pot":
                case "bio":
                case "agenda":
                case "question":
                case "think_instructions":
                case "pitch_instructions":
                case "deliberate_instructions":
                case "winner":
                case "agenda_item_accept":
                case "agenda_item_reject":
                case "scoreboard":
                    PressNext();
                    break;

                case "roles":
                    if (IsDecider)
                    {
                        PressButton("play");
                    }
                    break;

                case "think":
                    if (IsDecider)
                    {
                        PressTimerButton();
                    }
                    break;

                case "pitch":
                    if (IsDecider)
                    {
                        PressTimerButton();
                    }
                    else
                    {
                        Co.YieldWhileTrue(() => { return(Game.Views.CurrView != "extra_time"); }, () => {
                            GotoView(NetMessage.Create("GotoView", "extra_time"));
                        });
                    }
                    break;

                case "extra_time":
                case "extra_time_deliberate":
                    PressButton("decline");
                    break;

                case "deliberate":
                    if (IsDecider)
                    {
                        PressTimerButton();
                    }
                    else
                    {
                        Co.YieldWhileTrue(() => { return(Game.Views.CurrView != "extra_time_deliberate"); }, () => {
                            GotoView(NetMessage.Create("GotoView", "extra_time_deliberate"));
                        });
                    }
                    break;

                case "decide":
                    if (IsDecider)
                    {
                        PressListButton("peer_list", Game.Controller.PeerNames[0]);
                        PressButton("confirm");
                    }
                    break;

                case "agenda_item":
                    if (IsDecider)
                    {
                        bool accept = Random.value > 0.5f;
                        if (accept)
                        {
                            PressButton("accept");
                        }
                        else
                        {
                            PressButton("reject");
                        }
                    }
                    break;
                }
            });
        });
    }