public Task PutAsync(K key, V value) { return(ExecCommandAsync(async cmd => { // Retrieve all rows string commandBegin = $"INSERT INTO {tableName} ("; string commandLeftMiddle = ") VALUES ("; string commandRightMiddle = ") ON CONFLICT (id) DO UPDATE SET ("; string commandRightRightMidle = ") = ("; string commandEnd = $") WHERE {tableName}.id=@id"; var updatedColumnNames = new SCG.List <string>(); var properties = typeof(V).GetProperties(); foreach (var p in properties) { var propertyValue = p.GetValue(value); var columnName = p.Name.ToLower(); if (columnName == "id") { Trace.Assert(object.Equals(key, propertyValue)); } else { if (columnName == "created" || columnName == "updated") { propertyValue = DateTime.Now; } var param = cmd.CreateParameter(); param.ParameterName = columnName; param.Value = propertyValue ?? DBNull.Value; cmd.Parameters.Add(param); updatedColumnNames.Add(columnName); } } var idParam = cmd.CreateParameter(); idParam.ParameterName = "id"; idParam.Value = key; cmd.Parameters.Add(idParam); cmd.CommandText = commandBegin + updatedColumnNames.Concat("id").Join(", ") + commandLeftMiddle + updatedColumnNames.Concat("id").Select(x => $"@{x}").Join(", ") + commandRightMiddle + updatedColumnNames.Join(", ") + commandRightRightMidle + updatedColumnNames.Select(x => $"@{x}").Join(", ") + commandEnd; var rowsAffected = await cmd.ExecuteNonQueryAsync().ConfigureAwait(false); Trace.Assert(1 == rowsAffected); })); }
public Task <Entry <K, V> > InsertAsync(V item) { return(ExecCommandAsync(async cmd => { // Retrieve all rows var commandStart = $"INSERT INTO {tableName} ("; var commandMiddle = ") VALUES ("; var commandEnd = ") RETURNING *"; var insertedColumnNames = new SCG.List <string>(); foreach (var property in typeof(V).GetProperties()) { var columnName = property.Name.ToLower(); if (columnName == "id") { continue; } var propertyValue = property.GetValue(item); var defaultPropertyValue = property.PropertyType.IsValueType ? Activator.CreateInstance(property.PropertyType) : null; if (!Equals(propertyValue, defaultPropertyValue)) { insertedColumnNames.Add(columnName); var parameter = cmd.CreateParameter(); parameter.ParameterName = columnName; parameter.Value = propertyValue; cmd.Parameters.Add(parameter); } } cmd.CommandText = commandStart + insertedColumnNames.Join(", ") + commandMiddle + insertedColumnNames.Select(c => $"@{c}").Join(", ") + commandEnd; using (var reader = await cmd.ExecuteReaderAsync().ConfigureAwait(false)) { Trace.Assert(reader.HasRows); var readSuccessful = await reader.ReadAsync().ConfigureAwait(false); Trace.Assert(readSuccessful); var entry = ReadToEntry(reader); readSuccessful = await reader.ReadAsync().ConfigureAwait(false); Trace.Assert(!readSuccessful); return entry; } })); }
/// <summary> /// Processes an inbound data event. /// This is assumed to be invoked on an IOCP thread so a goal is to do as little as possible. /// </summary> public void HandleInboundDataEvent(InboundDataEvent e, Action <InboundDataEvent> returnInboundDataEvent) { #if DEBUG Interlocked.Increment(ref DebugRuntimeStats.in_de); #endif // Deserialize inbound payloads SCG.List <object> payloads = new SCG.List <object>(); try { using (var ms = new MemoryStream(e.Data, e.DataOffset, e.DataLength, false, true)) { while (ms.Position < ms.Length) { payloads.Add(Deserialize.From(ms)); } } } catch (Exception ex) { if (!isShutdown) { logger.Warn("Error at payload deserialize", ex); } return; } returnInboundDataEvent(e); #if DEBUG Interlocked.Add(ref DebugRuntimeStats.in_payload, payloads.Count); #endif // Categorize inbound payloads var acknowledgements = new SCG.List <AcknowledgementDto>(); var announcements = new SCG.List <AnnouncementDto>(); var reliablePackets = new SCG.List <PacketDto>(); var unreliablePackets = new SCG.List <PacketDto>(); foreach (var payload in payloads) { if (payload is AcknowledgementDto) { acknowledgements.Add((AcknowledgementDto)payload); } else if (payload is AnnouncementDto) { announcements.Add((AnnouncementDto)payload); } else if (payload is PacketDto) { // Filter packets not destined to us. var packet = (PacketDto)payload; if (!identity.Matches(packet.ReceiverId, IdentityMatchingScope.Broadcast)) { tossedCounter.Increment(); continue; } // Bin into reliable vs unreliable. if (packet.IsReliable()) { reliablePackets.Add(packet); } else { unreliablePackets.Add(packet); } } } // Process acks to prevent resends. foreach (var ack in acknowledgements) { #if DEBUG Interlocked.Increment(ref DebugRuntimeStats.in_ack); #endif acknowledgementCoordinator.ProcessAcknowledgement(ack); #if DEBUG Interlocked.Increment(ref DebugRuntimeStats.in_ack_done); #endif } // Process announcements as they are necessary for routing. foreach (var announcement in announcements) { #if DEBUG Interlocked.Increment(ref DebugRuntimeStats.in_ann); #endif HandleAnnouncement(e.RemoteInfo, announcement); } // Ack inbound reliable messages to prevent resends. foreach (var packet in reliablePackets) { #if DEBUG Interlocked.Increment(ref DebugRuntimeStats.in_out_ack); #endif var ack = AcknowledgementDto.Create(packet.Id); RoutingContext routingContext; if (routingContextsByPeerId.TryGetValue(packet.SenderId, out routingContext)) { routingContext.SendAcknowledgementAsync(packet.SenderId, ack).Forget(); } else { payloadSender.BroadcastAsync(ack).Forget(); } #if DEBUG Interlocked.Increment(ref DebugRuntimeStats.in_out_ack_done); #endif } // Test reliable packets' guids against bloom filter. var isNewByPacketId = duplicateFilter.TestPacketIdsAreNew(new HashSet <Guid>(reliablePackets.Select(p => p.Id))); var standalonePacketsToProcess = new SCG.List <PacketDto>(unreliablePackets); var chunksToProcess = new SCG.List <MultiPartChunkDto>(); foreach (var packet in reliablePackets) { // Toss out duplicate packets if (!isNewByPacketId[packet.Id]) { duplicateReceivesCounter.Increment(); continue; } // Bin into multipart chunk vs not var multiPartChunk = packet.Message.Body as MultiPartChunkDto; if (multiPartChunk != null) { multiPartChunksBytesReceivedAggregator.Put(multiPartChunk.BodyLength); chunksToProcess.Add(multiPartChunk); } else { standalonePacketsToProcess.Add(packet); } } // Kick off async stanadalone packet process on thread pool. foreach (var packet in standalonePacketsToProcess) { inboundMessageDispatcher.DispatchAsync(packet.Message).Forget(); } // Synchronously handle multipart chunk processing. foreach (var chunk in chunksToProcess) { multiPartPacketReassembler.HandleInboundMultiPartChunk(chunk); } }
/// <summary> /// Processes an inbound data event. /// This is assumed to be invoked on an IOCP thread so a goal is to do as little as possible. /// </summary> public void HandleInboundDataEvent(InboundDataEvent e, Action<InboundDataEvent> returnInboundDataEvent) { #if DEBUG Interlocked.Increment(ref DebugRuntimeStats.in_de); #endif // Deserialize inbound payloads SCG.List<object> payloads = new SCG.List<object>(); try { using (var ms = new MemoryStream(e.Data, e.DataOffset, e.DataLength, false, true)) { while (ms.Position < ms.Length) { payloads.Add(Deserialize.From(ms)); } } } catch (Exception ex) { if (!isShutdown) { logger.Warn("Error at payload deserialize", ex); } return; } returnInboundDataEvent(e); #if DEBUG Interlocked.Add(ref DebugRuntimeStats.in_payload, payloads.Count); #endif // Categorize inbound payloads var acknowledgements = new SCG.List<AcknowledgementDto>(); var announcements = new SCG.List<AnnouncementDto>(); var reliablePackets = new SCG.List<PacketDto>(); var unreliablePackets = new SCG.List<PacketDto>(); foreach (var payload in payloads) { if (payload is AcknowledgementDto) { acknowledgements.Add((AcknowledgementDto)payload); } else if (payload is AnnouncementDto) { announcements.Add((AnnouncementDto)payload); } else if (payload is PacketDto) { // Filter packets not destined to us. var packet = (PacketDto)payload; if (!identity.Matches(packet.ReceiverId, IdentityMatchingScope.Broadcast)) { tossedCounter.Increment(); continue; } // Bin into reliable vs unreliable. if (packet.IsReliable()) { reliablePackets.Add(packet); } else { unreliablePackets.Add(packet); } } } // Process acks to prevent resends. foreach (var ack in acknowledgements) { #if DEBUG Interlocked.Increment(ref DebugRuntimeStats.in_ack); #endif acknowledgementCoordinator.ProcessAcknowledgement(ack); #if DEBUG Interlocked.Increment(ref DebugRuntimeStats.in_ack_done); #endif } // Process announcements as they are necessary for routing. foreach (var announcement in announcements) { #if DEBUG Interlocked.Increment(ref DebugRuntimeStats.in_ann); #endif HandleAnnouncement(e.RemoteInfo, announcement); } // Ack inbound reliable messages to prevent resends. foreach (var packet in reliablePackets) { #if DEBUG Interlocked.Increment(ref DebugRuntimeStats.in_out_ack); #endif var ack = AcknowledgementDto.Create(packet.Id); RoutingContext routingContext; if (routingContextsByPeerId.TryGetValue(packet.SenderId, out routingContext)) { routingContext.SendAcknowledgementAsync(packet.SenderId, ack).Forget(); } else { payloadSender.BroadcastAsync(ack).Forget(); } #if DEBUG Interlocked.Increment(ref DebugRuntimeStats.in_out_ack_done); #endif } // Test reliable packets' guids against bloom filter. var isNewByPacketId = duplicateFilter.TestPacketIdsAreNew(new HashSet<Guid>(reliablePackets.Select(p => p.Id))); var standalonePacketsToProcess = new SCG.List<PacketDto>(unreliablePackets); var chunksToProcess = new SCG.List<MultiPartChunkDto>(); foreach (var packet in reliablePackets) { // Toss out duplicate packets if (!isNewByPacketId[packet.Id]) { duplicateReceivesCounter.Increment(); continue; } // Bin into multipart chunk vs not var multiPartChunk = packet.Message.Body as MultiPartChunkDto; if (multiPartChunk != null) { multiPartChunksBytesReceivedAggregator.Put(multiPartChunk.BodyLength); chunksToProcess.Add(multiPartChunk); } else { standalonePacketsToProcess.Add(packet); } } // Kick off async stanadalone packet process on thread pool. foreach (var packet in standalonePacketsToProcess) { inboundMessageDispatcher.DispatchAsync(packet.Message).Forget(); } // Synchronously handle multipart chunk processing. foreach (var chunk in chunksToProcess) { multiPartPacketReassembler.HandleInboundMultiPartChunk(chunk); } }
// Use this for initialization void Start() { // prime the GUID random number generator Guid.NewGuid(); GameObject lodSliderObj = GameObject.Find("LODSlider"); if (lodSliderObj != null) { Slider lodslider = lodSliderObj.GetComponent <Slider>(); this.LODCutoff = PlayerPrefs.GetFloat("worldLodSlider", 0.033f); lodslider.value = this.LODCutoff; Debug.Log("Read lodcutoff:" + LODCutoff); } charC = GameObject.Find("ThirdPersonController"); if (charC != null) { tpuc = charC.GetComponent <ThirdPersonUserControl>(); tpucRB = charC.GetComponent <Rigidbody>(); charC.SetActive(false); } GameObject dropdownObj = GameObject.Find("SpawnDropdown"); MAX_NODE_PER_FRAME = ProgramSettings.get("MAX_NODE_PER_FRAME", 15000); setCameraLoc(GameWorld.initialSpawn); map = CDRParse.getMap(GameWorld.worldName); if (dropdownObj != null) { dropdown = dropdownObj.GetComponent <Dropdown>(); zoneMeshes = GameObject.Find("ZoneMeshes"); zoneMeshes.SetActive(false); Material zoneBlockMaterial = Material.Instantiate(Resources.Load <Material>("borderzone")); zoneText = GameObject.Find("ZoneText").GetComponent <Text>(); foreach (Zone z in map.zones) { //Debug.Log("creating zone:" + z._113Key); SCG.List <Vector3> points = z.points; GameObject zone = new GameObject("zone:" + z._113Key); PolygonCollider2D p = zone.AddComponent <PolygonCollider2D>(); p.points = points.Select(x => new Vector2(x.x, x.z)).ToArray(); z.collider = p; GameObject zoneMesh = new GameObject("zone:" + z._113Key); if (z._113Key == 1802934646) { MeshFilter mf = zoneMesh.AddComponent <MeshFilter>(); MeshRenderer mr = zoneMesh.AddComponent <MeshRenderer>(); Mesh mesh = ExtrudeSprite.CreateMesh(p.points, -10000.2f, 10000.2f); mf.sharedMesh = mesh; mr.sharedMaterial = zoneBlockMaterial; zoneMesh.transform.SetParent(zoneMeshes.transform); zoneMesh.transform.localRotation = Quaternion.identity; zoneMesh.transform.localPosition = Vector3.zero; } } foreach (Scene z in map.scenes) { SCG.List <Vector3> points = z.points; GameObject zone = new GameObject("scene:" + z._114Key); PolygonCollider2D p = zone.AddComponent <PolygonCollider2D>(); p.points = points.Select(x => new Vector2(x.x, x.z)).ToArray(); z.collider = p; } dropdown.gameObject.SetActive(false); dropdown.options.Clear(); int startIndex = 0; int i = 0; foreach (WorldSpawn spawn in GameWorld.getSpawns()) { if (spawn.spawnName.Equals(GameWorld.initialSpawn.spawnName)) { startIndex = i; } DOption option = new DOption(spawn.worldName + " - " + spawn.spawnName + " - " + spawn.pos, false); dropdown.options.Add(option); i++; } dropdown.value = startIndex; dropdown.gameObject.SetActive(true); dropdown.GetComponent <FavDropDown>().doOptions(); dropdown.RefreshShownValue(); } if (bigMap != null) { bigMap.setWorld(GameWorld.worldName); bigMap.OnSpawnClick += (s) => { setCameraLoc(s); }; } }