增加流量监测和假种检测功能

Change-Id: I808ce14b6f08565f797f4681a6f72db9c730d011
diff --git a/src/main/java/tracker/DataCaptureProxy.java b/src/main/java/tracker/DataCaptureProxy.java
index cb66feb..1749421 100644
--- a/src/main/java/tracker/DataCaptureProxy.java
+++ b/src/main/java/tracker/DataCaptureProxy.java
@@ -66,14 +66,22 @@
                     if (uploaded != null && !uploaded.isEmpty()) {
                         int uploadValue = Integer.parseInt(uploaded);
                         if (uploadValue > 0) {
-                            tracker.AddUpLoad(passkey, uploadValue, infoHash);
+                            try {
+                                tracker.AddUpLoad(passkey, uploadValue, infoHash);
+                            } catch (javax.persistence.NoResultException e) {
+                                System.out.println("Skipping upload update: info_hash not found in database - " + infoHash);
+                            }
                         }
                     }
                     
                     if (downloaded != null && !downloaded.isEmpty()) {
                         int downloadValue = Integer.parseInt(downloaded);
                         if (downloadValue > 0) {
-                            tracker.AddDownload(passkey, downloadValue, infoHash);
+                            try {
+                                tracker.AddDownload(passkey, downloadValue, infoHash);
+                            } catch (javax.persistence.NoResultException e) {
+                                System.out.println("Skipping download update: info_hash not found in database - " + infoHash);
+                            }
                         }
                     }
                 } catch (NumberFormatException e) {
diff --git a/src/main/java/tracker/Tracker.java b/src/main/java/tracker/Tracker.java
index 1ac4d94..1b38806 100644
--- a/src/main/java/tracker/Tracker.java
+++ b/src/main/java/tracker/Tracker.java
@@ -16,7 +16,8 @@
 import com.querydsl.jpa.impl.JPAUpdateClause;
 import entity.*;
 import entity.config;
-
+import java.util.Scanner;
+import java.io.IOException;
 public class Tracker implements TrackerInterface {
     private final EntityManagerFactory emf;
     // 默认构造:产线数据库
@@ -55,7 +56,7 @@
             long delta = newTotal - sumSoFar;
             if (delta < 0L) {
                 tx.rollback();
-                return true;   // error: newTotal less than already recorded
+                return false;   // error: newTotal less than already recorded
             }
             if (delta == 0L) {
                 tx.rollback();
@@ -69,7 +70,7 @@
             rd.upload       = delta;
             rd.maxupload    = newTotal;
             em.persist(rd);
-
+            em.flush();
             // 4) 重新计算用户的总上传,确保与 TransRecord 完全一致
             Long totalUpload = em.createQuery(
                 "SELECT COALESCE(SUM(t.upload),0) FROM TransRecord t WHERE t.uploaduserid = :uid",
@@ -77,10 +78,29 @@
             )
             .setParameter("uid", userid)
             .getSingleResult();
+
+            Long PTuploadbefor = em.createQuery(
+                "SELECT t.upload FROM UserPT t WHERE t.userid = :uid",
+                Long.class
+            ).setParameter("uid", userid)
+            .getSingleResult();
+            
+        
             UserPT user = em.find(UserPT.class, userid);
             user.upload = totalUpload;
             em.merge(user);
+            em.flush();
             tx.commit();
+
+            Long PTuploadafter = em.createQuery(
+                "SELECT t.upload FROM UserPT t WHERE t.userid = :uid",
+                Long.class
+            ).setParameter("uid", userid)
+            .getSingleResult();
+
+            System.out.println("按回车继续...");
+            System.out.printf("thisadd:%d userptsofar:%d userptafter:%d totaluploadnow:%d delta:%d%n",upload, PTuploadbefor,PTuploadafter, totalUpload,delta);
+            System.out.println("按回车继续...");
             return false;      // success
         } catch (RuntimeException ex) {
             if (tx.isActive()) tx.rollback();
@@ -137,7 +157,7 @@
             List<SeedHash> shl = qsh.getResultList();
             if (shl.isEmpty()) {
                 System.out.println("seed没有被记录");
-                return true;
+                return false;
             }
             String seedid = shl.get(0).seedId;
 
@@ -202,7 +222,7 @@
             long current = qcurr.getSingleResult();
             if (downloadLong > current) {
                 em.close();
-                return true;
+                return false;
             }
             // 2. 执行减法更新
             EntityTransaction tx = em.getTransaction();
@@ -271,14 +291,16 @@
             Path target = storageDir.resolve(seedid + "_" + filename);
             Files.copy(TTorent.toPath(), target, StandardCopyOption.REPLACE_EXISTING);
 
-            // attempt to parse infoHash, but don’t fail if parsing fails
+            // attempt to parse infoHash, but don't fail if parsing fails
             String infoHash = null;
             try {
                 byte[] torrentData = Files.readAllBytes(target);
                 Bencode bencode = new Bencode();
                 @SuppressWarnings("unchecked")
-                Map<String,Object> meta = (Map<String,Object>) bencode.decode(torrentData, Type.DICTIONARY);
-                byte[] infoBytes = bencode.encode((Map<String,Object>) meta.get("info"));
+                Map<String,Object> meta = bencode.decode(torrentData, Type.DICTIONARY);
+                @SuppressWarnings("unchecked")
+                Map<String,Object> info = (Map<String,Object>) meta.get("info");
+                byte[] infoBytes = bencode.encode(info);
                 MessageDigest sha1 = MessageDigest.getInstance("SHA-1");
                 byte[] digest = sha1.digest(infoBytes);
                 StringBuilder sb = new StringBuilder();